主要内容

包括驱动程序和监控在UVM测试台

本示例使用uvmbuild函数生成通用验证方法(UVM)测试台,其中包括来自Simulink®设计和测试台的UVM驱动程序和监视器。金宝app

介绍

在Simulink中从基于框架的行为建模过渡到标量建模需要转换块来转换信号采样时间和大小。金宝app转换块将Simulink测试平台划分为这两个领域。金宝app

  • 基于帧的域:测试平台的一部分,作为帧对数据进行操作。

  • 基于标量的域:作为标量操作和操作数据的测试平台的一部分。

UVM框架使用事务级建模来处理来自序列(刺激生成器)的事务,并在记分牌(检查器)中验证结果事务。

在将Simulink测试台转换为UVM金宝app测试台时,保持这些域的分离是很重要的。域分离支持测试平台组件更好的组件化和可重用性。

在Simulink中进行设计和测试金宝app

编写基于标量的算法,并在其周围添加一个测试平台,使用转换子系统(例如,缓冲区和非缓冲区、速率转换或这些块的组合)将基于框架的域和标量域分开。该模型由一个刺激产生子系统、一个基于标量的被测设计子系统和一个响应检查子系统组成。在刺激产生和被测设备之间引入了额外的转换子系统,将数据从帧转换为标量,在被测设备和响应检查器之间将数据从标量转换为帧。

该示例使用Simulink设计和测金宝app试一个流水线分割cordic算法,并确定给定数量的流水线阶段的最大错误阈值。在本设计中,对七个管道阶段进行了测试。

该设计在Simulink中包含了两个示例时间。金宝app

  • 慢的采样时间(绿色)是基于在DUT中测试的较低层次算法的高层次事务不可知来操作的。在这个例子中,事务由三个向量组成:分子、分母和cordic算法的除法结果。

  • 快速采样时间(红色)是以标量计算的。管道DUT在红色采样时间对两个标量进行采样,当有效输出信号被断言时,经过7个红色采样时间后得到cordic分割结果。

VectorGenerator子系统生成不同的分子和分母向量序列。中定义了向量的大小和范围InitFcn在Simulink模型浏览器下金宝app的回调

VectorToScalar子系统将高级事务(向量)转换为DUT能够理解的标量序列。

ScalarToVector子系统根据它从DUT接收的标量序列组装结果向量。

DivideChecker子系统验证结果向量是否包含在某个错误阈值内的正确分割结果。如果错误大于阈值,则模拟输出警告。此外,DivideChecker子系统输出三个MAT文件,您可以通过绘图来可视化结果。

模型如下图所示:

打开并模拟模型。因为没有触发断言,所以不存在错误阈值违反。

open_system (“drv_and_mon_uvmtb”);r = sim卡(“drv_and_mon_uvmtb”);

模拟将三个MAT文件写入磁盘:num.matden.mat,result_cordic.mat.这些文件分别包含分母、分子和cordic除法的结果。

提供了一个MATLAB函数从MAT文件生成三维散点图。生成的图形有助于可视化误差,并进一步确认误差小于阈值。

plot_cordic_results (“num.mat”“den.mat”“result_cordic.mat”);

图中包含一个轴对象。标题7管道阶段cordic分割错误的轴对象包含一个分散类型的对象。

生成带有驱动程序和监视器的UVM测试台

使用uvmbuild函数将您的设计导出到UVM环境,并指定要映射到UVM驱动程序、监视器或两者的Simulink子系统。金宝app

UVM驱动程序和监视器使您能够区分基于框架的域和基于标量的域。当转换到UVM框架时,基于框架的域映射到UVM事务,而基于标量的域映射到时间感知的UVM组件(驱动程序、dut和监视器)。标准组件定义根据环境的各个部分在模拟中的角色将它们分开。对于这个示例:

  • VectorGenerator子系统被映射到UVM序列。

  • VectorToScalar子系统映射到UVM驱动。

  • Pipelined_Cordic_Divide子系统映射到DPI DUT SystemVerilog模块。

  • ScalarToVector子系统被映射到UVM监视器。

  • 分割器子系统映射到UVM计分板。

要根据Simulink设计生成UVM测试台,请执行以下代码。金宝app

序列=“drv_and_mon_uvmtb / VectorGenerator”;司机=“drv_and_mon_uvmtb / VectorToScalar”;dpi_dut =“drv_and_mon_uvmtb / Pipelined_Cordic_Divide”;moninor =“drv_and_mon_uvmtb / ScalarToVector”;记分板=“drv_and_mon_uvmtb / DivideChecker”;uvmbuild (dpi_dut序列,记分板,“司机”、司机、“监控”, moninor);
###启动DPI子系统生成UVM测试BENCH ###启动构建过程模型:PIPELINED_CORDIC_DIVIDE ###启动SystemVerILOG DPI组件生成###生成DPI H包/ TMP / BDOC21B_1757077_53680 / TP55B1974E / HDLVERIFIER-EX46125948 / UVM_BUILD / DRV_AND_MON_UVMTB_DPI_COMPONENTS/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.h ###生成DPI C包装/tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.c ###生成UVM模块封装/ TMP / Bdoc21b_1757077_53680 / tp55b1974e / hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi_pkg.sv ###生成的SystemVerilog模块/tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.sv ###生成的makefile为:PipelineD_cordic_divide_dpi ###调用制作DPI共享库###成功完成模型构建过程:Pipelined_Cordic_Divide构建摘要顶部模型目标构建:模型动作重建原因======================================================================================================== pipelined_cordic_divide代码生成和编译的代码生成信息文件没有存在。1个中建成的1个(0型号已最新)构建持续时间:0H 0M 34.079S ###开始构建程序的型号:VectorGengenerator ###开始SystemVerilog DPI组件生成###生成DPI H包/ TMP / BDOC21B_1757077_53680 /tp55b1974e / hdlverifier-ex46125948 / uvm_build / drv_and_mon_uvmtb_dpi_components / VectorGenerator_build / VectorGenerator_dpi.h ###生成DPI C包装/tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi.c ###生成UVM模块封装/TMP / Bdoc21b_1757077_53680 / tp55b1974e / hdlverifier-ex46125948 / uvm_build / drv_and_mon_uvmtb_dpi_components / VectorGenerator_build / VectorGenerator_dpi_pkg.sv ###生成的SystemVerilog模块/tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi.sv ###生成的生成文件for:vectorgenerator_dpi ###调用制作dpi sraed library ###成功完成模型的构建过程:VectorGeGenerator构建摘要顶部模型目标构建:模型动作重建原因================================================================================================ vectorgengerator代码生成和编译的代码生成信息文件不存在。 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 14.691s ### Starting build procedure for model: VectorToScalar ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.h ### Generating DPI C Wrapper /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.c ### Generating UVM module package /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi_pkg.sv ### Generating SystemVerilog module /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.sv ### Generating makefiles for: VectorToScalar_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: VectorToScalar Build Summary Top model targets built: Model Action Rebuild Reason =============================================================================================== VectorToScalar Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 11.943s ### Starting build procedure for model: ScalarToVector ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.h ### Generating DPI C Wrapper /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.c ### Generating UVM module package /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi_pkg.sv ### Generating SystemVerilog module /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.sv ### Generating makefiles for: ScalarToVector_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: ScalarToVector Build Summary Top model targets built: Model Action Rebuild Reason =============================================================================================== ScalarToVector Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.271s ### Starting build procedure for model: DivideChecker ### Starting SystemVerilog DPI Component Generation ### Generating DPI H Wrapper /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.h ### Generating DPI C Wrapper /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.c ### Generating UVM module package /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi_pkg.sv ### Generating SystemVerilog module /tmp/Bdoc21b_1757077_53680/tp55b1974e/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.sv ### Generating makefiles for: DivideChecker_dpi ### Invoking make to build the DPI Shared Library ### Successful completion of build procedure for model: DivideChecker Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================== DivideChecker Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 11.827s ### Starting UVM test bench generation for model: drv_and_mon_uvmtb ### Generating UVM transaction object ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/scoreboard/mw_Pipelined_Cordic_Divide_scoreboard_trans.sv ### Generating UVM interface ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_if.sv ### Generating UVM sequence ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/sequence/mw_Pipelined_Cordic_Divide_sequence.sv ### Generating UVM sequence transaction ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/sequence/mw_Pipelined_Cordic_Divide_sequence_trans.sv ### Generating UVM driver ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/driver/mw_Pipelined_Cordic_Divide_driver.sv ### Generating UVM monitor ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/monitor/mw_Pipelined_Cordic_Divide_monitor.sv ### Generating UVM input monitor ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_monitor_input.sv ### Generating UVM agent ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_agent.sv ### Generating UVM scoreboard ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/scoreboard/mw_Pipelined_Cordic_Divide_scoreboard.sv ### Generating UVM scoreboard configuration object ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/scoreboard/mw_Pipelined_Cordic_Divide_scoreboard_cfg_obj.sv ### Generating UVM environment ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_environment.sv ### Generating UVM test ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_test.sv ### Generating UVM top ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/mw_Pipelined_Cordic_Divide_top.sv ### Generating UVM test package ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/drv_and_mon_uvmtb_pkg.sv ### Generating UVM test bench simulation script for Mentor Graphics QuestaSim/Modelsim ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_mq.do ### Generating UVM test bench simulation script for Cadence Incisive ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_incisive.sh ### Generating UVM test bench simulation script for Cadence Xcelium ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_xcelium.sh ### Generating UVM test bench simulation script for Synopsys VCS ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_vcs.sh

如图所示,UVM驱动程序和监视器在不同的目录中生成。

运行UVM测试台

生成的UVM测试台可以通过进入UVM测试台顶层模块目录来执行drv_and_mon_uvmtb_uvmbuild \ uvm_testbench \并执行一个生成的HDL模拟器脚本。本例使用ModelSim/QuestaSim®。图中显示了要执行的命令。

要确认UVM模拟与Simulink测试台匹配,请检查此要求。金宝app

  • 没有抛出错误阈值冲突。这可以通过查看UVM模拟日志并检查不存在UVM错误来验证。UVM仿真日志如图所示。

  • UVM记分板输出三个MAT文件(num.matden.mat,result_cordic.mat),在UVM仿真的最后。从视觉上看,由Simulink设计生成的三维散点图必须与UVM仿真的图相匹配。金宝appUVM模拟MAT文件的绘图可以使用以下命令生成:

得到的UVM仿真三维散点图如图所示。图与前面几节中显示的Simulink设计图金宝app相匹配。

结论

在Simulink和UVM框架中保持基于框架和基于标量的行为建模分离会带来这些好处。金宝app

  • 域分离允许在更高的抽象级别上对基于框架的事务处理进行建模,而不必引入较低级别的转换,这依赖于正在开发的算法。

  • VectorGenerator和DivideChecker子系统可以在不同的Simulink或UVM项目中重用,这些项目有不同的算法,但需要相同的高级事务金宝app生成和检查。

  • 域分离使DUT算法具有多速率特性。

  • 域分离允许高级事务以不同于DUT的数据类型操作。本例中,DUT的端口数据类型为ufx10_en5,但VectorGenerator和DivideChecker子系统是数据类型。

  • 如果您有Simulink金宝app Test®,您可以选择映射在Simulink测试套件中的转换块到UVM驱动程序和监视器。域分离支持更加精简的UVM测试台生成工作流。

uvmbuild函数允许您通过提供附加的可选名称-值对来指定映射到UVM驱动程序、监视器或两者的Simulink子系统,从而分离基于框架的域和标量域。金宝app