主要内容

向UVM测试台中的序列添加随机约束

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

介绍

此示例扩展了脉冲生成UVM测试台,以添加受约束的随机测试。请参见示例从Simulink生成参数化UVM测试台金宝app有关生成UVM测试台的设计和背景说明。要生成此示例的默认测试台,请执行:

%生成UVM测试台设计=“prm_uvmtb / PulseDetector”序列=“prm_uvmtb/GenPulse”记分板=“prm_uvmtb/检查检测”uvmbuild(设计、顺序、记分板)

脉冲发生器的参数化

在该模型中,使用用于脉冲位置的对话框参数和用于信噪比(SNR)的输入端口来参数化刺激生成。在生成的UVM中,这些参数是微波脉冲检测器序列使用反映模型信息的约束初始化。

看到兆瓦脉冲检波器

  • pPulseLocation:此对话框参数为GenPulse子系统指示64采样脉冲在更大的5000采样帧中的起始位置。要保留在SystemVerilog中使用Simulink.Paramete金宝appr。该参数默认值为2100,有效范围为[0,4936]。(脉冲必须完全在5000个样本的帧内。)

在生成的UVM代码中,对脉冲位置序列成员施加了两个约束,一个是默认值,一个是最小、最大范围,如下面的代码片段所示:

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

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

默认UVM模拟行为

默认序列生成正文()按照通常的模式获得拨款,随机分配一个序列项目,将其发送给测序者,然后等待其完成。

由于有默认值约束,如果您运行默认测试,它将为参数使用固定的值。对于这个模型,这意味着脉冲起始位置为2100,信噪比为0.0。一个0.0的信噪比将导致没有可检测的脉冲,所以一个plusarg指定一个更有趣的默认值。8'b10000000的定点位值是2.0的浮点值。

%清除影响UVM模拟的环境变量环境变量EXTRA_UVM_SIM_ARGS环境变量额外费用环境变量UVM_顶部_模块
%使用plusarg覆盖模拟UVM试验台cduvm_build prm_uvmtb_uvm_testbench /环境变量EXTRA_UVM_SIM_ARGS+信噪比默认值输入值=10000000!vsim - run_tb_mq。do % ModelSim/QuestaSim (gui)!vsim-c-do run_tb_mq.do%ModelSim/QuestaSim(控制台)! ./运行_tb_incisive.sh%incisive(控制台)! ./运行\u tb\u xcelium.sh%xcelium(控制台)!./run_tb_vcs.sh % VCS (console)cd../../..

使用内联约束的约束随机验证

您可以使用标准UVM技术将随机行为添加到刺激生成中。在本例中,测试计划要求使用0.75到1.00之间的SNR值来确定算法在该范围内检测脉冲的鲁棒性。在这种情况下,脉冲的位置无关紧要,而是固定在5000个采样帧的末尾。

看到mw_PulseDetector_SEQCRT_param_overrides.sv

为了实现这个testplan目标,创建了一个派生的sequence类。它具有以下额外行为:

  • pre_body ()替代时,将禁用默认值约束的使用

  • post_随机化()override时,打印出随机化值,使信噪比值与是否检测到脉冲有关。它使用一个类实用函数fixed2real给出一个友好的值。

  • randomize_params ()覆盖,“随机化”的内嵌约束将SNR值限制在0.75和1.0之间。(您可以使用fi变量及其bin方法从MATLAB中获取这些位值。)

创建了一个新的测试,它告诉工厂在构建测试台时使用新的序列类。

要使用这些新类运行UVM模拟,可以使用原始脚本以及通过环境变量提供的额外参数。

%使用内联约束替代模拟UVM测试台cduvm_build prm_uvmtb_uvm_testbench /环境变量额外费用“- f  ../../../ overrides_SEQCRT / extra_comp_args.f '环境变量EXTRA_UVM_SIM_ARGS+UVM_TESTNAME=mw_脉冲检测器_test_inlineCRT!vsim - run_tb_mq。do % ModelSim/QuestaSim (gui)!vsim-c-do run_tb_mq.do%ModelSim/QuestaSim(控制台)! ./运行_tb_incisive.sh%incisive(控制台)! ./运行\u tb\u xcelium.sh%xcelium(控制台)!./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

为了实现这些目标,派生序列类具有以下额外行为:

  • 添加一个声明为“randc”的“loc_bucket”成员。

  • 使用该loc_bucket成员表示位置范围。

  • 添加一个snr_bucket成员。它不是随机的,而是由测试者设定的。

  • 使用选定的snr_bucket来暗示特定信噪比范围内的随机化。

  • 关闭冲突的默认值约束

  • 打印出随机值,以便在模拟过程中进行检查

创建一个新的测试,它告诉UVM工厂在构造测试台时使用新的序列类,并通过uvm_resource_db设置特定的SNR桶。

要使用这些新类运行UVM模拟,可以使用原始脚本以及通过环境变量提供的额外参数。

%使用派生的序列类覆盖模拟UVM测试台cduvm_build prm_uvmtb_uvm_testbench /环境变量额外费用“- f  ../../../ overrides_SEQCRT / extra_comp_args.f '环境变量EXTRA_UVM_SIM_ARGS+ UVM_TESTNAME = mw_PulseDetector_test_classCRT!vsim - run_tb_mq。do % ModelSim/QuestaSim (gui)!vsim-c-do run_tb_mq.do%ModelSim/QuestaSim(控制台)! ./运行_tb_incisive.sh%incisive(控制台)! ./运行\u tb\u xcelium.sh%xcelium(控制台)!./run_tb_vcs.sh % VCS (console)cd../../..

检查输出,查看生成的SNR始终高于1.4844,且脉冲起始位置正在访问为loc_桶定义的每个范围。您还可以确认,当位置为0时,由于未创建脉冲,因此未检测到脉冲。

旁路Simul金宝appink刺激生成

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

看到mw_PulseDetector_SEQCRT_param_overrides.sv

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

结论和下一步

在完整的UVM环境中,每当引入随机化时,通常必须包括覆盖范围,并确保环境的不同部分知道生成了哪些随机值。在这些示例中,随机化值只是简单地打印出来。为生成的SNR和位置值添加覆盖范围——并将其与检测和错误阈值关联——是留给读者的练习。