主要内容

用基于轴的RTL DUT代替UVM试验台的行为DUT

这个例子展示了如何从简单的行为DUT接口转移到使用AXI Lite和AXI Stream总线协议的RTL DUT接口。一些UVM组件必须更改,例如驱动程序和监视器,但是原始的测试台架结构以及序列和记分牌组件可以重新使用而无需修改。

简介

参见示例从Simulink生成参数化UVM测试台架金宝app介绍UVM测试台的设计和背景。要为这个例子生成默认的测试平台,执行:

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

Simulink中的D金宝appUT表示脉冲检测器的功能行为,不使用任何典型的HDL IP核的硬件协议接口。UVM测试台使用Simulink设计作为实际HDL实现的金宝app替身。验证工作流的下一步是将使用基于axis的协议的实际HDL实现集成到相同生成的UVM测试台中。

要使用RTL DUT,必须替换UVM测试台的部分,如蓝色所示:

将端口映射到AXI接口

对于这个RTL DUT,多项式系数端口映射到处理器接口AXI4-Litedata_in端口映射到一个AXI4-Stream从接口data_out端口映射到AXI4-Stream主接口,如下所示。

您可以手动编写这个RTL或使用HDL Coder的IP核生成工作流来创建它。该模型具有一种变体算法,可以使用HDL Coder产品生成HDL IP核。

在Simulink中模拟HDL变体金宝app

要使用此变体进行模拟,执行:

模拟RTL可生成的算法变体set_param (“prm_uvmtb / PulseDetector”“LabelModeActiveChoice”“高密度”) set_param (“prm_uvmtb / CheckDetection / ExpectsDelay”“LabelModeActiveChoice”帧的延迟) sim卡(“prm_uvmtb”

[FrameNum= 0] Ref或Impl中没有峰值。[FrameNum= 1]峰值位置=2163.000000,mag-平方=0.280,使用全局max [FrameNum= 1]从impl检测到的峰值mag-平方=2170错误(abs)=7 [FrameNum= 1]从impl检测到的峰值mag-平方=2163.000000,错误(abs)=0.000错误(pct)=0.017 [FrameNum= 2]从impl检测到的峰值mag-平方=2170错误(abs)=7 [FrameNum= 2]从impl检测到的峰值mag-平方=0.199,错误(abs)=0.000错误(pct)=0.190 [FrameNum= 3]峰值位置=2163.000000,使用全局max [FrameNum= 3]从impl检测到的峰值=2170错误(abs)=7 [FrameNum= 3]从impl检测到的峰值mag-squared= 0.223,错误(abs)=0.000错误(pct)=0.183 [FrameNum= 4]从impl检测到的峰值mag-squared= 2163.000000错误(abs)=7 [FrameNum= 4]从impl检测到的峰值mag-squared=0.200,错误(abs)=0.000错误(pct)=0.043 [FrameNum= 5]峰值位置=2163.000000,使用全局max [FrameNum= 5]从impl中检测到的峰值=2170错误(abs)=7 [FrameNum= 5]从impl中检测到的峰值mag-squared=0.255,错误(abs)=0.000错误(pct)=0.031 [FrameNum= 6]从impl中检测到的峰值mag-squared= 2163.000000错误(abs)=7 [FrameNum= 6]从impl中检测到的峰值mag-squared=0.241,错误(abs)=0.000错误(pct)=0.187 [FrameNum= 7]峰值位置=2163.000000,使用全局max [FrameNum= 7]从impl检测到的峰值=2170错误(abs)=7 [FrameNum= 7]从impl检测到的峰值mag-squared=0.241,错误(abs)=0.000错误(pct)=0.019 [FrameNum= 8]从impl检测到的峰值mag-squared= 2163.000000错误(abs)=7 [FrameNum= 8]从impl检测到的峰值mag-squared=0.225,错误(abs)=0.000错误(pct)=0.032 [FrameNum= 9]峰值位置=2163.000000,使用全局max [FrameNum= 9]从impl检测到的峰值=2170错误(abs)=7 [FrameNum= 9]从impl检测到的峰值mag-squared=0.239,错误(abs)=0.001错误(pct)=0.241 [FrameNum= 10]峰值位置=2163.000000,使用全局max检测到的峰值mag-squared=0.225 [FrameNum= 10]从impl检测到的峰值mag-squared=0.225,错误(abs)=0.000错误(pct)=0.146

生成HDL

如果您有HDL Coder,您可以设置一个工具路径并为该变体生成RTL。例如,要创建Xilinx Vivado兼容IP,您可以插入您的工具路径并执行以下命令:

生成基于axis的RTL HDL IP(需要HDL编码器)hdlsetuptoolpath (“ToolName”“Xilinx Vivado”“路径”' /工具/ Vivado / 2018.3 / bin / Vivado ') prm_uvmtb_hdlworkflow

这将把生成的HDL IP文件放在hdl_prj/hdlsrc/prm_uvmtb中。然而,RTL实现已经包含在这个演示中,位于overrides_AXIDUT/AXIIPSource中,因此不需要HDL Coder许可证。

覆盖必要的UVM组件

替换原始DUT的UVM文件位于overrides_AXIDUT中。不需要从原始文件中修改任何生成的文件uvmbuild调用。

模拟UVM试验台

使用新的RTL DUT执行测试台架,以验证UVM执行与Simulink执行是否匹配。金宝app因为序列是用信噪比输入端口参数化的,所以在UVM中它的默认值是0.0。为了正确地比较模拟运行,我们需要将其默认值更改为2.0(其位值为0b10_000000),以匹配Simulink;金宝app这可以通过一个plusarg完成,我们通过一个环境变量传递给脚本。

我们有许多新的RTL文件要编译,我们必须重写顶层设计单元。我们通过环境变量将这些更新传递给脚本。

清除影响UVM模拟的环境变量setenvEXTRA_UVM_SIM_ARGS;setenvEXTRA_UVM_COMP_ARGS;setenvUVM_TOP_MODULE使用AXI RTL DUT模拟UVM试验台cduvm_build prm_uvmtb_uvm_testbench /setenvEXTRA_UVM_COMP_ARGS“- f  ../../../ overrides_AXIDUT / extra_comp_args.f 'setenvEXTRA_UVM_SIM_ARGS' + SNR_default_inp_val = 10000000 + UVM_TESTNAME = mw_PulseDetector_AXIRTL_test 'setenvUVM_TOP_MODULEmw_PulseDetector_AXIRTL_top!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. . / . . / . .

仿真日志和波形片段如下所示。注意,日志显示了与之前相同的结果,5个检测到的脉冲。但是,还要注意波形显示不同的执行设计的时间。对于5000个信号样本的每一帧,64个系数首先通过处理器接口编程,然后对5000个样本进行流式处理,而不是始终稳定的有效数据流。

结论和下一步

这个例子展示了如何使用Simulink开发的设计和测试平台来生成一个完全可执行的UVM测试平台。金宝app的uvmbuild命令自动生成、编译关键组件并将其集成到UVM框架中。

HDL验证工程师可以从Simulink中确认总体覆盖率,并使用自己的本地UVM序列库增加覆盖率。金宝app

他们还可以用RTL设计代替Simulink中的行为设计,RTL设计被封装在诸如AXI4之类的硬件协议金宝app中,无需更改原始的序列生成器和响应检查器。