主要内容

UVM测试台架序列随机约束

这个例子展示了如何将约束随机验证添加到由Simulink®生成的通用验证方法(UVM)测试台架中。金宝appSimul金宝appink参数和刺激生成的输入端口都在UVM测试台中产生了可随机序列类数据成员。通过使用标准的UVM类继承和工厂重写,设计验证工程师可以向他们的UVM测试套件中添加新的和有价值的约束随机测试用例。

简介

本例扩展了脉冲生成UVM测试平台,以添加约束随机测试。参见示例从Simulink生成参数化UVM测试台架金宝app介绍UVM测试台的设计和背景。要为这个例子生成默认的测试平台,执行:

生成一个UVM测试平台设计=“prm_uvmtb / PulseDetector”序列=“prm_uvmtb / GenPulse”记分板=“prm_uvmtb / CheckDetection”Uvmbuild(设计、序列、记分牌)

脉冲发生器的参数化

在该模型中,刺激生成使用一个对话框参数来表示脉冲位置,并使用一个输入端口来表示信噪比(SNR)。在生成的UVM中,这些参数是mw_PulseDetector_sequence使用反映模型信息的约束初始化。

看到mw_PulseDetector_sequence.sv

  • 的对话框参数GenPulse子系统表示在较大的5000个采样帧中64个采样脉冲的起始位置。使用Simulink.Parameter保存在SystemVerilog中金宝app。在该参数中,默认值是2100,有效范围是[0,4936]。(脉冲必须完全在5000个样本的范围内。)

在生成的UVM代码中,在脉冲位置序列成员上放置了两个约束,用于默认值和min, max范围,如以下代码片段所示:

  • 信噪比端口:该产生子系统的输入端口表示产生的脉冲与产生的噪声的总体幅度关系。它的数据类型是aufix8_En6内禀范围为[0,3.984375]的定点数。端口本身被赋予了一个更受限制的范围[0,2.984375],它对应于固定点位值0b00_000000,0b10_111111。

因为它是一个输入端口,所以在Simulink中没有默认值的概念。金宝app在生成的UVM代码中,在序列成员上放置了两个约束,分别是最小值、最大值范围以及与最小值匹配的默认值。还添加了代码来支持通过加号参数覆盖命令行默认金宝app值。示例代码:

默认的UVM模拟行为

默认的序列生成身体()遵循通常的模式获得授权,随机化一个序列项目,将其发送到测序仪,然后等待其完成。

由于默认值约束,如果您运行默认测试,它将为参数使用固定值。对于这个模型,这意味着脉冲起始位置为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 -do run_tb_mq。做% ModelSim/QuestaSim (gui)!Vsim -c -do run_tb_mq.使用实例做% ModelSim/QuestaSim(控制台)!./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 ()覆盖后,将随机值打印出来,这样信噪比值就可以与是否检测到脉冲相关。它使用了一个类效用函数fixed2real给一个友好的值。

  • randomize_params ()override,一个内联约束“randomize with”将信噪比值限制在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 -do run_tb_mq。做% ModelSim/QuestaSim (gui)!Vsim -c -do run_tb_mq.使用实例做% ModelSim/QuestaSim(控制台)!./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设置特定的信噪比桶。

要使用这些新类运行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 -do run_tb_mq。做% ModelSim/QuestaSim (gui)!Vsim -c -do run_tb_mq.使用实例做% ModelSim/QuestaSim(控制台)!./run_tb_xcelium.sh % Xcelium (console)!./run_tb_vcs.sh % VCS (console)cd. . / . . / . .

检查输出,查看生成的信噪比始终高于1.4844,并且脉冲起始位置访问为loc_bucket定义的每个范围。您还可以确认,当一个位置为0时,因为没有创建脉冲,所以没有检测到脉冲。

绕过Simul金宝appink刺激生成

上面生成的序列使用随机化来影响底层GenPulse DPI-C函数的输入参数和参数。实际的事务值是这些函数的输出。如果希望完全控制交付给排序器的实际事务,可以绕过通常的DPI调用并随机化要求的事情数据成员。

看到mw_PulseDetector_SEQCRT_param_overrides.sv

在这种情况下,因为脉冲、系数和噪声都是相互关联的,完全随机它们的值不会产生有效的测试用例。但是这种技术对于其他事务类型也很有用。

结论和下一步

在一个完整的UVM环境中,无论何时引入随机化,通常都必须包括覆盖范围,并确保环境的不同部分知道生成了哪些随机值。在这些例子中,随机值被简单地打印出来。为生成的信噪比和位置值增加覆盖率,并将其与检测和错误阈值联系起来,这是留给读者的练习。