| // 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} vcs" |
| build_ex: "{build_dir}/simv" |
| run_cmd: "{job_prefix} {build_ex}" |
| |
| // This option enables the following: (needed for uvm_hdl_*) |
| // - Read capability on registers, variables, and nets |
| // - Write (deposit) capability on registers and variables |
| // - Force capability on registers, variables, and nets |
| // TODO Trim this flag since +f hurts performance. |
| vcs_build_opt_debug_access: "-debug_access+f" |
| post_flist_opts: "" |
| build_opts: ["-sverilog -full64 -licqueue -ntb_opts uvm-1.2", |
| "-timescale={timescale}", |
| "-Mdir={build_ex}.csrc", |
| "-o {build_ex}", |
| "-f {sv_flist}", |
| "{post_flist_opts}", |
| // Enable LCA features. It does not require separate licenses. |
| "-lca", |
| // List multiple tops for the simulation. Prepend each top level with `-top`. |
| "{eval_cmd} echo {sim_tops} | sed -E 's/(\\S+)/-top \\1/g'", |
| "+incdir+{build_dir}", |
| // Turn on warnings for non-void functions called with return values ignored |
| "+warn=SV-NFIVC", |
| "+warn=noUII-L", |
| // Disable unnecessary LCA warning. |
| "+warn=noLCA_FEATURES_ENABLED", |
| // Disable warnings about bind directive not being applied. |
| "+warn=noBNA", |
| // Below option required for $error/$fatal system calls |
| "-assert svaext", |
| // Force unique and priority to evaluate compliance checking only on the stable |
| // and final value of the selection input at the end of a simulation timestep. |
| // See https://github.com/lowRISC/ibex/issues/845. |
| "-xlrm uniq_prior_final", |
| // Force DPI-C compilation in C99 mode. The -fno-extended-identifiers flag tells g++ |
| // not to worry about unicode. For some bizarre reason, the VCS DPI code contains |
| // preprocessor macros with smart quotes, which causes GCC 10.2 and later to choke |
| // otherwise. The double-escaped quotes are because this needs to go inside a string |
| // that gets passed to Make (stripping one level of quotes), and then needs to |
| // result in an argument with an embedded space (the other one). |
| "-CFLAGS --std=c99 -CFLAGS -fno-extended-identifiers", |
| // C++11 standard is enforced for all sources, including the DPI-C constructs. |
| // TODO, may need to update to c++14 to meet our requirements |
| // Refer to https://docs.opentitan.org/doc/ug/install_instructions |
| "-CFLAGS --std=c++11", |
| // Without this magic LDFLAGS argument below, we get compile time errors with |
| // VCS on Google Linux machines that look like this: |
| // .../libvcsnew.so: undefined reference to `snpsReallocFunc' |
| // .../libvcsnew.so: undefined reference to `snpsCheckStrdupFunc' |
| // .../libvcsnew.so: undefined reference to `snpsGetMemBytes' |
| "-LDFLAGS -Wl,--no-as-needed", |
| // This option is needed for uvm_hdl_*, when it accesses the array under `celldefine |
| "-debug_region=cell+lib", |
| "{vcs_build_opt_debug_access}", |
| // Use this to conditionally compile for VCS (example: LRM interpretations differ |
| // across tools). |
| "+define+VCS", |
| // Upgrade below warnings to errors to make VCS more strict on syntax to avoid |
| // having issue with other simulators but passing with VCS |
| // |
| // Identifier previously declared |
| "-error=IPDW", |
| // Input Supply Port with no driver |
| "-error=UPF_ISPND", |
| // Invalid generic or parameter assignment |
| "-error=IGPA", |
| // Class scope used outside of class |
| "-error=PCSRMIO", |
| // Attempt to override undefined parameter |
| "-error=AOUP", |
| // Unbound component |
| "-error=ELW_UNBOUND", |
| // Illegal Use of Wildcard Index |
| "-error=IUWI", |
| // Index into non-array variable |
| "-error=INAV", |
| // Illegal Static Cast |
| "-error=SV-ISC", |
| // Obsolete System Verilog feature |
| "-error=OSVF-NPVIUFPI", |
| // Duplicate port in module instantiation |
| "-error=DPIMI", |
| // Identifier in ANSI port declaration |
| "-error=IPDASP", |
| // File not found |
| "-error=CM-HIER-FNF", |
| // Concatenations with unsized constants |
| "-error=CWUC", |
| // More arguments than needed |
| "-error=MATN", |
| // Specifying negative delays is invalid |
| "-error=STASKW_NDTAZ1", |
| // Too many parameter overrides |
| "-error=TMPO", |
| // Class objects must not hide other class members due to same name |
| "-error=SV-OHCM", |
| // ENUMASSIGN issues can cause LEC warnings later down the road (see #10083 |
| // and #10952 for context). The warning is therefore promoted to an error |
| // in simulations in order to catch this as early as possible. |
| "-error=ENUMASSIGN", |
| // Tasks must not be enabled in functions. Other tools do not allow this. |
| "-error=TEIF" |
| ] |
| |
| run_opts: ["-licqueue", |
| "-ucli -do {run_script}", |
| "+ntb_random_seed={seed}", |
| // Disable the display of the SystemVerilog assert and cover statement summary |
| // at the end of simulation. This summary is list of assertions that started but |
| // did not finish because the simulation terminated, or assertions that did not |
| // fire at all. The latter is analyzed anyway in the collected coverage. Neither |
| // of these is useful in regular simulations. |
| "-assert nopostproc", |
| "+UVM_TESTNAME={uvm_test}", |
| "+UVM_TEST_SEQ={uvm_test_seq}"] |
| |
| // Supported wave dumping formats (in order of preference). |
| supported_wave_formats: ["fsdb", "vpd"] |
| |
| // Default tcl script used when running the sim. Override if needed. |
| run_script: "{dv_root}/tools/sim.tcl" |
| |
| // Coverage related. |
| cov_db_dir: "{scratch_path}/coverage/{build_mode}.vdb" |
| |
| // 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}/snps/coverage/db/testdata/{cov_db_test_dir_name}" |
| |
| // Merging coverage. |
| // "cov_db_dirs" is a special variable that appends all build directories in use. |
| // It is constructed by the tool itself. |
| cov_merge_dir: "{scratch_path}/cov_merge" |
| cov_merge_db_dir: "{cov_merge_dir}/merged.vdb" |
| cov_merge_cmd: "{job_prefix} urg" |
| cov_merge_opts: ["-lca", |
| "-full64", |
| // No need of generating report when merging coverage. |
| "-noreport", |
| // Merge results from tests in parallel. |
| "-parallel", |
| "-parallel_split 20", |
| "-parallel_temproot {cov_merge_dir}", |
| "+urg+lic+wait", |
| // Merge same assert instances found in different VDBs. |
| "-merge_across_libs", |
| // This enables grading on the merged vdb. |
| "-show tests", |
| // Enable union mode of flexible merging for covergroups. |
| "-flex_merge union", |
| // Use cov_db_dirs var for dir args; append -dir in front of each |
| "{eval_cmd} echo {cov_db_dirs} | sed -E 's/(\\S+)/-dir \\1/g'", |
| "-dbname {cov_merge_db_dir}"] |
| |
| // Generate coverage reports in text as well as html. |
| cov_report_dir: "{scratch_path}/cov_report" |
| cov_report_cmd: "{job_prefix} urg" |
| cov_report_opts: ["-lca", |
| "-full64", |
| "+urg+lic+wait", |
| // Lists all the tests that covered a given object. |
| "-show tests", |
| // Enable test grading using the "index" scheme, and the |
| // generation of the list of contributing tests with |
| // "testfile". |
| "-grade index testfile", |
| // Use simple ratio of total covered bins over total bins across cps & crs, |
| "-group ratio", |
| // Follow LRM naming conventions for array bins. |
| "-group lrm_bin_name", |
| // Compute overall coverage for per-instance covergroups individually rather |
| // than cumulatively. |
| "-group instcov_for_score", |
| "-dir {cov_merge_db_dir}", |
| "-line nocasedef", |
| "-format both", |
| // Prepend each el file with `-elfile`. |
| "{eval_cmd} echo {vcs_cov_excl_files} | sed -E 's/(\\S+)/-elfile \\1/g'", |
| "-report {cov_report_dir}"] |
| cov_report_txt: "{cov_report_dir}/dashboard.txt" |
| cov_report_page: "dashboard.html" |
| |
| // UNR related. |
| // All code coverage, assert isn't supported |
| cov_unr_metrics: "line+cond+fsm+tgl+branch" |
| cov_unr_dir: "{scratch_path}/cov_unr" |
| |
| cov_unr_common_build_opts: ["-sverilog -full64 -licqueue -ntb_opts uvm-1.2", |
| "-timescale={timescale}"] |
| |
| // Use recommended UUM (Unified usage model) 3 steps flow. The other flow defines macro |
| // "SYNTHESIS", which we have used in design |
| cov_unr_build_cmd: [// Step 1 |
| "{job_prefix} vlogan {cov_unr_common_build_opts} &&", |
| // Step 2 |
| "{job_prefix} vlogan {cov_unr_common_build_opts}", |
| // grep all defines from {build_opts} from step 2 |
| '''{eval_cmd} opts=`echo {build_opts}`; defines=; d=; \ |
| for o in $opts; \ |
| do \ |
| d=`echo $o | grep -o '+define+.*'`; \ |
| defines="$defines $d"; \ |
| done; \ |
| echo $defines |
| ''', |
| "-f {sv_flist} &&", |
| // Step 3 |
| "{job_prefix} vcs {cov_unr_common_build_opts}"] |
| cov_unr_build_opts: ["-cm {cov_unr_metrics}", |
| "{vcs_cov_cfg_file}", |
| "-unr={vcs_unr_cfg_file}", |
| "{dut}"] |
| |
| cov_unr_run_cmd: ["{job_prefix} ./unrSimv"] |
| cov_unr_run_opts: ["-unr"] |
| |
| // 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} verdi" |
| cov_analyze_opts: ["-cov", |
| "-covdir {cov_merge_db_dir}", |
| "-line nocasedef" |
| "-elfile {vcs_cov_excl_files}"] |
| |
| // Vars that need to exported to the env. |
| exports: [ |
| { VCS_LICENSE_WAIT: 1 }, |
| { VCS_ARCH_OVERRIDE: "linux" }, |
| { VCS_LIC_EXPIRE_WARNING: 1 } |
| ] |
| |
| // Defaults for VCS |
| // By default, collect all coverage metrics. |
| cov_metrics: "line+cond+fsm+tgl+branch+assert" |
| |
| // Supply the cov configuration file. |
| // Note that this needs to be set as `-cm_hier <file>`. |
| // Include hierarchies for both code coverage and assertions. |
| vcs_cov_cfg_file: "" |
| |
| // Supply cov configuration file for -cm_fsmresetfilter. |
| vcs_fsm_reset_cov_cfg_file: "" |
| |
| // Supply the cov exclusion files. |
| vcs_cov_excl_files: [] |
| |
| // pass and fail patterns |
| build_fail_patterns: ["^Error-.*$"] |
| run_fail_patterns: ["^Error-.*$"] // Null pointer error |
| |
| build_modes: [ |
| { |
| name: vcs_gui |
| is_sim_mode: 1 |
| build_opts: ["-debug_access+all+reverse"] |
| run_opts: ["-gui", "-l {run_dir}/simv.log"] |
| } |
| { |
| name: vcs_waves |
| is_sim_mode: 1 |
| build_opts: [// Enable generating Verdi Knowledge Database |
| "-kdb", |
| "-debug_access"] |
| } |
| { |
| name: vcs_waves_off |
| is_sim_mode: 1 |
| build_opts: [// disable dumping assertion failures to improve runtime performance |
| "-assert novpi+dbgopt"] |
| } |
| { |
| name: vcs_cov |
| is_sim_mode: 1 |
| build_opts: [// Enable the required cov metrics |
| "-cm {cov_metrics}", |
| // Set the coverage hierarchy |
| "{vcs_cov_cfg_file}", |
| "-cm_common_hier", |
| // Cover all continuous assignments |
| "-cm_line contassign", |
| // Dump toggle coverage on mdas, array of structs and on ports only |
| "-cm_tgl mda+structarr+portsonly", |
| // Report condition coverage within tasks, functions and for loops. |
| "-cm_cond for+tf", |
| // Ignore initial blocks for coverage |
| "-cm_report noinitial", |
| // Filter unreachable/statically constant blocks. seqnoconst does a more |
| // sophisticated analysis including NBA / assignment with delays. |
| "-cm_seqnoconst", |
| // Creates a constfile.txt indicating a list of detected constants. |
| "-diag noconst" |
| // Don't count coverage that's coming from zero-time glitches |
| "-cm_glitch 0", |
| // Ignore warnings about not applying cm_glitch to path and FSM |
| "+warn=noVCM-OPTIGN", |
| // Coverage database output location |
| "-cm_dir {cov_db_dir}", |
| // The following option is to improve runtime performance |
| "-Xkeyopt=rtopt", |
| // Exclude FSM transitions that can only happen on reset |
| "-cm_fsmresetfilter {vcs_fsm_reset_cov_cfg_file}", |
| ] |
| |
| run_opts: [// Enable the required cov metrics |
| "-cm {cov_metrics}", |
| // Same directory as build |
| "-cm_dir {cov_db_dir}", |
| // Don't output cm.log which can be quite large |
| "-cm_log /dev/null", |
| // Provide a name to the coverage collected for this test |
| "-cm_name {cov_db_test_dir_name}"] |
| } |
| { |
| name: vcs_xprop |
| is_sim_mode: 1 |
| build_opts: ["-xprop={vcs_xprop_cfg_file}", |
| // Enable xmerge mode specific performance optimization |
| "-xprop=mmsopt"] |
| } |
| { |
| name: vcs_profile |
| is_sim_mode: 1 |
| build_opts: ["-simprofile"] |
| run_opts: ["-simprofile {profile}"] |
| } |
| { |
| name: vcs_loopdetect |
| is_sim_mode: 1 |
| build_opts: ["+vcs+loopreport", "+vcs+loopdetect"] |
| run_opts: ["+vcs+loopreport", "+vcs+loopdetect"] |
| } |
| ] |
| } |