添加随机约束序列UVM试验台
这个例子展示了如何将约束随机验证添加到一个通用的验证方法(UVM)试验台从模型生成®。金宝app模型参数和金宝app输入端口刺激生成结果randomizable序列类数据成员UVM试验台。通过使用标准UVM类继承和工厂覆盖,设计验证工程师可以添加新的和有价值的约束随机测试UVM测试套件。
介绍
这个例子扩展脉冲一代UVM添加约束随机测试试验台。看这个例子从模型生成参数化UVM试验台金宝app
对设计和背景的描述生成UVM试验台。生成的默认试验台这个例子中,执行:
%生成UVM试验台设计=“prm_uvmtb / PulseDetector”序列=“prm_uvmtb / GenPulse”记分板=“prm_uvmtb / CheckDetection”uvmbuild(设计、序列、记分板)
脉冲发生器的参数化
模型中刺激生成参数化使用对话框参数的脉冲位置和一个输入端口的信噪比(信噪比)。在生成UVM,这些参数数据成员mw_PulseDetector_sequence
类约束条件反映的信息模型。
看到mw_PulseDetector_sequence.sv。
pPulseLocation:这个对话框的参数
GenPulse
子系统显示64年的开始位置采样脉冲在5000年更大的样本框架。SystemVerilog使用Simulink.Parameter保留。金宝app参数,默认值为2100,有效范围是[0,4936]。(脉冲必须完全的框架内5000个样本)。
UVM代码,生成两个约束是放置在脉冲位置序列成员默认值和最小,最大范围内所示的这个代码片段:
信噪比端口:这个输入端口生成子系统显示的总体大小关系生成的脉冲产生的噪音。它的数据类型是一个
ufix8_En6
定点数的范围内在[0,3.984375]。港口本身被赋予了更多限制范围的[0,2.984375]相对应0 b00_000000定点位的值,0 b10_111111。
因为它是一个输入端口没有默认值的概念模型。金宝appUVM代码,生成两个约束的序列最小成员,最大范围以及默认值相匹配的最小值。代码也添加到支持命令行通过a +参数默认值覆金宝app盖。示例代码:
默认UVM模拟行为
默认序列生成身体()
遵循通常的模式的格兰特,随机的序列条目,发送它在音序器,然后等待它完成。
因为默认值的限制,如果你运行默认的测试将使用固定参数的值。对于这个模型,这意味着一个脉冲开始位置2100和0.0的信噪比。0.0的信噪比会导致没有检测到脉冲,因此plusarg指定了一个更有趣的默认值。定点比特值8 'b10000000浮动值为2.0。
%明显影响UVM仿真环境变量setenvEXTRA_UVM_SIM_ARGSsetenvEXTRA_UVM_COMP_ARGSsetenvUVM_TOP_MODULE
%模拟UVM试验台使用plusarg覆盖cduvm_build prm_uvmtb_uvm_testbench /setenvEXTRA_UVM_SIM_ARGS+ SNR_default_inp_val = 10000000!vsim - run_tb_mq。% ModelSim / QuestaSim (gui)!vsim - c - run_tb_mq。% ModelSim / QuestaSim(控制台)!/ run_tb_xcelium。sh % Xcelium(控制台)!/ run_tb_vcs。sh % VCS(控制台)cd. . / . . / . .
限制使用如何嵌入约束随机验证
您可以使用标准UVM技术随机行为添加到刺激的一代。在这个例子中,testplan呼吁使用信噪比0.75和1.00之间的值来确定可靠的算法检测脉冲在这个范围内。对于这种情况,脉冲的位置并不重要,是固定的5000年末的样本帧。
看到mw_PulseDetector_SEQCRT_param_overrides.sv。
为了实现这个测试规划目标,派生类创建序列。它具有以下额外的行为:
在
pre_body ()
覆盖,使用默认值约束是关闭的在
post_randomize ()
覆盖,随机值打印出来,以便相关信噪比值可以是否检测到脉冲。它使用一个效用函数的类fixed2real
给一个友好的价值。在
randomize_params ()
覆盖,一个内联约束“随机”限制了信噪比的值在0.75和1.0之间。(你可以通过使用这些位的值从MATLAB fi变量及其本方法)。
创建一个新的测试告诉工厂使用新的序列类构建试验台。
运行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。% ModelSim / QuestaSim (gui)!vsim - c - run_tb_mq。% ModelSim / QuestaSim(控制台)!/ run_tb_xcelium。sh % Xcelium(控制台)!/ run_tb_vcs。sh % VCS(控制台)cd. . / . . / . .
检查输出,看看生成的信噪比总是[0.75,1.00]和脉冲位置总是4936年开始。与这样一个信噪比范围内,观察到有时脉冲检测,有时它不是。
约束随机验证使用基于类的约束
内联约束有利于定制特定的试验条件。发烧友约束随机测试,您可以创建新的约束语句块在派生类序列。这里,testplan要求中脉冲的位置不同的框架使用特定的“水桶”有趣的位置开始,中间和结束帧。一个特殊的位置0确保创建没有脉冲时,没有检测到脉冲。同样,对于信噪比,几类有趣的信噪比范围如SNR_never_detected和SNR_always_detected定义。testwriter现在可以很容易地使用这些约束来覆盖这些场景。
看到mw_PulseDetector_SEQCRT_param_overrides.sv。
为了实现这些目标,派生类序列有以下额外的行为:
添加一个“loc_bucket”成员声明为“randc”。
使用,loc_bucket成员意味着位置范围。
添加一个“snr_bucket”成员。这不是随机的,而是由testwriter设置。
使用所选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 - run_tb_mq。% ModelSim / QuestaSim (gui)!vsim - c - run_tb_mq。% ModelSim / QuestaSim(控制台)!/ run_tb_xcelium。sh % Xcelium(控制台)!/ run_tb_vcs。sh % VCS(控制台)cd. . / . . / . .
检查输出的信噪比总是高于1.4844,产生脉冲起始位置是loc_bucket访问每个定义的范围。你也可以确认当一个位置是0,因为没有创建脉冲时,没有检测到脉冲。
绕过仿真软件刺金宝app激一代
上面生成的序列使用随机化影响输入参数和参数对底层GenPulse DPI-C功能。这些函数的实际交易值输出。如果你想要完全控制的实际事务交付给音序器,你可以绕过通常DPI和随机的电话要求的事情
数据成员。
看到mw_PulseDetector_SEQCRT_param_overrides.sv。
系数,在这种情况下,因为脉冲和噪声都是相互关联的,完全随机化它们的值不会产生有效的测试用例。但这种技术是有用的其他事务类型。
结论和下一步
在全UVM环境中,只要介绍了随机化通常是必要的包括覆盖,确保环境的不同部分都知道生成随机值。在这些例子中随机值是简单地打印出来。添加覆盖生成的信噪比和位置值——和那些相关的检测和误差阈值是留给读者的一个练习。