| // 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}" |
| |
| build_opts: ["-sverilog -full64 -licqueue -kdb -ntb_opts uvm-1.2", |
| "-timescale=1ns/1ps", |
| "-Mdir={build_ex}.csrc", |
| "-o {build_ex}", |
| "-f {sv_flist}", |
| // 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", |
| // 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 -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 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 |
| "-debug_access+f", |
| // 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", |
| ] |
| |
| 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: ["-full64", |
| "+urg+lic+wait", |
| "-nocheck", |
| "-noreport", |
| "-flex_merge drop", |
| "-group merge_across_scopes", |
| "-parallel", |
| "-parallel_split 20", |
| // 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: ["-full64", |
| "+urg+lic+wait", |
| "-dir {cov_merge_db_dir}", |
| "-group instcov_for_score", |
| "-line nocasedef", |
| "-format both", |
| "-elfile {vcs_cov_excl_files}", |
| "-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=1ns/1ps"] |
| |
| // 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: [ |
| { FLEXLM_DIAGNOSTICS: 4 }, |
| { 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>. |
| vcs_cov_cfg_file: "" |
| |
| // Supply the cov configuration file for assertions. |
| // Note that this needs to be set as -cm_assert_hier <file>. |
| vcs_cov_assert_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_waves |
| is_sim_mode: 1 |
| build_opts: ["-debug_access+all"] |
| } |
| { |
| 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}", |
| // Set the assert coverage hierarchy |
| "{vcs_cov_assert_cfg_file}", |
| // Cover all continuous assignments |
| "-cm_line contassign", |
| // Dump toggle coverage on mdas, array of structs and on ports only |
| "-cm_tgl mda+structarr+portsonly", |
| // Ignore initial blocks for coverage |
| "-cm_report noinitial", |
| // Filter unreachable/statically constant blocks |
| "-cm_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}"] |
| |
| 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={dv_root}/tools/vcs/xprop.cfg"] |
| } |
| { |
| 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"] |
| } |
| ] |
| } |