Add Random Constraints to Sequences in UVM Testbench
This example shows how to add constrained random verification to a universal verification methodology (UVM) testbench generated from Simulink®. Both Simulink parameters and input ports to the stimulus generation results in randomizable sequence class data members in the UVM testbench. Through standard UVM class inheritance and factory overrides, the design verification engineer can add new and valuable constrained random test cases to their UVM test suite.
For a description of the design and the background on generating a UVM testbench, see the example Generate Parameterized UVM Testbench from Simulink.
Generate UVM Testbench
First, open the project and model.
openProject('pulsedetector_proj'); model = 'pulsedetector_tb'; open_system(model);
To generate the default UVM testbench for this example, execute:
design = [model '/PulseDetector']; sequence = [model '/GenPulse']; scoreboard = [model '/CheckDetection']; predictor = [model '/PulseDetectorRef']; driver = [model '/InputDriver']; monitor = [model '/OutputMonitor']; uvmbuild(design, sequence, scoreboard, Predictor=predictor, Driver=driver, Monitor=monitor);
### Starting DPI subsystem generation for UVM test bench ### Starting build procedure for model: PulseDetector ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper PulseDetector_dpi.h ### Generating DPI C Wrapper PulseDetector_dpi.c ### Generating UVM module package PulseDetector_dpi_pkg.sv ### Generating SystemVerilog module PulseDetector_dpi.sv ### Generating makefiles for: PulseDetector_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: PulseDetector Build Summary Top model targets: Model Build Reason Status Build Duration ================================================================================================================ PulseDetector Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 10.246s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.715s ### Starting build procedure for model: GenPulse ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper GenPulse_dpi.h ### Generating DPI C Wrapper GenPulse_dpi.c ### Generating UVM module package GenPulse_dpi_pkg.sv ### Generating SystemVerilog module GenPulse_dpi.sv ### Generating makefiles for: GenPulse_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: GenPulse Build Summary Top model targets: Model Build Reason Status Build Duration =========================================================================================================== GenPulse Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 11.558s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 11.934s ### Starting build procedure for model: InputDriver ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper InputDriver_dpi.h ### Generating DPI C Wrapper InputDriver_dpi.c ### Generating UVM module package InputDriver_dpi_pkg.sv ### Generating SystemVerilog module InputDriver_dpi.sv ### Generating makefiles for: InputDriver_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: InputDriver Build Summary Top model targets: Model Build Reason Status Build Duration ============================================================================================================== InputDriver Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 7.8962s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 8.2789s ### Starting build procedure for model: OutputMonitor ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper OutputMonitor_dpi.h ### Generating DPI C Wrapper OutputMonitor_dpi.c ### Generating UVM module package OutputMonitor_dpi_pkg.sv ### Generating SystemVerilog module OutputMonitor_dpi.sv ### Generating makefiles for: OutputMonitor_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: OutputMonitor Build Summary Top model targets: Model Build Reason Status Build Duration ================================================================================================================ OutputMonitor Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 7.132s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 7.5784s ### Starting build procedure for model: CheckDetection ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper CheckDetection_dpi.h ### Generating DPI C Wrapper CheckDetection_dpi.c ### Generating UVM module package CheckDetection_dpi_pkg.sv ### Generating SystemVerilog module CheckDetection_dpi.sv ### Generating makefiles for: CheckDetection_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: CheckDetection Build Summary Top model targets: Model Build Reason Status Build Duration ================================================================================================================= CheckDetection Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 14.106s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 14.473s ### Starting build procedure for model: PulseDetectorRef ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper PulseDetectorRef_dpi.h ### Generating DPI C Wrapper PulseDetectorRef_dpi.c ### Generating UVM module package PulseDetectorRef_dpi_pkg.sv ### Generating SystemVerilog module PulseDetectorRef_dpi.sv ### Generating makefiles for: PulseDetectorRef_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: PulseDetectorRef Build Summary Top model targets: Model Build Reason Status Build Duration =================================================================================================================== PulseDetectorRef Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 10.369s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.785s ### Starting UVM test bench generation for model: pulsedetector_tb ### Generating UVM transaction object ./uvm_build/pulsedetector_tb_uvm_testbench/scoreboard/mw_PulseDetector_scoreboard_trans.sv ### Generating UVM interface ./uvm_build/pulsedetector_tb_uvm_testbench/uvm_artifacts/mw_PulseDetector_if.sv ### Generating UVM sequence ./uvm_build/pulsedetector_tb_uvm_testbench/sequence/mw_PulseDetector_sequence.sv ### Generating UVM sequencer ./uvm_build/pulsedetector_tb_uvm_testbench/sequence/mw_PulseDetector_sequencer.sv ### Generating UVM sequence transaction ./uvm_build/pulsedetector_tb_uvm_testbench/sequence/mw_PulseDetector_sequence_trans.sv ### Generating UVM driver ./uvm_build/pulsedetector_tb_uvm_testbench/driver/mw_PulseDetector_driver.sv ### Generating UVM monitor ./uvm_build/pulsedetector_tb_uvm_testbench/monitor/mw_PulseDetector_monitor.sv ### Generating UVM input monitor ./uvm_build/pulsedetector_tb_uvm_testbench/uvm_artifacts/mw_PulseDetector_monitor_input.sv ### Generating UVM Reference Model ./uvm_build/pulsedetector_tb_uvm_testbench/predictor/mw_PulseDetector_predictor.sv ### Generating UVM transaction object ./uvm_build/pulsedetector_tb_uvm_testbench/predictor/mw_PulseDetector_predictor_trans.sv ### Generating UVM agent ./uvm_build/pulsedetector_tb_uvm_testbench/uvm_artifacts/mw_PulseDetector_agent.sv ### Generating UVM scoreboard ./uvm_build/pulsedetector_tb_uvm_testbench/scoreboard/mw_PulseDetector_scoreboard.sv ### Generating UVM scoreboard configuration object ./uvm_build/pulsedetector_tb_uvm_testbench/scoreboard/mw_PulseDetector_scoreboard_cfg_obj.sv ### Generating UVM environment ./uvm_build/pulsedetector_tb_uvm_testbench/uvm_artifacts/mw_PulseDetector_environment.sv ### Generating UVM test ./uvm_build/pulsedetector_tb_uvm_testbench/uvm_artifacts/mw_PulseDetector_test.sv ### Generating UVM top ./uvm_build/pulsedetector_tb_uvm_testbench/top/mw_PulseDetector_top.sv ### Generating UVM test package ./uvm_build/pulsedetector_tb_uvm_testbench/top/pulsedetector_tb_pkg.sv ### Generating UVM test bench simulation script for Siemens Questa/ModelSim ./uvm_build/pulsedetector_tb_uvm_testbench/top/run_tb_mq.do
Pulse Generator Parameterization
In the model, the stimulus generation is parameterized using a dialog box parameter for the pulse location and an input port for the signal-to-noise ratio (SNR). In the generated UVM, these parameters are data members of the mw_PulseDetector_sequence
class with constraints that reflect information from the model.
See mw_PulseDetector_sequence.sv
.
Pulse Location as a Simulink.Parameter
pPulseLocation
: This dialog box parameter of theGenPulse
subsystem indicates the start location of the 64-sample pulse in the larger 5000 sample frame. To retain the parameter value in the SystemVerilog environment use aSimulink.Parameter
. In that parameter, the default value is 2100 and the valid range is [0, 4936]. (The pulse must be entirely within the frame of 5000 samples.)
In the generated UVM code, two constraints are placed on the pulse location sequence member for a default value and a minimum, maximum range as shown in this code snippet:
SNR as an Input Port
SNR port: This input port to the generation subsystem indicates the overall magnitude relationship of the generated pulse to the generated noise. Its data type is a
ufix8_En6
fixed-point number with an intrinsic range of [0, 3.984375]. The port itself has a been given a more constrained range of [0, 2.984375], which corresponds to the fixed-point bit values of 0b00_000000, 0b10_111111.
Because the port is an input port, there is no notion of a default value in Simulink. In the generated UVM code, two constraints are placed on the sequence member for a min, max range as well as a default value that matches the minimum. Code is also added to support a command-line default value override via a plus arg. For example:
Default UVM Simulation Behavior
The default sequence generation body()
follows the usual pattern of getting a grant, randomizing a sequence item, sending it to the sequencer, and then waiting for its completion.
This example includes a MathWorks-specific set up to run Questa™. Adjust the commands to match the installation of your HDL simulator.
current_simulator = 'Questa';
setup_questa();
Next, clear the environment variables that influence the UVM simulation.
setenv EXTRA_UVM_SIM_ARGS setenv EXTRA_UVM_COMP_ARGS setenv UVM_TOP_MODULE
Because of the default value constraints, if you run the default test, it will use fixed values for the parameters. For this model, that means a pulse start location of 2100 and an SNR of 0.0. An SNR of 0.0 will result in no detectable pulses, so a plusarg specifies a more interesting default value. A fixed-point bit value of 8'b10000000 is a float value of 2.0.
cd uvm_build/pulsedetector_tb_uvm_testbench/top % Simulate with an SNR of 2.0 setenv EXTRA_UVM_SIM_ARGS '+SNR_default_inp_val=10000000' switch current_simulator case 'Questa', ! vsim -c -do run_tb_mq.do case 'Questa_gui', ! vsim -do run_tb_mq.do case 'Xcelium', ! ./run_tb_xcelium.sh case 'VCS', ! ./run_tb_vcs.sh end
Reading pref.tcl # 2022.2 # do run_tb_mq.do # +SNR_default_inp_val=10000000 # mw_PulseDetector_top.sv # QuestaSim-64 vlog 2022.2 Compiler 2022.04 Apr 25 2022 # Start time: 15:01:27 on Jul 17,2024 # vlog -timescale 1ns/1ns ../DPI_dut/PulseDetector_dpi_pkg.sv ../sequence/GenPulse_dpi_pkg.sv ../scoreboard/CheckDetection_dpi_pkg.sv ../driver/InputDriver_dpi_pkg.sv ../monitor/OutputMonitor_dpi_pkg.sv ../predictor/PulseDetectorRef_dpi_pkg.sv pulsedetector_tb_pkg.sv mw_PulseDetector_top.sv "+define+MG_SIM" # -- Compiling package PulseDetector_dpi_pkg # -- Compiling package GenPulse_dpi_pkg # -- Compiling package CheckDetection_dpi_pkg # -- Compiling package InputDriver_dpi_pkg # -- Compiling package OutputMonitor_dpi_pkg # -- Compiling package PulseDetectorRef_dpi_pkg # ** Note: (vlog-2286) pulsedetector_tb_pkg.sv(5): Using implicit +incdir+D:/3rdparty/R2023a/8709182/share/Questasim/Win/uvm-1.1d/../verilog_src/uvm-1.1d/src from import uvm_pkg # -- Compiling package pulsedetector_tb_pkg # -- Importing package mtiUvm.uvm_pkg (uvm-1.1d Built-in) # -- Importing package GenPulse_dpi_pkg # -- Importing package CheckDetection_dpi_pkg # -- Importing package PulseDetectorRef_dpi_pkg # -- Importing package InputDriver_dpi_pkg # -- Importing package OutputMonitor_dpi_pkg # ** Warning: ** while parsing file included at mw_PulseDetector_top.sv(5) # ** at ../DPI_dut/PulseDetector_dpi.sv(15): (vlog-13314) Defaulting port 'coeff_in' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed. # -- Compiling package mw_PulseDetector_top_sv_unit # -- Importing package PulseDetector_dpi_pkg # -- Importing package pulsedetector_tb_pkg # -- Compiling module PulseDetector_dpi # ** Warning: ../DPI_dut/PulseDetector_dpi.sv(15): (vlog-13314) Defaulting port 'coeff_in' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed. # -- Compiling interface mw_PulseDetector_if # -- Compiling module mw_PulseDetector_top # # Top level modules: # mw_PulseDetector_top # End time: 15:01:28 on Jul 17,2024, Elapsed time: 0:00:01 # Errors: 0, Warnings: 2 # vsim "+SNR_default_inp_val=10000000" -L work -voptargs="+acc" -sv_lib ../DPI_dut/PulseDetector_win64 -sv_lib ../sequence/GenPulse_win64 -sv_lib ../scoreboard/CheckDetection_win64 -sv_lib ../driver/InputDriver_win64 -sv_lib ../monitor/OutputMonitor_win64 -sv_lib ../predictor/PulseDetectorRef_win64 "+UVM_TESTNAME=mw_PulseDetector_test" mw_PulseDetector_top "+define+MG_SIM" # Start time: 15:01:28 on Jul 17,2024 # ** Note: (vsim-3812) Design is being optimized... # ** Warning: (vopt-10587) Some optimizations are turned off because the +acc switch is in effect. This will cause your simulation to run slowly. Please use -access/-debug to maintain needed visibility. # ** Warning: ../DPI_dut/PulseDetector_dpi.sv(15): (vopt-13314) Defaulting port 'coeff_in' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed. # ** Note: (vsim-12126) Error and warning message counts have been restored: Errors=0, Warnings=2. # // Questa Sim-64 # // Version 2022.2 win64 Apr 25 2022 # // # // Copyright 1991-2022 Mentor Graphics Corporation # // All Rights Reserved. # // # // QuestaSim and its associated documentation contain trade # // secrets and commercial or financial information that are the property of # // Mentor Graphics Corporation and are privileged, confidential, # // and exempt from disclosure under the Freedom of Information Act, # // 5 U.S.C. Section 552. Furthermore, this information # // is prohibited from disclosure under the Trade Secrets Act, # // 18 U.S.C. Section 1905. # // # Loading sv_std.std # Loading work.mw_PulseDetector_if(fast) # Loading work.OutputMonitor_dpi_pkg(fast) # Loading work.InputDriver_dpi_pkg(fast) # Loading work.PulseDetectorRef_dpi_pkg(fast) # Loading work.CheckDetection_dpi_pkg(fast) # Loading work.GenPulse_dpi_pkg(fast) # Loading mtiUvm.uvm_pkg(fast) # Loading work.pulsedetector_tb_pkg(fast) # Loading work.PulseDetector_dpi_pkg(fast) # Loading work.mw_PulseDetector_top_sv_unit(fast) # Loading mtiUvm.questa_uvm_pkg(fast) # Loading work.mw_PulseDetector_top(fast) # Loading work.mw_PulseDetector_if(fast__2) # Loading work.PulseDetector_dpi(fast) # Loading .\../DPI_dut/PulseDetector_win64.dll # Loading .\../sequence/GenPulse_win64.dll # Loading .\../scoreboard/CheckDetection_win64.dll # Loading .\../driver/InputDriver_win64.dll # Loading .\../monitor/OutputMonitor_win64.dll # Loading .\../predictor/PulseDetectorRef_win64.dll # Loading D:/3rdparty/R2023a/8709182/share/Questasim/Win/uvm-1.1d\win64\uvm_dpi.dll [FrameNum= 0] No peak found in Ref or Impl. [FrameNum= 1] PREDICTED: Peak location=2163.000000, mag-squared=0.280 using global max [FrameNum= 1] ACTUAL : Peak location=2170.000000, mag-squared=0.285 using global max [FrameNum= 1] DIFF : Peak location=7, mag-squared=0.004 (1.551%) [FrameNum= 2] PREDICTED: Peak location=2163.000000, mag-squared=0.200 using global max [FrameNum= 2] ACTUAL : Peak location=2170.000000, mag-squared=0.194 using global max [FrameNum= 2] DIFF : Peak location=7, mag-squared=0.006 (2.881%) [FrameNum= 3] PREDICTED: Peak location=2163.000000, mag-squared=0.224 using global max [FrameNum= 3] ACTUAL : Peak location=2170.000000, mag-squared=0.234 using global max [FrameNum= 3] DIFF : Peak location=7, mag-squared=0.010 (4.623%) [FrameNum= 4] PREDICTED: Peak location=2163.000000, mag-squared=0.200 using global max [FrameNum= 4] ACTUAL : Peak location=2170.000000, mag-squared=0.209 using global max [FrameNum= 4] DIFF : Peak location=7, mag-squared=0.009 (4.346%) [FrameNum= 5] PREDICTED: Peak location=2163.000000, mag-squared=0.255 using global max [FrameNum= 5] ACTUAL : Peak location=2170.000000, mag-squared=0.257 using global max [FrameNum= 5] DIFF : Peak location=7, mag-squared=0.002 (0.735%) [FrameNum= 6] PREDICTED: Peak location=2163.000000, mag-squared=0.241 using global max [FrameNum= 6] ACTUAL : Peak location=2170.000000, mag-squared=0.250 using global max [FrameNum= 6] DIFF : Peak location=7, mag-squared=0.009 (3.660%) [FrameNum= 7] PREDICTED: Peak location=2163.000000, mag-squared=0.241 using global max [FrameNum= 7] ACTUAL : Peak location=2170.000000, mag-squared=0.243 using global max [FrameNum= 7] DIFF : Peak location=7, mag-squared=0.002 (0.790%) [FrameNum= 8] PREDICTED: Peak location=2163.000000, mag-squared=0.225 using global max [FrameNum= 8] ACTUAL : Peak location=2170.000000, mag-squared=0.231 using global max [FrameNum= 8] DIFF : Peak location=7, mag-squared=0.007 (3.076%) [FrameNum= 9] PREDICTED: Peak location=2163.000000, mag-squared=0.239 using global max [FrameNum= 9] ACTUAL : Peak location=2170.000000, mag-squared=0.254 using global max [FrameNum= 9] DIFF : Peak location=7, mag-squared=0.015 (6.083%) [FrameNum= 10] PREDICTED: Peak location=2163.000000, mag-squared=0.225 using global max [FrameNum= 10] ACTUAL : Peak location=2170.000000, mag-squared=0.230 using global max [FrameNum= 10] DIFF : Peak location=7, mag-squared=0.005 (2.242%) [FrameNum= 11] PREDICTED: Peak location=2163.000000, mag-squared=0.207 using global max [FrameNum= 11] ACTUAL : Peak location=2170.000000, mag-squared=0.221 using global max [FrameNum= 11] DIFF : Peak location=7, mag-squared=0.014 (6.697%) [FrameNum= 12] PREDICTED: Peak location=2163.000000, mag-squared=0.265 using global max [FrameNum= 12] ACTUAL : Peak location=2170.000000, mag-squared=0.260 using global max [FrameNum= 12] DIFF : Peak location=7, mag-squared=0.005 (2.014%) # ---------------------------------------------------------------- # UVM-1.1d # (C) 2007-2013 Mentor Graphics Corporation # (C) 2007-2013 Cadence Design Systems, Inc. # (C) 2006-2013 Synopsys, Inc. # (C) 2011-2013 Cypress Semiconductor Corp. # ---------------------------------------------------------------- # # *********** IMPORTANT RELEASE NOTES ************ # # You are using a version of the UVM library that has been compiled # with `UVM_NO_DEPRECATED undefined. # See http://www.eda.org/svdb/view.php?id=3313 for more details. # # You are using a version of the UVM library that has been compiled # with `UVM_OBJECT_MUST_HAVE_CONSTRUCTOR undefined. # See http://www.eda.org/svdb/view.php?id=3770 for more details. # # (Specify +UVM_NO_RELNOTES to turn off this notice) # # UVM_INFO verilog_src/questa_uvm_pkg-1.2/src/questa_uvm_pkg.sv(277) @ 0: reporter [Questa UVM] QUESTA_UVM-1.2.3 # UVM_INFO verilog_src/questa_uvm_pkg-1.2/src/questa_uvm_pkg.sv(278) @ 0: reporter [Questa UVM] questa_uvm::init(+struct) # UVM_INFO @ 0: reporter [RNTST] Running test mw_PulseDetector_test... # ** Info: Gathering coverage for 2 Simulink verify() calls. # Time: 0 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.initVerifyInfo File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 261 # ** Info: Model verify() covergroup 0 properties: # Covergroup instance name: pulsedetector_tb:757 # Coverage count goal : 1 # Model location : Simulink.ID.hilite('pulsedetector_tb:757') # Block path : CheckDetection/CheckDetection/Check # Static Range # Step name : inferred verify call # Verify ID : CheckDetection/CheckDetection/Check # Static Range # Time: 0 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.initVerifyInfo File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 265 # ** Info: Model verify() covergroup 1 properties: # Covergroup instance name: pulsedetector_tb:744 # Coverage count goal : 1 # Model location : Simulink.ID.hilite('pulsedetector_tb:744') # Block path : CheckDetection/CheckDetection/Check Static # Upper Bound # Step name : inferred verify call # Verify ID : CheckDetection/CheckDetection/Check Static # Upper Bound # Time: 0 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.initVerifyInfo File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 265 # ** Error: pulsedetector_tb:744: # Time: 450020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 450020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # ** Error: pulsedetector_tb:744: # Time: 550020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 550020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO verilog_src/uvm-1.1d/src/base/uvm_objection.svh(1267) @ 650000: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase # ** Info: Instance coverage for verify 'pulsedetector_tb:757', coverpoint 'pass_cp': metric=100.00 (Pass: 13), at_least= 1 ( COVERED) # Time: 650 us Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 406 # ** Info: Instance coverage for verify 'pulsedetector_tb:744', coverpoint 'pass_cp': metric=100.00 (Pass: 11), at_least= 1 ( COVERED) # Time: 650 us Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 406 # ** Info: Overall coverage for CheckDetection_dpi_verify_calls: metric=100.00 ( COVERED) # Time: 650 us Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 413 # # --- UVM Report Summary --- # # ** Report counts by severity # UVM_INFO : 4 # UVM_WARNING : 0 # UVM_ERROR : 0 # UVM_FATAL : 0 # ** Report counts by id # [Questa UVM] 2 # [RNTST] 1 # [TEST_DONE] 1 # ** Note: $finish : D:/3rdparty/R2023a/8709182/share/Questasim/Win/win64/../verilog_src/uvm-1.1d/src/base/uvm_root.svh(430) # Time: 650 us Iteration: 61 Instance: /mw_PulseDetector_top # End time: 15:01:52 on Jul 17,2024, Elapsed time: 0:00:24 # Errors: 4, Warnings: 2
cd ../../..
Constrained Random Verification Using In-Lined Constraints
You can use standard UVM techniques to add randomized behavior to the stimulus generation. In this example, the test plan calls for using SNR values between 0.75 and 1.00 to determine how robust the algorithm is in detecting pulses in this range. For this case, the location of the pulse does not matter and is fixed at the end of the 5000 sample frames.
See mw_PulseDetector_SEQCRT_param_overrides.sv
.
To achieve this testplan goal, create a derived sequence class. It has the following extra behaviors:
In the
pre_body()
override, the use of the default value constraints is turned off.In the
post_randomize()
override, the randomized value is printed out so that SNR values can be related to whether pulses are detected or not. It uses a class utility functionfixed2real
to give a friendly value.In the
randomize_params()
override, an in-line constraint of "randomize with" restricts SNR values to be between 0.75 and 1.0. (You can get these bit values from MATLAB® by using afi
variable and itsbin
method.)
A new test is created, which tells the factory to use the new sequence class when constructing the testbench.
To run the UVM simulations using these new classes, you can use the original scripts with extra arguments given through environment variables.
% Simulate the UVM testbench using inlined constraint overrides cd uvm_build/pulsedetector_tb_uvm_testbench/top setenv EXTRA_UVM_COMP_ARGS '-f ../../../overrides_SEQCRT/extra_comp_args.f' setenv EXTRA_UVM_SIM_ARGS +UVM_TESTNAME=mw_PulseDetector_test_inlineCRT switch current_simulator case 'Questa', ! vsim -c -do run_tb_mq.do case 'Questa_gui', ! vsim -do run_tb_mq.do case 'Xcelium', ! ./run_tb_xcelium.sh case 'VCS', ! ./run_tb_vcs.sh end
Reading pref.tcl # 2022.2 # do run_tb_mq.do # -f ../../../overrides_SEQCRT/extra_comp_args.f # +UVM_TESTNAME=mw_PulseDetector_test_inlineCRT # mw_PulseDetector_top.sv # ** Warning: (vlib-34) Library already exists at "work". # Errors: 0, Warnings: 1 # QuestaSim-64 vlog 2022.2 Compiler 2022.04 Apr 25 2022 # Start time: 15:02:01 on Jul 17,2024 # vlog -timescale 1ns/1ns ../DPI_dut/PulseDetector_dpi_pkg.sv ../sequence/GenPulse_dpi_pkg.sv ../scoreboard/CheckDetection_dpi_pkg.sv ../driver/InputDriver_dpi_pkg.sv ../monitor/OutputMonitor_dpi_pkg.sv ../predictor/PulseDetectorRef_dpi_pkg.sv pulsedetector_tb_pkg.sv -f ../../../overrides_SEQCRT/extra_comp_args.f mw_PulseDetector_top.sv "+define+MG_SIM" # -- Compiling package PulseDetector_dpi_pkg # -- Compiling package GenPulse_dpi_pkg # -- Compiling package CheckDetection_dpi_pkg # -- Compiling package InputDriver_dpi_pkg # -- Compiling package OutputMonitor_dpi_pkg # -- Compiling package PulseDetectorRef_dpi_pkg # ** Note: (vlog-2286) pulsedetector_tb_pkg.sv(5): Using implicit +incdir+D:/3rdparty/R2023a/8709182/share/Questasim/Win/uvm-1.1d/../verilog_src/uvm-1.1d/src from import uvm_pkg # -- Compiling package pulsedetector_tb_pkg # -- Importing package mtiUvm.uvm_pkg (uvm-1.1d Built-in) # -- Importing package GenPulse_dpi_pkg # -- Importing package CheckDetection_dpi_pkg # -- Importing package PulseDetectorRef_dpi_pkg # -- Importing package InputDriver_dpi_pkg # -- Importing package OutputMonitor_dpi_pkg # -- Compiling package pulsedetector_tb_extension_pkg # -- Importing package pulsedetector_tb_pkg # ** Warning: ** while parsing file included at mw_PulseDetector_top.sv(5) # ** at ../DPI_dut/PulseDetector_dpi.sv(15): (vlog-13314) Defaulting port 'coeff_in' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed. # ** Warning: ../DPI_dut/PulseDetector_dpi.sv(6): (vlog-13233) Design unit "mw_PulseDetector_top_sv_unit" already exists and will be overwritten. Design unit compiled with different set of options. # -- Compiling package mw_PulseDetector_top_sv_unit # -- Importing package PulseDetector_dpi_pkg # -- Importing package pulsedetector_tb_extension_pkg # -- Compiling module PulseDetector_dpi # ** Warning: ../DPI_dut/PulseDetector_dpi.sv(15): (vlog-13314) Defaulting port 'coeff_in' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed. # -- Compiling interface mw_PulseDetector_if # -- Compiling module mw_PulseDetector_top # # Top level modules: # mw_PulseDetector_top # End time: 15:02:02 on Jul 17,2024, Elapsed time: 0:00:01 # Errors: 0, Warnings: 3 # vsim "+UVM_TESTNAME=mw_PulseDetector_test_inlineCRT" -L work -voptargs="+acc" -sv_lib ../DPI_dut/PulseDetector_win64 -sv_lib ../sequence/GenPulse_win64 -sv_lib ../scoreboard/CheckDetection_win64 -sv_lib ../driver/InputDriver_win64 -sv_lib ../monitor/OutputMonitor_win64 -sv_lib ../predictor/PulseDetectorRef_win64 "+UVM_TESTNAME=mw_PulseDetector_test" mw_PulseDetector_top "+define+MG_SIM" # Start time: 15:02:02 on Jul 17,2024 # ** Note: (vsim-3813) Design is being optimized due to module recompilation... # ** Warning: (vopt-10587) Some optimizations are turned off because the +acc switch is in effect. This will cause your simulation to run slowly. Please use -access/-debug to maintain needed visibility. # ** Warning: ../DPI_dut/PulseDetector_dpi.sv(15): (vopt-13314) Defaulting port 'coeff_in' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed. # ** Note: (vsim-12126) Error and warning message counts have been restored: Errors=0, Warnings=2. # // Questa Sim-64 # // Version 2022.2 win64 Apr 25 2022 # // # // Copyright 1991-2022 Mentor Graphics Corporation # // All Rights Reserved. # // # // QuestaSim and its associated documentation contain trade # // secrets and commercial or financial information that are the property of # // Mentor Graphics Corporation and are privileged, confidential, # // and exempt from disclosure under the Freedom of Information Act, # // 5 U.S.C. Section 552. Furthermore, this information # // is prohibited from disclosure under the Trade Secrets Act, # // 18 U.S.C. Section 1905. # // # Loading sv_std.std # Loading work.mw_PulseDetector_if(fast) # Loading work.OutputMonitor_dpi_pkg(fast) # Loading work.InputDriver_dpi_pkg(fast) # Loading work.PulseDetectorRef_dpi_pkg(fast) # Loading work.CheckDetection_dpi_pkg(fast) # Loading work.GenPulse_dpi_pkg(fast) # Loading mtiUvm.uvm_pkg(fast) # Loading work.pulsedetector_tb_pkg(fast) # Loading work.pulsedetector_tb_extension_pkg(fast) # Loading work.PulseDetector_dpi_pkg(fast) # Loading work.mw_PulseDetector_top_sv_unit(fast) # Loading mtiUvm.questa_uvm_pkg(fast) # Loading work.mw_PulseDetector_top(fast) # Loading work.mw_PulseDetector_if(fast__2) # Loading work.PulseDetector_dpi(fast) # Loading .\../DPI_dut/PulseDetector_win64.dll # Loading .\../sequence/GenPulse_win64.dll # Loading .\../scoreboard/CheckDetection_win64.dll # Loading .\../driver/InputDriver_win64.dll # Loading .\../monitor/OutputMonitor_win64.dll # Loading .\../predictor/PulseDetectorRef_win64.dll # Loading D:/3rdparty/R2023a/8709182/share/Questasim/Win/uvm-1.1d\win64\uvm_dpi.dll [FrameNum= 0] No peak found in Ref or Impl. [FrameNum= 1] PREDICTED: Peak location=4999.000000, mag-squared=0.056 using global max [FrameNum= 1] No peak detected from impl error(pct)=100.000 [FrameNum= 2] PREDICTED: Peak location=4999.000000, mag-squared=0.039 using global max [FrameNum= 2] ACTUAL : Peak location=6.000000, mag-squared=0.056 using global max [FrameNum= 2] DIFF : Peak location=4993, mag-squared=0.016 (40.988%) [FrameNum= 3] PREDICTED: Peak location=4999.000000, mag-squared=0.040 using global max [FrameNum= 3] ACTUAL : Peak location=6.000000, mag-squared=0.039 using global max [FrameNum= 3] DIFF : Peak location=4993, mag-squared=0.001 (2.145%) [FrameNum= 4] PREDICTED: Peak location=4999.000000, mag-squared=0.036 using global max [FrameNum= 4] ACTUAL : Peak location=6.000000, mag-squared=0.041 using global max [FrameNum= 4] DIFF : Peak location=4993, mag-squared=0.005 (13.811%) [FrameNum= 5] PREDICTED: Peak location=4999.000000, mag-squared=0.056 using global max [FrameNum= 5] ACTUAL : Peak location=6.000000, mag-squared=0.037 using global max [FrameNum= 5] DIFF : Peak location=4993, mag-squared=0.020 (34.786%) [FrameNum= 6] PREDICTED: Peak location=4999.000000, mag-squared=0.047 using global max [FrameNum= 6] ACTUAL : Peak location=6.000000, mag-squared=0.057 using global max [FrameNum= 6] DIFF : Peak location=4993, mag-squared=0.010 (21.300%) [FrameNum= 7] PREDICTED: Peak location=4999.000000, mag-squared=0.054 using global max [FrameNum= 7] ACTUAL : Peak location=6.000000, mag-squared=0.050 using global max [FrameNum= 7] DIFF : Peak location=4993, mag-squared=0.004 (8.111%) [FrameNum= 8] PREDICTED: Peak location=4999.000000, mag-squared=0.041 using global max [FrameNum= 8] ACTUAL : Peak location=6.000000, mag-squared=0.053 using global max [FrameNum= 8] DIFF : Peak location=4993, mag-squared=0.012 (30.146%) [FrameNum= 9] PREDICTED: Peak location=4999.000000, mag-squared=0.051 using global max [FrameNum= 9] ACTUAL : Peak location=6.000000, mag-squared=0.044 using global max [FrameNum= 9] DIFF : Peak location=4993, mag-squared=0.007 (13.104%) # ---------------------------------------------------------------- # UVM-1.1d # (C) 2007-2013 Mentor Graphics Corporation # (C) 2007-2013 Cadence Design Systems, Inc. # (C) 2006-2013 Synopsys, Inc. # (C) 2011-2013 Cypress Semiconductor Corp. # ---------------------------------------------------------------- # # *********** IMPORTANT RELEASE NOTES ************ # # You are using a version of the UVM library that has been compiled # with `UVM_NO_DEPRECATED undefined. # See http://www.eda.org/svdb/view.php?id=3313 for more details. # # You are using a version of the UVM library that has been compiled # with `UVM_OBJECT_MUST_HAVE_CONSTRUCTOR undefined. # See http://www.eda.org/svdb/view.php?id=3770 for more details. # # (Specify +UVM_NO_RELNOTES to turn off this notice) # # UVM_INFO verilog_src/questa_uvm_pkg-1.2/src/questa_uvm_pkg.sv(277) @ 0: reporter [Questa UVM] QUESTA_UVM-1.2.3 # UVM_INFO verilog_src/questa_uvm_pkg-1.2/src/questa_uvm_pkg.sv(278) @ 0: reporter [Questa UVM] questa_uvm::init(+struct) # UVM_WARNING @ 0: reporter [MULTTST] Multiple (2) +UVM_TESTNAME arguments provided on the command line. 'mw_PulseDetector_test_inlineCRT' will be used. Provided list: mw_PulseDetector_test_inlineCRT, mw_PulseDetector_test. # UVM_INFO @ 0: reporter [RNTST] Running test mw_PulseDetector_test_inlineCRT... # ** Info: Gathering coverage for 2 Simulink verify() calls. # Time: 0 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.initVerifyInfo File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 261 # ** Info: Model verify() covergroup 0 properties: # Covergroup instance name: pulsedetector_tb:757 # Coverage count goal : 1 # Model location : Simulink.ID.hilite('pulsedetector_tb:757') # Block path : CheckDetection/CheckDetection/Check # Static Range # Step name : inferred verify call # Verify ID : CheckDetection/CheckDetection/Check # Static Range # Time: 0 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.initVerifyInfo File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 265 # ** Info: Model verify() covergroup 1 properties: # Covergroup instance name: pulsedetector_tb:744 # Coverage count goal : 1 # Model location : Simulink.ID.hilite('pulsedetector_tb:744') # Block path : CheckDetection/CheckDetection/Check Static # Upper Bound # Step name : inferred verify call # Verify ID : CheckDetection/CheckDetection/Check Static # Upper Bound # Time: 0 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.initVerifyInfo File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 265 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 10: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.7656, Loc=4936 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 50010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.9219, Loc=4936 # # ** Error: pulsedetector_tb:744: # Time: 50020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 50020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 100010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.9063, Loc=4936 # # ** Error: pulsedetector_tb:744: # Time: 100020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 100020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 150010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.8438, Loc=4936 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 200010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.8750, Loc=4936 # # ** Error: pulsedetector_tb:744: # Time: 200020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 200020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 250010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.9844, Loc=4936 # # ** Error: pulsedetector_tb:744: # Time: 250020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 250020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 300010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.9063, Loc=4936 # # ** Error: pulsedetector_tb:744: # Time: 300020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 300020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 350010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.8281, Loc=4936 # # ** Error: pulsedetector_tb:744: # Time: 350020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 350020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 400010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.7656, Loc=4936 # # ** Error: pulsedetector_tb:744: # Time: 400020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 400020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 450010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.7500, Loc=4936 # # ** Error: pulsedetector_tb:744: # Time: 450020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 450020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 [FrameNum= 10] PREDICTED: Peak location=4999.000000, mag-squared=0.030 using global max [FrameNum= 10] ACTUAL : Peak location=6.000000, mag-squared=0.054 using global max [FrameNum= 10] DIFF : Peak location=4993, mag-squared=0.024 (79.450%) [FrameNum= 11] PREDICTED: Peak location=4999.000000, mag-squared=0.033 using global max [FrameNum= 11] ACTUAL : Peak location=6.000000, mag-squared=0.031 using global max [FrameNum= 11] DIFF : Peak location=4993, mag-squared=0.002 (5.866%) [FrameNum= 12] PREDICTED: Peak location=4999.000000, mag-squared=0.059 using global max [FrameNum= 12] ACTUAL : Peak location=6.000000, mag-squared=0.035 using global max [FrameNum= 12] DIFF : Peak location=4993, mag-squared=0.025 (41.710%) # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 500010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.8125, Loc=4936 # # ** Error: pulsedetector_tb:744: # Time: 500020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 500020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(27) @ 550010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_inlineCRT] # Seq param vals: SNR=0.9531, Loc=4936 # # ** Error: pulsedetector_tb:744: # Time: 550020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 550020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # ** Error: pulsedetector_tb:744: # Time: 600020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 600020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO verilog_src/uvm-1.1d/src/base/uvm_objection.svh(1267) @ 650000: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase # ** Info: Instance coverage for verify 'pulsedetector_tb:757', coverpoint 'pass_cp': metric=100.00 (Pass: 13), at_least= 1 ( COVERED) # Time: 650 us Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 406 # ** Info: Instance coverage for verify 'pulsedetector_tb:744', coverpoint 'pass_cp': metric=100.00 (Pass: 2), at_least= 1 ( COVERED) # Time: 650 us Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 406 # ** Info: Overall coverage for CheckDetection_dpi_verify_calls: metric=100.00 ( COVERED) # Time: 650 us Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 413 # # --- UVM Report Summary --- # # ** Report counts by severity # UVM_INFO : 16 # UVM_WARNING : 1 # UVM_ERROR : 0 # UVM_FATAL : 0 # ** Report counts by id # [MULTTST] 1 # [Questa UVM] 2 # [RNTST] 1 # [TEST_DONE] 1 # [mw_PulseDetector_sequence_inlineCRT] 12 # ** Note: $finish : D:/3rdparty/R2023a/8709182/share/Questasim/Win/win64/../verilog_src/uvm-1.1d/src/base/uvm_root.svh(430) # Time: 650 us Iteration: 61 Instance: /mw_PulseDetector_top # End time: 15:02:25 on Jul 17,2024, Elapsed time: 0:00:23 # Errors: 22, Warnings: 2
cd ../../..
Examine the output and see that the generated SNR is always between [0.75, 1.00] and the pulse starting location is always 4936. With such an SNR range, observe that sometimes a pulse is detected and sometimes it is not.
Constrained Random Verification Using Class-Based Constraints
Inline constraints are good for honing in on specific test conditions. For more complex constrained random testing, you can create new constraint statement blocks in a derived sequence class. Here, the testplan requires that the location of the pulse varies across the frame using specific "buckets" of interesting locations in the beginning, middle, and end of the frame. A special location of 0 ensures that when no pulse is created, no pulse is detected. Likewise, for the SNR, several categories of interesting SNR ranges are defined, such as SNR_never_detected
and SNR_always_detected
. You now can easily use these constraints to cover these scenarios.
See mw_PulseDetector_SEQCRT_param_overrides.sv
.
To achieve these goals, the derived sequence class has the following extra behaviors:
Add a "loc_bucket" member declared as "randc".
Use that loc_bucket member to imply location ranges.
Add a "snr_bucket" member. It is not randomized, but rather is set by the test writer.
Use the selected snr_bucket to imply randomization within specific SNR ranges.
Turn off the conflicting, default value constraints.
Print out the randomized values for inspection during simulation.
A new test is created, which tells the UVM factory to use the new sequence class when constructing the testbench and also sets the specific SNR bucket through uvm_resource_db
.
To run the UVM simulations using these new classes, you can use the original scripts with extra arguments given through environment variables.
% Simulate the UVM testbench using derived sequence class overrides cd uvm_build/pulsedetector_tb_uvm_testbench/top setenv EXTRA_UVM_COMP_ARGS '-f ../../../overrides_SEQCRT/extra_comp_args.f' setenv EXTRA_UVM_SIM_ARGS +UVM_TESTNAME=mw_PulseDetector_test_classCRT switch current_simulator case 'Questa', ! vsim -c -do run_tb_mq.do case 'Questa_gui', ! vsim -do run_tb_mq.do case 'Xcelium', ! ./run_tb_xcelium.sh case 'VCS', ! ./run_tb_vcs.sh end
Reading pref.tcl # 2022.2 # do run_tb_mq.do # -f ../../../overrides_SEQCRT/extra_comp_args.f # +UVM_TESTNAME=mw_PulseDetector_test_classCRT # mw_PulseDetector_top.sv # ** Warning: (vlib-34) Library already exists at "work". # Errors: 0, Warnings: 1 # QuestaSim-64 vlog 2022.2 Compiler 2022.04 Apr 25 2022 # Start time: 15:02:32 on Jul 17,2024 # vlog -timescale 1ns/1ns ../DPI_dut/PulseDetector_dpi_pkg.sv ../sequence/GenPulse_dpi_pkg.sv ../scoreboard/CheckDetection_dpi_pkg.sv ../driver/InputDriver_dpi_pkg.sv ../monitor/OutputMonitor_dpi_pkg.sv ../predictor/PulseDetectorRef_dpi_pkg.sv pulsedetector_tb_pkg.sv -f ../../../overrides_SEQCRT/extra_comp_args.f mw_PulseDetector_top.sv "+define+MG_SIM" # -- Compiling package PulseDetector_dpi_pkg # -- Compiling package GenPulse_dpi_pkg # -- Compiling package CheckDetection_dpi_pkg # -- Compiling package InputDriver_dpi_pkg # -- Compiling package OutputMonitor_dpi_pkg # -- Compiling package PulseDetectorRef_dpi_pkg # ** Note: (vlog-2286) pulsedetector_tb_pkg.sv(5): Using implicit +incdir+D:/3rdparty/R2023a/8709182/share/Questasim/Win/uvm-1.1d/../verilog_src/uvm-1.1d/src from import uvm_pkg # -- Compiling package pulsedetector_tb_pkg # -- Importing package mtiUvm.uvm_pkg (uvm-1.1d Built-in) # -- Importing package GenPulse_dpi_pkg # -- Importing package CheckDetection_dpi_pkg # -- Importing package PulseDetectorRef_dpi_pkg # -- Importing package InputDriver_dpi_pkg # -- Importing package OutputMonitor_dpi_pkg # -- Compiling package pulsedetector_tb_extension_pkg # -- Importing package pulsedetector_tb_pkg # ** Warning: ** while parsing file included at mw_PulseDetector_top.sv(5) # ** at ../DPI_dut/PulseDetector_dpi.sv(15): (vlog-13314) Defaulting port 'coeff_in' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed. # -- Compiling package mw_PulseDetector_top_sv_unit # -- Importing package PulseDetector_dpi_pkg # -- Importing package pulsedetector_tb_extension_pkg # -- Compiling module PulseDetector_dpi # ** Warning: ../DPI_dut/PulseDetector_dpi.sv(15): (vlog-13314) Defaulting port 'coeff_in' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed. # -- Compiling interface mw_PulseDetector_if # -- Compiling module mw_PulseDetector_top # # Top level modules: # mw_PulseDetector_top # End time: 15:02:33 on Jul 17,2024, Elapsed time: 0:00:01 # Errors: 0, Warnings: 2 # vsim "+UVM_TESTNAME=mw_PulseDetector_test_classCRT" -L work -voptargs="+acc" -sv_lib ../DPI_dut/PulseDetector_win64 -sv_lib ../sequence/GenPulse_win64 -sv_lib ../scoreboard/CheckDetection_win64 -sv_lib ../driver/InputDriver_win64 -sv_lib ../monitor/OutputMonitor_win64 -sv_lib ../predictor/PulseDetectorRef_win64 "+UVM_TESTNAME=mw_PulseDetector_test" mw_PulseDetector_top "+define+MG_SIM" # Start time: 15:02:34 on Jul 17,2024 # ** Note: (vsim-8009) Loading existing optimized design _opt # // Questa Sim-64 # // Version 2022.2 win64 Apr 25 2022 # // # // Copyright 1991-2022 Mentor Graphics Corporation # // All Rights Reserved. # // # // QuestaSim and its associated documentation contain trade # // secrets and commercial or financial information that are the property of # // Mentor Graphics Corporation and are privileged, confidential, # // and exempt from disclosure under the Freedom of Information Act, # // 5 U.S.C. Section 552. Furthermore, this information # // is prohibited from disclosure under the Trade Secrets Act, # // 18 U.S.C. Section 1905. # // # Loading sv_std.std # Loading work.mw_PulseDetector_if(fast) # Loading work.OutputMonitor_dpi_pkg(fast) # Loading work.InputDriver_dpi_pkg(fast) # Loading work.PulseDetectorRef_dpi_pkg(fast) # Loading work.CheckDetection_dpi_pkg(fast) # Loading work.GenPulse_dpi_pkg(fast) # Loading mtiUvm.uvm_pkg(fast) # Loading work.pulsedetector_tb_pkg(fast) # Loading work.pulsedetector_tb_extension_pkg(fast) # Loading work.PulseDetector_dpi_pkg(fast) # Loading work.mw_PulseDetector_top_sv_unit(fast) # Loading mtiUvm.questa_uvm_pkg(fast) # Loading work.mw_PulseDetector_top(fast) # Loading work.mw_PulseDetector_if(fast__2) # Loading work.PulseDetector_dpi(fast) # Loading .\../DPI_dut/PulseDetector_win64.dll # Loading .\../sequence/GenPulse_win64.dll # Loading .\../scoreboard/CheckDetection_win64.dll # Loading .\../driver/InputDriver_win64.dll # Loading .\../monitor/OutputMonitor_win64.dll # Loading .\../predictor/PulseDetectorRef_win64.dll # Loading D:/3rdparty/R2023a/8709182/share/Questasim/Win/uvm-1.1d\win64\uvm_dpi.dll [FrameNum= 0] No peak found in Ref or Impl. [FrameNum= 1] PREDICTED: Peak location=74.000000, mag-squared=0.334 using global max [FrameNum= 1] ACTUAL : Peak location=118.000000, mag-squared=0.036 using global max [FrameNum= 1] DIFF : Peak location=44, mag-squared=0.298 (89.197%) [FrameNum= 2] PREDICTED: Peak location=1189.000000, mag-squared=0.299 using global max [FrameNum= 2] ACTUAL : Peak location=1196.000000, mag-squared=0.294 using global max [FrameNum= 2] DIFF : Peak location=7, mag-squared=0.005 (1.631%) [FrameNum= 3] No peak found in Ref or Impl. [FrameNum= 4] PREDICTED: Peak location=4583.000000, mag-squared=0.157 using global max [FrameNum= 4] ACTUAL : Peak location=4590.000000, mag-squared=0.162 using global max [FrameNum= 4] DIFF : Peak location=7, mag-squared=0.005 (3.476%) [FrameNum= 5] PREDICTED: Peak location=4319.000000, mag-squared=0.287 using global max [FrameNum= 5] ACTUAL : Peak location=4326.000000, mag-squared=0.291 using global max [FrameNum= 5] DIFF : Peak location=7, mag-squared=0.004 (1.390%) [FrameNum= 6] PREDICTED: Peak location=964.000000, mag-squared=0.227 using global max [FrameNum= 6] ACTUAL : Peak location=971.000000, mag-squared=0.232 using global max [FrameNum= 6] DIFF : Peak location=7, mag-squared=0.005 (2.246%) [FrameNum= 7] PREDICTED: Peak location=2024.000000, mag-squared=0.202 using global max [FrameNum= 7] ACTUAL : Peak location=2031.000000, mag-squared=0.200 using global max [FrameNum= 7] DIFF : Peak location=7, mag-squared=0.002 (1.043%) [FrameNum= 8] No peak found in Ref or Impl. [FrameNum= 9] PREDICTED: Peak location=2068.000000, mag-squared=0.202 using global max [FrameNum= 9] ACTUAL : Peak location=2075.000000, mag-squared=0.213 using global max [FrameNum= 9] DIFF : Peak location=7, mag-squared=0.012 (5.859%) [FrameNum= 10] PREDICTED: Peak location=3524.000000, mag-squared=0.331 using global max [FrameNum= 10] ACTUAL : Peak location=3531.000000, mag-squared=0.330 using global max [FrameNum= 10] DIFF : Peak location=7, mag-squared=0.002 (0.534%) [FrameNum= 11] No peak found in Ref or Impl. [FrameNum= 12] PREDICTED: Peak location=880.000000, mag-squared=0.163 using global max [FrameNum= 12] ACTUAL : Peak location=887.000000, mag-squared=0.159 using global max [FrameNum= 12] DIFF : Peak location=7, mag-squared=0.004 (2.517%) # ---------------------------------------------------------------- # UVM-1.1d # (C) 2007-2013 Mentor Graphics Corporation # (C) 2007-2013 Cadence Design Systems, Inc. # (C) 2006-2013 Synopsys, Inc. # (C) 2011-2013 Cypress Semiconductor Corp. # ---------------------------------------------------------------- # # *********** IMPORTANT RELEASE NOTES ************ # # You are using a version of the UVM library that has been compiled # with `UVM_NO_DEPRECATED undefined. # See http://www.eda.org/svdb/view.php?id=3313 for more details. # # You are using a version of the UVM library that has been compiled # with `UVM_OBJECT_MUST_HAVE_CONSTRUCTOR undefined. # See http://www.eda.org/svdb/view.php?id=3770 for more details. # # (Specify +UVM_NO_RELNOTES to turn off this notice) # # UVM_INFO verilog_src/questa_uvm_pkg-1.2/src/questa_uvm_pkg.sv(277) @ 0: reporter [Questa UVM] QUESTA_UVM-1.2.3 # UVM_INFO verilog_src/questa_uvm_pkg-1.2/src/questa_uvm_pkg.sv(278) @ 0: reporter [Questa UVM] questa_uvm::init(+struct) # UVM_WARNING @ 0: reporter [MULTTST] Multiple (2) +UVM_TESTNAME arguments provided on the command line. 'mw_PulseDetector_test_classCRT' will be used. Provided list: mw_PulseDetector_test_classCRT, mw_PulseDetector_test. # UVM_INFO @ 0: reporter [RNTST] Running test mw_PulseDetector_test_classCRT... # ** Info: Gathering coverage for 2 Simulink verify() calls. # Time: 0 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.initVerifyInfo File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 261 # ** Info: Model verify() covergroup 0 properties: # Covergroup instance name: pulsedetector_tb:757 # Coverage count goal : 1 # Model location : Simulink.ID.hilite('pulsedetector_tb:757') # Block path : CheckDetection/CheckDetection/Check # Static Range # Step name : inferred verify call # Verify ID : CheckDetection/CheckDetection/Check # Static Range # Time: 0 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.initVerifyInfo File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 265 # ** Info: Model verify() covergroup 1 properties: # Covergroup instance name: pulsedetector_tb:744 # Coverage count goal : 1 # Model location : Simulink.ID.hilite('pulsedetector_tb:744') # Block path : CheckDetection/CheckDetection/Check Static # Upper Bound # Step name : inferred verify call # Verify ID : CheckDetection/CheckDetection/Check Static # Upper Bound # Time: 0 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.initVerifyInfo File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 265 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 10: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 1 -> Loc= 11, snr_bucket= 3 -> SNR=2.3906 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 50010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 2 -> Loc=1126, snr_bucket= 3 -> SNR=2.2188 # # ** Error: pulsedetector_tb:744: # Time: 50020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 50020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 100010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 0 -> Loc= 0, snr_bucket= 3 -> SNR=2.9688 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 150010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 3 -> Loc=4520, snr_bucket= 3 -> SNR=1.6719 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 200010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 3 -> Loc=4256, snr_bucket= 3 -> SNR=2.4063 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 250010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 1 -> Loc= 901, snr_bucket= 3 -> SNR=2.0469 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 300010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 2 -> Loc=1961, snr_bucket= 3 -> SNR=1.9063 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 350010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 0 -> Loc= 0, snr_bucket= 3 -> SNR=1.7188 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 400010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 2 -> Loc=2005, snr_bucket= 3 -> SNR=1.6719 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 450010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 3 -> Loc=3461, snr_bucket= 3 -> SNR=2.7344 # # ** Error: pulsedetector_tb:744: # Time: 450020 ns Scope: pulsedetector_tb_pkg.mw_PulseDetector_scoreboard.run_phase File: ../scoreboard/mw_PulseDetector_scoreboard.sv Line: 84 # ** Error: pulsedetector_tb:744: At step 'inferred verify call' verify id 'CheckDetection/CheckDetection/Check Static # Upper Bound' Failed # Time: 450020 ns Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.checkVerifyStatus File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 384 # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 500010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 0 -> Loc= 0, snr_bucket= 3 -> SNR=1.6406 # # UVM_INFO ../../../overrides_SEQCRT/./mw_PulseDetector_SEQCRT_param_overrides.sv(95) @ 550010: uvm_test_top.env.PulseDetector_agent.sqr@@seq [mw_PulseDetector_sequence_classCRT] # Seq param vals: loc_bucket= 1 -> Loc= 817, snr_bucket= 3 -> SNR=2.0938 # # UVM_INFO verilog_src/uvm-1.1d/src/base/uvm_objection.svh(1267) @ 650000: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase # ** Info: Instance coverage for verify 'pulsedetector_tb:757', coverpoint 'pass_cp': metric=100.00 (Pass: 13), at_least= 1 ( COVERED) # Time: 650 us Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 406 # ** Info: Instance coverage for verify 'pulsedetector_tb:744', coverpoint 'pass_cp': metric=100.00 (Pass: 11), at_least= 1 ( COVERED) # Time: 650 us Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 406 # ** Info: Overall coverage for CheckDetection_dpi_verify_calls: metric=100.00 ( COVERED) # Time: 650 us Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 413 # # --- UVM Report Summary --- # # ** Report counts by severity # UVM_INFO : 16 # UVM_WARNING : 1 # UVM_ERROR : 0 # UVM_FATAL : 0 # ** Report counts by id # [MULTTST] 1 # [Questa UVM] 2 # [RNTST] 1 # [TEST_DONE] 1 # [mw_PulseDetector_sequence_classCRT] 12 # ** Note: $finish : D:/3rdparty/R2023a/8709182/share/Questasim/Win/win64/../verilog_src/uvm-1.1d/src/base/uvm_root.svh(430) # Time: 650 us Iteration: 61 Instance: /mw_PulseDetector_top # End time: 15:02:53 on Jul 17,2024, Elapsed time: 0:00:19 # Errors: 4, Warnings: 0
cd ../../..
Examine the output to see that the generated SNR is always above 1.4844 and the pulse starting location is visiting each of the ranges defined for loc_bucket
. You can also confirm that when a location is 0, since no pulse is created, no pulse is detected.
Bypass Simulink Stimulus Generation
The generated sequences above are using randomization to affect the input parameters and arguments to the underlying GenPulse DPI-C functions. The actual transaction values are outputs of those functions. If you want to take full control of the actual transactions delivered to the sequencer, you can bypass the usual DPI calls and randomize the req
data member.
See mw_PulseDetector_SEQCRT_param_overrides.sv
.
In this case, because the pulse, coefficients, and noise are all interrelated, completely randomizing their values will not yield valid test cases. However, this technique is useful for other transaction types.
Conclusions and Next Steps
In a full UVM environment, whenever randomization is introduced, it is usually essential to include coverage and to ensure different parts of the environment are aware of which random values were generated. In these examples randomized values are simply printed out. Adding coverage for generated SNR and location values--and relating those to detection and error thresholds--is an exercise left to the reader.