这个示例演示了如何将约束随机验证添加到由Simulink®生成的通用验证方法(UVM)测试台上。万博1manbetxSimul万博1manbetxink参数和刺激生成的输入端口都导致UVM测试台上的随机序列类数据成员。通过使用标准的UVM类继承和工厂覆盖,设计验证工程师可以将新的有价值的受限随机测试用例添加到他们的UVM测试套件中。
这个例子扩展了一个脉冲产生UVM测试平台,添加了约束随机测试。看这个例子从Simulink生成参数化UVM测试台万博1manbetx
,以了解设计和生成UVM测试台的背景。要为这个示例生成默认的测试工作台,请执行:
%生成UVM测试台设计=“prm_uvmtb / PulseDetector”序列=“prm_uvmtb / GenPulse”记分板=“prm_uvmtb / CheckDetection”uvmbuild(设计、序列、记分板)
在模型中,刺激产生被参数化,使用一个用于脉冲位置的对话参数和用于信噪比(SNR)的输入端口。在生成的UVM中,这些参数是mw_PulseDetector_sequence
使用反映来自模型的信息的约束类。
看到mw_PulseDetector_sequence.sv.
的对话框参数GenPulse
子系统指示64采样脉冲在更大的5000采样帧中的起始位置。要保留在SystemVerilog中使用Simulink.Paramete万博1manbetxr。该参数默认值为2100,有效范围为[0,4936]。(脉冲必须完全在5000个样本的帧内。)
在生成的UVM代码中,对脉冲位置序列成员施加了两个约束,一个是默认值,一个是最小、最大范围,如下面的代码片段所示:
信噪比端口:产生子系统的这个输入端口表示产生的脉冲与产生的噪声的总体幅度关系。它的数据类型是ufix8_En6
固有范围为[0,3.984375]的定点数。端口本身被赋予了一个更受限的范围[0,2.984375],它对应于定点位值0b00_000000, 0b10_111111。
因为它是一个输入端口,所以在Simulink中没有默认值的概念。万博1manbetx在生成的UVM代码中,对sequence成员设置了两个约束,以确定最小、最大范围以及匹配最小值的默认值。还添加了代码,通过加参数来支持命令行默认值覆万博1manbetx盖。示例代码:
默认序列生成身体()
按照通常的模式获得拨款,随机分配一个序列项目,将其发送给测序者,然后等待其完成。
由于有默认值约束,如果您运行默认测试,它将为参数使用固定的值。对于这个模型,这意味着脉冲起始位置为2100,信噪比为0.0。一个0.0的信噪比将导致没有可检测的脉冲,所以一个plusarg指定一个更有趣的默认值。8'b10000000的定点位值是2.0的浮点值。
%清除影响UVM模拟的环境变量setenvEXTRA_UVM_SIM_ARGSsetenvEXTRA_UVM_COMP_ARGSsetenvUVM_TOP_MODULE
%使用plusarg覆盖模拟UVM测试台cduvm_build prm_uvmtb_uvm_testbench /setenvEXTRA_UVM_SIM_ARGS+ SNR_default_inp_val = 10000000!vsim - run_tb_mq。do % ModelSim/QuestaSim (gui)!Vsim -c -do run_tb_mq。做% ModelSim/QuestaSim(控制台)!./run_tb_incisive.sh % Incisive (console)!./run_tb_xcelium.sh % Xcelium (console)!./run_tb_vcs.sh % VCS (console)cd. . / . . / . .
您可以使用标准的UVM技术将随机行为添加到刺激生成中。在这个例子中,测试计划要求使用0.75到1.00之间的信噪比值来确定算法在检测这一范围内的脉冲时的鲁棒性。对于这种情况,脉冲的位置并不重要,它固定在5000个样本帧的末端。
看到mw_PulseDetector_SEQCRT_param_overrides.sv.
为了实现这个测试计划目标,创建了一个派生序列类。它有以下额外的行为:
在pre_body ()
重载时,默认值约束的使用将关闭
在post_randomize ()
override时,打印出随机化值,使信噪比值与是否检测到脉冲有关。它使用一个类实用函数fixed2real
给出一个友好的值。
在randomize_params ()
override,一个“随机化”的内联约束将信噪比值限制在0.75到1.0之间。(您可以通过使用fi变量及其bin方法从MATLAB中获得这些位值。)
创建一个新的测试,它告诉工厂在构造测试台时使用新的序列类。
要使用这些新类运行UVM模拟,您可以使用带有环境变量提供的额外参数的原始脚本。
%使用内联约束覆盖模拟UVM测试台cduvm_build prm_uvmtb_uvm_testbench /setenvEXTRA_UVM_COMP_ARGS“- f ../../../ overrides_SEQCRT / extra_comp_args.f 'setenvEXTRA_UVM_SIM_ARGS+ UVM_TESTNAME = mw_PulseDetector_test_inlineCRT!vsim - run_tb_mq。do % ModelSim/QuestaSim (gui)!Vsim -c -do run_tb_mq。做% ModelSim/QuestaSim(控制台)!./run_tb_incisive.sh % Incisive (console)!./run_tb_xcelium.sh % Xcelium (console)!./run_tb_vcs.sh % VCS (console)cd. . / . . / . .
检查输出,看看产生的信噪比总是在[0.75,1.00]之间,并且脉冲起始位置总是4936。在这样的信噪比范围内,观察有时探测到脉冲,有时探测不到脉冲。
内联约束有利于在特定的测试条件下进行珩磨。对于更严格的约束随机测试,您可以在派生序列类中创建新的约束语句块。在这里,测试计划要求脉冲的位置在帧的开始、中间和结束使用特定的“桶”有趣的位置在整个帧中变化。一个特殊的位置0确保当没有产生脉冲时,没有检测到脉冲。同样,对于信噪比,定义了几个有趣的信噪比范围类别,如SNR_never_detected和SNR_always_detected。测试编写人员现在可以轻松地使用这些约束来覆盖这些场景。
看到mw_PulseDetector_SEQCRT_param_overrides.sv.
为了实现这些目标,派生的序列类具有以下额外行为:
添加一个“loc_bucket”成员,声明为“randc”。
使用loc_bucket成员暗示位置范围。
添加一个snr_bucket成员。它不是随机的,而是由测试者设定的。
使用选定的snr_bucket来暗示特定信噪比范围内的随机化。
关闭冲突的默认值约束
打印出随机值的检查期间模拟
创建一个新的测试,它告诉UVM工厂在构造测试台时使用新的序列类,并通过uvm_resource_db设置特定的SNR桶。
要使用这些新类运行UVM模拟,您可以使用带有环境变量提供的额外参数的原始脚本。
%使用派生序列类重写模拟UVM测试台cduvm_build prm_uvmtb_uvm_testbench /setenvEXTRA_UVM_COMP_ARGS“- f ../../../ overrides_SEQCRT / extra_comp_args.f 'setenvEXTRA_UVM_SIM_ARGS+ UVM_TESTNAME = mw_PulseDetector_test_classCRT!vsim - run_tb_mq。do % ModelSim/QuestaSim (gui)!Vsim -c -do run_tb_mq。做% ModelSim/QuestaSim(控制台)!./run_tb_incisive.sh % Incisive (console)!./run_tb_xcelium.sh % Xcelium (console)!./run_tb_vcs.sh % VCS (console)cd. . / . . / . .
检查输出,查看生成的信噪比始终高于1.4844,并且脉冲启动位置访问了为loc_bucket定义的每个范围。您还可以确认当位置为0时,因为没有创建脉冲,所以没有检测到脉冲。
上面生成的序列使用随机化来影响底层GenPulse DPI-C函数的输入参数和参数。实际的事务值是这些函数的输出。如果您想完全控制交付给排序器的实际事务,您可以绕过通常的DPI调用并随机化要求的事情
数据成员。
看到mw_PulseDetector_SEQCRT_param_overrides.sv.
在这种情况下,因为脉冲、系数和噪声都是相互关联的,完全随机化它们的值将不会产生有效的测试用例。但是这种技术对于其他事务类型也很有用。
在完整的UVM环境中,无论何时引入随机化,通常都必须包括覆盖范围,并确保环境的不同部分知道生成了哪些随机值。在这些示例中,随机值只是简单地打印出来。为生成的信噪比和位置值添加覆盖率——并将这些值与检测和错误阈值关联起来——这是留给读者的练习。