|  | // 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}", | 
|  | // 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", | 
|  | // 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 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: [ | 
|  | { 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 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: ["-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}", | 
|  | "-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", | 
|  | // 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"] | 
|  | } | 
|  | ] | 
|  | } |