• Win11+Modelsim SE-64 10.6d搭建UVM环境


    1、添加源文件及tb文件

    在目录下建立文件夹,将DUT和Testbench添加进去,文件夹内容如下所示:

    2、以《UVM实战》中的例子做简单的示例:

    2.1 设计文件 :dut.sv

            功能很简单,即将接受到的数据原封不动发送出去。

    1. module dut(clk,
    2. rst_n,
    3. rxd,
    4. rx_dv,
    5. txd,
    6. tx_en);
    7. input clk;
    8. input rst_n;
    9. input[7:0] rxd;
    10. input rx_dv;
    11. output [7:0] txd;
    12. output tx_en;
    13. reg[7:0] txd;
    14. reg tx_en;
    15. always @(posedge clk) begin
    16. if(!rst_n) begin
    17. txd <= 8'b0;
    18. tx_en <= 1'b0;
    19. end
    20. else begin
    21. txd <= rxd;
    22. tx_en <= rx_dv;
    23. end
    24. end
    25. endmodule
    2.2my_driver.sv

            定义一个driver类,它派生自uvm_driver。driver的主要功能在main_phase task中实现,主要功能为向rxd管脚上发送随机数。`uvm_info(“my_driver”, “data is drived”, UVM_LOW)为打印信息的宏。

    1. `ifndef MY_DRIVER__SV
    2. `define MY_DRIVER__SV
    3. class my_driver extends uvm_driver;
    4. function new(string name = "my_driver", uvm_component parent = null);
    5. super.new(name, parent);
    6. endfunction
    7. extern virtual task main_phase(uvm_phase phase);
    8. endclass
    9. task my_driver::main_phase(uvm_phase phase);
    10. top_tb.rxd <= 8'b0;
    11. top_tb.rx_dv <= 1'b0;
    12. while(!top_tb.rst_n)
    13. @(posedge top_tb.clk);
    14. for(int i = 0; i < 256; i++) // 开始循环256
    15. begin
    16. @(posedge top_tb.clk);
    17. top_tb.rxd <= $urandom_range(0, 255); // 随机向rxd 上发送一个0~255的随机数
    18. top_tb.rx_dv <= 1'b1; // 有效位,置1
    19. `uvm_info("my_driver", "data is drived", UVM_LOW)
    20. end
    21. @(posedge top_tb.clk);
    22. top_tb.rx_dv <= 1'b0; // 完成后有效位拉低
    23. endtask
    24. `endif
    2.3top_tb.sv
    1. `timescale 1ns/1ns
    2. `include "uvm_macros.svh" // 包含宏定义
    3. import uvm_pkg::*; // 导入UVM库
    4. `include "F:/modelsim_workspace/uvm_learning/test0/my_driver.sv"
    5. module top_tb;
    6. reg clk;
    7. reg rst_n;
    8. reg[7:0] rxd;
    9. reg rx_dv;
    10. wire[7:0] txd;
    11. wire tx_en;
    12. dut my_dut(.clk(clk),
    13. .rst_n(rst_n),
    14. .rxd(rxd),
    15. .rx_dv(rx_dv),
    16. .txd(txd),
    17. .tx_en(tx_en));
    18. initial begin // 定义drv 并进行实例化
    19. my_driver drv;
    20. drv = new("drv", null);
    21. drv.main_phase(null); // 调用drive的 main_phase
    22. $finish();
    23. end
    24. initial begin
    25. clk = 0;
    26. forever begin
    27. #1 clk = ~clk;
    28. end
    29. end
    30. initial begin
    31. rst_n = 1'b0;
    32. #10;
    33. rst_n = 1'b1;
    34. end
    35. endmodule

    3、编写脚本

            编写command.do脚本。

    1. cd F:/modelsim_workspace/uvm_learning/test0
    2. vlib work
    3. set UVM_HOME F:/modelsim_workspace/uvm_learning/uvm-1.1d/uvm-1.1d
    4. set WORK_HOME F:/modelsim_workspace/uvm_learning/test0
    5. vlog +incdir+$UVM_HOME/src -L mtiAvm -L mtiOvm -L mtiUvm -L mtiUPF $UVM_HOME/src/uvm_pkg.sv $WORK_HOME/dut.sv top_tb.sv
    6. vsim -sv_lib F:/tools/Modelsim/setup/uvm-1.2/win64/uvm_dpi work.top_tb
    1. 第一行,通过cd切换到源文件所在目录
    2. 第二行,vlib命令用于建立一个新的工作库。在本例子中,vlib work在当前目录建立work工作区文件夹,运行后会在当前目录下找到work文件夹。
    3. 设置UVM库的路径和工作文件夹。这里需要下载uvm-1.1d或者其他版本的库,如下图所示。

    4.vlog命令用于编译verilog代码,编译systemverilog或者vhdl的命令参考modelsim user guide。

    5.vsim表示运行仿真,-sv_lib 对应uvm的一个路径。其中参数“-c”表示进入命令行模式,如果没有该参数,则表示进行GUI模式。vsim  -sv_lib F:/tools/Modelsim/setup/uvm-1.2/win64/uvm_dpi  work.top_tb ,uvm_dpi是modelsim安装目录下的动态链接库。

    4、运行脚本,开始仿真

            在modelsim命令窗口键入, do  F:/modelsim_workspace/uvm_learning/test0/command.do运行脚本。仿真界面和结果如下所示:

    5、手动编译uvm_dpi.dll

            下载modelsim安装包解压安装后,在modelsim安装目录下已经有编译好的uvm_dpi.dll(有不同版本的可以根据需要调用),为了避免麻烦和出错,不需要手动编译uvm_dpi.dll也可以在uvm框架下实现仿真。

    1.安装modelsim se 10.1a

    2.下载uvm_1.1d 

            然后解压缩后,拷贝到modelsim安装目录的../verilog_src/目录下,我的目录是C:\software\modeltech_10.1a\verilog_src.这里注意,拷贝过来之后,打开uvm_1.1d文件夹,应该能直接看到bin/docs/examples/src/等文件夹和几个txt文件。

    3.配置系统环境变量。打开modelsim,在vsim>命令行下输入

            vsim n>set UVM_HOME c:/software/modeltech_10.1a/verilog_src/uvm-1.1d 

            vsim n>set MODEL_TECH c:/software/modeltech_10.1a/win32  

    (也可以设置为系统环境变量)

    4.编译uvm_1.1d库文件。所谓编译库文件,我的理解是将uvm_1.1d编译成windows中modelsim可以加载的dll文件,因此这一个步骤是生成一个.dll文件的过程。这里需要GCC的编译命令,最新的是(modelsim-gcc-4.2.1-mingw32vc9)

            解压缩后,复制到modelsim安装目录下,我的复制目录是(C:\software\modeltech_10.1a\gcc-4.2.1-mingw32vc9),打开该文件后能够直接看到bin/doc/include/info/lib/libexec/man/share文件夹,上面这些基本工作做完后,就可以编译.dll文件了。

    5.在vsim命令行下输入

            vsim n>c:/software/modeltech_10.1a/gcc-4.2.1-mingw32vc9/bin/g++.exe -DQUESTA -W -shared -Bsymbolic -I $MODEL_TECH/../include  $UVM_HOME/src/dpi/uvm_dpi.cc -o  $UVM_HOME/lib/uvm_dpi.dll $MODEL_TECH/mtipli.dll -lregex

            注意,要先在$UVM_HOME目录下创建lib文件夹。

    6.下载hello_world.sv 

            创建modelsim工程,添加hello_world.sv文件。假设工程目录为 C:/modelsim_uvm/

    7.编译Hello_world_example源文件

            vsim n>vlog +incdir+$UVM_HOME/src -L mtiAvm -L mtiOvm -L mtiUvm -L mtiUPF C:/modelsim_uvm/hello_world.sv  

    8.仿真Hello_world_example(需要调用刚刚编译的uvm_dpi.dll)

            vsim n>vsim -c -sv_lib $UVM_HOME/lib/uvm_dpi work.hello_world_example

    选run 100ns

    参考:UVM仿真环境搭建_fpga uvm_FPGA硅农的博客-CSDN博客
    参考:https://www.cnblogs.com/love29850706/p/6079367.html

  • 相关阅读:
    RPA应用中面临的4大安全风险
    【高效办公】一、ubuntu之间共享桌面
    PLC编程基础之数据类型、变量声明、全局变量和I/O映射(CODESYS篇 )
    为什么和线程有关的方法会被封装在Object类中
    spring 如何解决循环依赖
    AVProVideo☀️十、来给视频设置封面
    反转字符串中的单词-力扣
    小熊听书项目的详细介绍
    调用CFCA金信反欺诈服务相关接口,很详细
    使用Spring Boot整合定时任务(Schedule)
  • 原文地址:https://blog.csdn.net/qq_33300585/article/details/134487479