Main Content

Add Random Constraints to Sequences in UVM Testbench

This example shows how to add constrained random verification to a universal verification methodology (UVM) test bench generated from Simulink®. Both Simulink parameters and input ports to the stimulus generation results in randomizable sequence class data members in the UVM test bench. 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 test bench 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 built:

Model          Action                        Rebuild Reason                                    
===============================================================================================
PulseDetector  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 1m 33.3774039999992s
### 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 built:

Model     Action                        Rebuild Reason                                    
==========================================================================================
GenPulse  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 37.1534900000021s
### 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 built:

Model        Action                        Rebuild Reason                                    
=============================================================================================
InputDriver  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 24.3891730000004s
### 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 built:

Model          Action                        Rebuild Reason                                    
===============================================================================================
OutputMonitor  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 21.6421199999973s
### 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 built:

Model           Action                        Rebuild Reason                                    
================================================================================================
CheckDetection  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 46.7670979999974s
### 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 built:

Model             Action                        Rebuild Reason                                    
==================================================================================================
PulseDetectorRef  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 23.1728219999969s
### 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 Mentor Graphics QuestaSim/Modelsim ./uvm_build/pulsedetector_tb_uvm_testbench/top/run_tb_mq.do
### Generating UVM test bench simulation script for Cadence Xcelium ./uvm_build/pulsedetector_tb_uvm_testbench/top/run_tb_xcelium.sh
### Generating UVM test bench simulation script for Synopsys VCS ./uvm_build/pulsedetector_tb_uvm_testbench/top/run_tb_vcs.sh

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 the GenPulse 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 a Simulink.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.)

SequenceLocParam.png

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:

SequenceLocConstraints.png

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.

SequenceSNRParam.png

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:

SequenceSNRConstraints.png

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.

SequenceBody.png

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: 16:16:36 on Jun 16,2023
# 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+/mathworks/hub/3rdparty/R2023a/8709182/share/Questasim/Lin/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: 16:16:36 on Jun 16,2023, Elapsed time: 0:00:00
# Errors: 0, Warnings: 2
# vsim "+SNR_default_inp_val=10000000" -L work -voptargs="+acc" -sv_lib ../DPI_dut/PulseDetector -sv_lib ../sequence/GenPulse -sv_lib ../scoreboard/CheckDetection -sv_lib ../driver/InputDriver -sv_lib ../monitor/OutputMonitor -sv_lib ../predictor/PulseDetectorRef "+UVM_TESTNAME=mw_PulseDetector_test" mw_PulseDetector_top "+define+MG_SIM" 
# Start time: 16:16:36 on Jun 16,2023
# ** 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 linux_x86_64 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.so
# Loading ./../sequence/GenPulse.so
# Loading ./../scoreboard/CheckDetection.so
# Loading ./../driver/InputDriver.so
# Loading ./../monitor/OutputMonitor.so
# Loading ./../predictor/PulseDetectorRef.so
# Loading /mathworks/hub/3rdparty/R2023a/8709182/share/Questasim/Lin/uvm-1.1d/linux_x86_64/uvm_dpi.so
# ----------------------------------------------------------------
# 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: 251
# 
# [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%)
# ** 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: 347
# 
# [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%)
# ** 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: 347
# 
# [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_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, at_least=   1 (   COVERED)
#    Time: 650 us  Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 369
# ** Info: Instance coverage for verify 'pulsedetector_tb:744', coverpoint 'pass_cp': metric=100.00, at_least=   1 (   COVERED)
#    Time: 650 us  Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 369
# ** 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: 376
# 
# --- 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    : /mathworks/hub/3rdparty/R2023a/8709182/share/Questasim/Lin/linux_x86_64/../verilog_src/uvm-1.1d/src/base/uvm_root.svh(430)
#    Time: 650 us  Iteration: 61  Instance: /mw_PulseDetector_top
# End time: 16:17:01 on Jun 16,2023, Elapsed time: 0:00:25
# 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 function fixed2real 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 a fi variable and its bin method.)

SequenceInlineCRT.png

A new test is created, which tells the factory to use the new sequence class when constructing the test bench.

SequenceTestInlineCRT.png

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 test bench 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: 16:17:02 on Jun 16,2023
# 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+/mathworks/hub/3rdparty/R2023a/8709182/share/Questasim/Lin/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: 16:17:02 on Jun 16,2023, Elapsed time: 0:00:00
# Errors: 0, Warnings: 3
# vsim "+UVM_TESTNAME=mw_PulseDetector_test_inlineCRT" -L work -voptargs="+acc" -sv_lib ../DPI_dut/PulseDetector -sv_lib ../sequence/GenPulse -sv_lib ../scoreboard/CheckDetection -sv_lib ../driver/InputDriver -sv_lib ../monitor/OutputMonitor -sv_lib ../predictor/PulseDetectorRef "+UVM_TESTNAME=mw_PulseDetector_test" mw_PulseDetector_top "+define+MG_SIM" 
# Start time: 16:17:02 on Jun 16,2023
# ** 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 linux_x86_64 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.so
# Loading ./../sequence/GenPulse.so
# Loading ./../scoreboard/CheckDetection.so
# Loading ./../driver/InputDriver.so
# Loading ./../monitor/OutputMonitor.so
# Loading ./../predictor/PulseDetectorRef.so
# Loading /mathworks/hub/3rdparty/R2023a/8709182/share/Questasim/Lin/uvm-1.1d/linux_x86_64/uvm_dpi.so
# ----------------------------------------------------------------
# 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: 251
# 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
# 
# 
# [FrameNum=  0] No peak found in Ref or Impl.
# 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
# 
# 
# [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
# ** 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: 347
# 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.9062, Loc=4936
# 
# 
# [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%)
# ** 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: 347
# 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
# 
# 
# [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%)
# 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
# 
# 
# [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%)
# ** 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: 347
# 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
# 
# 
# [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%)
# ** 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: 347
# 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.9062, Loc=4936
# 
# 
# [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%)
# ** 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: 347
# 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
# 
# 
# [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%)
# ** 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: 347
# 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
# 
# 
# [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%)
# ** 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: 347
# 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
# 
# 
# [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%)
# ** 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: 347
# 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
# 
# 
# [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%)
# ** 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: 347
# 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
# 
# 
# [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%)
# ** 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: 347
# 
# [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%)
# ** 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: 347
# 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, at_least=   1 (   COVERED)
#    Time: 650 us  Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 369
# ** Info: Instance coverage for verify 'pulsedetector_tb:744', coverpoint 'pass_cp': metric=100.00, at_least=   1 (   COVERED)
#    Time: 650 us  Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 369
# ** 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: 376
# 
# --- 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    : /mathworks/hub/3rdparty/R2023a/8709182/share/Questasim/Lin/linux_x86_64/../verilog_src/uvm-1.1d/src/base/uvm_root.svh(430)
#    Time: 650 us  Iteration: 61  Instance: /mw_PulseDetector_top
# End time: 16:17:23 on Jun 16,2023, Elapsed time: 0:00:21
# 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.

SequenceClassCRT.png

A new test is created, which tells the UVM factory to use the new sequence class when constructing the test bench and also sets the specific SNR bucket through uvm_resource_db.

SequenceTestClassCRT.png

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 test bench 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: 16:17:25 on Jun 16,2023
# 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+/mathworks/hub/3rdparty/R2023a/8709182/share/Questasim/Lin/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: 16:17:25 on Jun 16,2023, Elapsed time: 0:00:00
# Errors: 0, Warnings: 2
# vsim "+UVM_TESTNAME=mw_PulseDetector_test_classCRT" -L work -voptargs="+acc" -sv_lib ../DPI_dut/PulseDetector -sv_lib ../sequence/GenPulse -sv_lib ../scoreboard/CheckDetection -sv_lib ../driver/InputDriver -sv_lib ../monitor/OutputMonitor -sv_lib ../predictor/PulseDetectorRef "+UVM_TESTNAME=mw_PulseDetector_test" mw_PulseDetector_top "+define+MG_SIM" 
# Start time: 16:17:25 on Jun 16,2023
# ** Note: (vsim-8009) Loading existing optimized design _opt
# //  Questa Sim-64
# //  Version 2022.2 linux_x86_64 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.so
# Loading ./../sequence/GenPulse.so
# Loading ./../scoreboard/CheckDetection.so
# Loading ./../driver/InputDriver.so
# Loading ./../monitor/OutputMonitor.so
# Loading ./../predictor/PulseDetectorRef.so
# Loading /mathworks/hub/3rdparty/R2023a/8709182/share/Questasim/Lin/uvm-1.1d/linux_x86_64/uvm_dpi.so
# ----------------------------------------------------------------
# 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: 251
# 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
# 
# 
# [FrameNum=  0] No peak found in Ref or Impl.
# 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
# 
# 
# [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%)
# ** 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: 347
# 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
# 
# 
# [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%)
# 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
# 
# 
# [FrameNum=  3] No peak found in Ref or Impl.
# 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.4062
# 
# 
# [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%)
# 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
# 
# 
# [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%)
# 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.9062
# 
# 
# [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%)
# 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
# 
# 
# [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%)
# 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
# 
# 
# [FrameNum=  8] No peak found in Ref or Impl.
# 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
# 
# 
# [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%)
# ** 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: 347
# 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
# 
# 
# [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%)
# 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
# 
# 
# [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_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, at_least=   1 (   COVERED)
#    Time: 650 us  Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 369
# ** Info: Instance coverage for verify 'pulsedetector_tb:744', coverpoint 'pass_cp': metric=100.00, at_least=   1 (   COVERED)
#    Time: 650 us  Scope: CheckDetection_dpi_pkg.VerifyInterfaceT.reportVerifyCoverage File: ../scoreboard/CheckDetection_dpi_pkg.sv Line: 369
# ** 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: 376
# 
# --- 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    : /mathworks/hub/3rdparty/R2023a/8709182/share/Questasim/Lin/linux_x86_64/../verilog_src/uvm-1.1d/src/base/uvm_root.svh(430)
#    Time: 650 us  Iteration: 61  Instance: /mw_PulseDetector_top
# End time: 16:17:44 on Jun 16,2023, 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.

SequenceNoDPI.png

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.

See Also

Related Topics