|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  | { | 
|  | build_cmd:  "{job_prefix} xrun" | 
|  | run_cmd:    "{job_prefix} xrun" | 
|  |  | 
|  | build_db_dir: "{build_dir}/xcelium.d" | 
|  |  | 
|  | build_opts: ["-elaborate -64bit -sv", | 
|  | // Wait to acquire a license. | 
|  | "-licqueue", | 
|  | // TODO: duplicate primitives between OT and Ibex #1231 | 
|  | "-ALLOWREDEFINITION", | 
|  | "-messages -errormax 50", | 
|  | "-timescale {timescale}", | 
|  | "-f {sv_flist}", | 
|  | "-uvmhome CDNS-1.2", | 
|  | // Specify the library name for the run step to use. | 
|  | "-xmlibdirname {build_db_dir}", | 
|  | // List multiple tops for the simulation. Prepend each top level with `-top`. | 
|  | "{eval_cmd} echo {sim_tops} | sed -E 's/(\\S+)/-top \\1/g'", | 
|  | // Set the top level elaborated entity (snapshot name) correctly since there are | 
|  | // multiple tops. | 
|  | "-snapshot {tb}", | 
|  | // for uvm_hdl_* used by csr backdoor | 
|  | "-access +rw", | 
|  | // This is to fix a timescale issue due to using `resetall to reset timescale and | 
|  | // `-sv` compile option. #7178 | 
|  | "-enable_strict_timescale", | 
|  | // Use this to conditionally compile for Xcelium (example: LRM interpretations differ | 
|  | // across tools). | 
|  | "+define+XCELIUM", | 
|  | // Suppress printing of the copyright banner. | 
|  | "-nocopyright", | 
|  | // Ignore "timescale is not specified for the package" warning | 
|  | "-nowarn TSNSPK", | 
|  | // Ignore "IEEE 1800-2009 SystemVerilog simulation semantics" warning | 
|  | "-nowarn DSEMEL", | 
|  | // Ignore hierarchial ref warnings in interfaces | 
|  | "-nowarn CUVIHR", | 
|  | // Ignore warning "Potentially reversed dist range may cause it to be treated as | 
|  | // empty". This is thrown when and expression like `var - 1` is added to a | 
|  | // randomization distribution, which can potentially be a negative value. | 
|  | "-nowarn REVRNG", | 
|  | // Ignore warning "Include directory <path> given but not used". This is benign. | 
|  | "-nowarn SPDUSD", | 
|  | // Needed for including "secded_enc.h". | 
|  | "-I{build_dir}/src/lowrisc_dv_secded_enc_0", | 
|  | // This warning is thrown when a scalar enum variable is assigned to an enum array. | 
|  | // Other tools (e.g., FPV) treat such assignments as an error, hence we bump it to | 
|  | // an error in simulation so that this can be caught early in CI. | 
|  | "-NCError ENUMERR" | 
|  | ] | 
|  |  | 
|  | // We want to allow the possibility of passing no test or no test sequence. Unfortunately, | 
|  | // Xcelium generates an error (*E,OPTP2ND) if you pass an empty plusarg. To avoid doing so, these | 
|  | // two variables expand to e.g. "+UVM_TESTNAME=foo" if we have a test and the empty string if | 
|  | // not. | 
|  | uvm_testname_plusarg: "{eval_cmd} echo {uvm_test} | sed -E 's/(.+)/+UVM_TESTNAME=\\1/'" | 
|  | uvm_testseq_plusarg: "{eval_cmd} echo {uvm_test_seq} | sed -E 's/(.+)/+UVM_TEST_SEQ=\\1/'" | 
|  |  | 
|  | run_opts:   ["-input {run_script}", | 
|  | // Suppress printing of the copyright banner. | 
|  | "-nocopyright", | 
|  | // Wait to acquire a license. | 
|  | "-licqueue", | 
|  | "-64bit -xmlibdirname {build_db_dir}", | 
|  | // Use the same snapshot name set during the build step. | 
|  | "-r {tb}", | 
|  | "+SVSEED={seed}", | 
|  | "{uvm_testname_plusarg}", | 
|  | "{uvm_testseq_plusarg}", | 
|  | // Ignore "IEEE 1800-2009 SystemVerilog simulation semantics" warning | 
|  | "-nowarn DSEM2009", | 
|  | ] | 
|  |  | 
|  | // Vars that need to exported to the env. | 
|  | exports: [ | 
|  | // Poll for an available license in all servers. | 
|  | { CDS_LIC_QUEUE_POLL: 1 }, | 
|  |  | 
|  | // Poll for an available license every 1 min. | 
|  | { CDS_LIC_QUEUE_POLL_INT: 60 }, | 
|  |  | 
|  | // X-prop related: these were suggested by Xcelium as warnings during the build time. | 
|  | // These enable array corruption when the index is out of range or invalid. | 
|  | { VL_ENABLE_INVALID_IDX_XPROP: 1 }, | 
|  | { VL_ENABLE_OUTOFRANGE_IDX_XPROP: 1 }, | 
|  |  | 
|  | // Export the cov_report path so that the tcl file can read these as env vars. | 
|  | { cov_merge_db_dir: "{cov_merge_db_dir}" }, | 
|  | { cov_report_dir: "{cov_report_dir}" } | 
|  |  | 
|  | // Export unr related paths for make | 
|  | {cov_unr_dir:     "{cov_unr_dir}" } | 
|  | // Add an additional single quotation because `cov_merge_cmd` has an empty space, it will cause | 
|  | // trouble when exporting the entire command in the environment. | 
|  | {cov_merge_cmd: "{cov_merge_cmd}"} | 
|  |  | 
|  | // job prefix | 
|  | {job_prefix: "{job_prefix}"} | 
|  |  | 
|  | ] | 
|  |  | 
|  | // Supported wave dumping formats (in order of preference). | 
|  | supported_wave_formats: ["shm", "fsdb", "vcd"] | 
|  |  | 
|  | // Default tcl script used when running the sim. Override if needed. | 
|  | run_script: "{dv_root}/tools/sim.tcl" | 
|  |  | 
|  | // Coverage related. | 
|  | // By default, collect all coverage metrics: block:expr:fsm:toggle:functional. | 
|  | cov_metrics: all | 
|  |  | 
|  | // Supply the cov configuration file. | 
|  | // Note that this needs to be set as -covfile <file>. | 
|  | xcelium_cov_cfg_file: "" | 
|  |  | 
|  | // Supply the cov exclusion tcl script - passed on to IMC using the -init switch. | 
|  | xcelium_cov_excl_script: "" | 
|  |  | 
|  | // Supply the cov refinement files - passed on to IMC using the -load_refinement switch. | 
|  | xcelium_cov_refine_files: [] | 
|  |  | 
|  | // Set the coverage directories. | 
|  | cov_work_dir: "{scratch_path}/coverage" | 
|  | cov_db_dir:   "{cov_work_dir}/{build_mode}" | 
|  |  | 
|  | // Individual test specific coverage data - this will be deleted if the test fails | 
|  | // so that coverage from failiing tests is not included in the final report. | 
|  | cov_db_test_dir_name: "{run_dir_name}.{seed}" | 
|  | cov_db_test_dir:      "{cov_db_dir}/{cov_db_test_dir_name}" | 
|  |  | 
|  | // Merging coverage. | 
|  | // It is constructed by the tool itself. | 
|  | cov_merge_dir:    "{scratch_path}/cov_merge" | 
|  | cov_merge_db_dir: "{cov_merge_dir}/merged" | 
|  | cov_merge_cmd:    "imc" | 
|  | cov_merge_opts:   ["-64bit", | 
|  | "-licqueue", | 
|  | "-exec {dv_root}/tools/xcelium/cov_merge.tcl"] | 
|  |  | 
|  | // Generate covreage reports in text as well as html. | 
|  | cov_report_dir:   "{scratch_path}/cov_report" | 
|  | cov_report_cmd:   "{job_prefix} imc" | 
|  | cov_report_opts:  ["-64bit", | 
|  | "-licqueue", | 
|  | "-load {cov_merge_db_dir}", | 
|  | " {eval_cmd} echo {xcelium_cov_excl_script} | sed -E 's/(\\S+)/-init \\1/g' ", | 
|  | " {eval_cmd} echo {xcelium_cov_refine_files} | sed -E 's/(\\S+)/-load_refinement \\1/g' ", | 
|  | "-exec {dv_root}/tools/xcelium/cov_report.tcl"] | 
|  | cov_report_txt:   "{cov_report_dir}/cov_report.txt" | 
|  | cov_report_page:  "index.html" | 
|  |  | 
|  | // Analyzing coverage - this is done by invoking --cov-analyze switch. It opens up the | 
|  | // GUI for visual analysis. | 
|  | cov_analyze_dir:  "{scratch_path}/cov_analyze" | 
|  | cov_analyze_cmd:  "{job_prefix} imc" | 
|  | cov_analyze_opts: ["-64bit", | 
|  | "-licqueue", | 
|  | "-load {cov_merge_db_dir}", | 
|  | " {eval_cmd} echo {xcelium_cov_excl_script} | sed -E 's/(\\S+)/-init \\1/g' ", | 
|  | " {eval_cmd} echo {xcelium_cov_refine_files} | sed -E 's/(\\S+)/-load_refinement \\1/g' "] | 
|  |  | 
|  | cov_unr_dir:     "{scratch_path}/cov_unr" | 
|  |  | 
|  | // not needed we can reuse the last build snapshot | 
|  | cov_unr_build_opts:[] | 
|  | cov_unr_build_cmd:[] | 
|  |  | 
|  | cov_unr_run_cmd: "{job_prefix} xrun" | 
|  |  | 
|  |  | 
|  | cov_unr_run_opts: [// use xrun in UNR mode | 
|  | "-unr", | 
|  | // JasperGold switch (use formal) | 
|  | "-jg", | 
|  | // use the same snapshot as used for regression | 
|  | "-r {tb}", | 
|  | // pointer to the merged coverage data from the regression | 
|  | "-covdb {cov_merge_db_dir}", | 
|  | // what metrics to use | 
|  | "-jg_coverage {cov_metrics}", | 
|  | "-64bit", | 
|  | "-xmlibdirname {build_db_dir}", | 
|  | // overwrite previous results | 
|  | "-covoverwrite", | 
|  | "-inst_top {dut_instance}", | 
|  | // UNR Configurations | 
|  | "-input {xcelium_unr_cfg_file} "] | 
|  |  | 
|  |  | 
|  | // pass and fail patterns | 
|  | build_fail_patterns: ["\\*E.*$"] | 
|  | run_fail_patterns:   ["\\*E.*$"] // Null pointer error | 
|  |  | 
|  | build_modes: [ | 
|  | { | 
|  | name: xcelium_gui | 
|  | is_sim_mode: 1 | 
|  | build_opts: ["-createdebugdb", "-access +c"] | 
|  | run_opts: ["-gui"] | 
|  | } | 
|  | { | 
|  | name: xcelium_waves | 
|  | is_sim_mode: 1 | 
|  | build_opts: ["-access +c"] | 
|  | } | 
|  | { | 
|  | name: xcelium_waves_off | 
|  | is_sim_mode: 1 | 
|  | build_opts: [] | 
|  | } | 
|  | { | 
|  | name: xcelium_cov | 
|  | is_sim_mode: 1 | 
|  | build_opts: [// Enable the required cov metrics. | 
|  | "-coverage {cov_metrics}", | 
|  | // Limit the scope of coverage collection to the DUT. | 
|  | "-covdut {dut}", | 
|  | // Set the coverage configuration file | 
|  | "-covfile {xcelium_cov_cfg_file}", | 
|  | // Don't warn about the switches we set that will be default in future releases. | 
|  | "-nowarn COVDEF", | 
|  | ] | 
|  | run_opts:   [// Put the coverage model (*.ucm) and the database (*.ucd) together. | 
|  | "-covmodeldir {cov_db_test_dir}", | 
|  | // Coverage database output location. | 
|  | "-covworkdir {cov_work_dir}", | 
|  | // Set the scope to the build mode name. | 
|  | "-covscope {build_mode}", | 
|  | // Test coverage dir name to create under cov_db_dir. | 
|  | "-covtest {cov_db_test_dir_name}", | 
|  | // Overwrite the coverage data of a specific test/seed if it already exists. | 
|  | "-covoverwrite"] | 
|  | } | 
|  | // TODO support profile for xcelium | 
|  | { | 
|  | name: xcelium_profile | 
|  | is_sim_mode: 1 | 
|  | build_opts: ["-perfstat"] | 
|  | run_opts:   ["-perfstat", "-perflog perfstat.log"] | 
|  | } | 
|  | { | 
|  | name: xcelium_xprop | 
|  | is_sim_mode: 1 | 
|  | build_opts: ["-xprop F -xverbose"] | 
|  | } | 
|  | { | 
|  | // TODO: Add build and run options to enable zero delay loop detection. | 
|  | name: xcelium_loopdetect | 
|  | is_sim_mode: 1 | 
|  | build_opts: [] | 
|  | run_opts:   [] | 
|  | } | 
|  | ] | 
|  | } |