| // 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"] | |
| } | |
| ] | |
| } |