主要内容

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

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

介绍

这个例子扩展了一个脉冲产生UVM测试平台,添加了约束随机测试。看这个例子从Simulink生成参数化UVM测试台金宝app,以了解设计和生成UVM测试台的背景。要为这个示例生成默认的测试工作台,请执行:

%生成UVM测试台设计=“prm_uvmtb/脉冲检测器”序列=“prm_uvmtb/GenPulse”记分牌=“prm_uvmtb / CheckDetection”uvmbuild(设计、顺序、记分板)

脉冲发生器的参数化

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

看见兆瓦脉冲检波器.

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

在生成的UVM代码中,脉冲位置序列成员上放置了两个默认值和最小、最大范围的约束,如此代码段所示:

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

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

默认UVM模拟行为

默认的序列生成身体()按照通常的模式获得拨款,将序列项随机化,发送给sequencer,然后等待完成。

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

%清除影响UVM模拟的环境变量环境变量额外的UVM SIM参数环境变量额外费用环境变量UVM_TOP_MODULE
%使用plusarg覆盖模拟UVM试验台光盘uvm_构建/prm_uvmtb_uvm_测试台/顶部环境变量额外的UVM SIM参数+信噪比默认值输入值=10000000! vsim-do run_tb_mq.do%ModelSim/QuestaSim(gui)!Vsim -c -do run_tb_mq。做% ModelSim/QuestaSim(控制台)! ./运行_tb_incisive.sh%incisive(控制台)! ./运行\u tb\u xcelium.sh%xcelium(控制台)! ./运行_tb_vcs.sh%vcs(控制台)光盘. . / . . / . .

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

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

看见mw_脉冲检测器_SEQCRT_param_.sv.

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

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

  • post_随机化()覆盖,随机值被打印出来,这样SNR值可以与是否检测到脉冲相关。它使用一个类实用程序函数固定的给予友好的评价。

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

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

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

%使用内联约束替代模拟UVM测试台光盘uvm_构建/prm_uvmtb_uvm_测试台/顶部环境变量额外费用“-f../../../overrides_SEQCRT/extra_comp_args.f”环境变量额外的UVM SIM参数+UVM_TESTNAME=mw_脉冲检测器_test_inlineCRT! vsim-do run_tb_mq.do%ModelSim/QuestaSim(gui)!Vsim -c -do run_tb_mq。做% ModelSim/QuestaSim(控制台)! ./运行_tb_incisive.sh%incisive(控制台)! ./运行\u tb\u xcelium.sh%xcelium(控制台)! ./运行_tb_vcs.sh%vcs(控制台)光盘. . / . . / . .

检查输出,查看生成的SNR始终在[0.75,1.00]之间,脉冲起始位置始终为4936。在这样的信噪比范围内,观察有时检测到脉冲,有时检测不到脉冲。

使用基于类的约束的约束随机验证

内联约束适用于特定测试条件下的珩磨。对于fancier约束随机测试,可以在派生序列类中创建新的约束语句块。这里,testplan要求脉冲的位置在帧的开始、中间和结尾使用特定的感兴趣位置“bucket”在帧中变化。0的特殊位置可确保在不产生脉冲时,不会检测到脉冲。同样地,对于SNR,定义了几种感兴趣的SNR范围,例如SNR_从未检测到和SNR_始终检测到。testwriter现在可以轻松地使用这些约束来覆盖这些场景。

看见mw_脉冲检测器_SEQCRT_param_.sv.

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

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

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

  • 添加一个“snr_bucket”成员。它不是随机的,而是由testwriter设置的。

  • 使用选定的snr_桶表示在特定snr范围内的随机化。

  • 关闭冲突的默认值约束

  • 打印出随机值的检查期间模拟

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

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

%使用派生序列类重写模拟UVM测试台光盘uvm_构建/prm_uvmtb_uvm_测试台/顶部环境变量额外费用“-f../../../overrides_SEQCRT/extra_comp_args.f”环境变量额外的UVM SIM参数+UVM\u测试名称=mw\u脉冲检测器\u测试\u类别CRT! vsim-do run_tb_mq.do%ModelSim/QuestaSim(gui)!Vsim -c -do run_tb_mq。做% ModelSim/QuestaSim(控制台)! ./运行_tb_incisive.sh%incisive(控制台)! ./运行\u tb\u xcelium.sh%xcelium(控制台)! ./运行_tb_vcs.sh%vcs(控制台)光盘. . / . . / . .

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

旁路Simul金宝appink刺激生成

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

看见mw_脉冲检测器_SEQCRT_param_.sv.

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

结论和下一步

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