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

1、添加源文件及tb文件

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

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

2.1 设计文件 :dut.sv

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


module dut(clk,rst_n, rxd,rx_dv,txd,tx_en);
input clk;
input rst_n;
input[7:0] rxd;
input rx_dv;
output [7:0] txd;
output tx_en;reg[7:0] txd;
reg tx_en;always @(posedge clk) beginif(!rst_n) begintxd <= 8'b0;tx_en <= 1'b0;endelse begintxd <= rxd;tx_en <= rx_dv;end
end
endmodule
2.2my_driver.sv

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


`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
class my_driver extends uvm_driver;function new(string name = "my_driver", uvm_component parent = null);super.new(name, parent);endfunctionextern virtual task main_phase(uvm_phase phase);
endclasstask my_driver::main_phase(uvm_phase phase);top_tb.rxd <= 8'b0; top_tb.rx_dv <= 1'b0;while(!top_tb.rst_n)@(posedge top_tb.clk);for(int i = 0; i < 256; i++) // 开始循环256次begin@(posedge top_tb.clk);top_tb.rxd <= $urandom_range(0, 255); // 随机向rxd 上发送一个0~255的随机数top_tb.rx_dv <= 1'b1; // 有效位,置1`uvm_info("my_driver", "data is drived", UVM_LOW)end@(posedge top_tb.clk);top_tb.rx_dv <= 1'b0;  // 完成后有效位拉低
endtask
`endif
2.3top_tb.sv
`timescale 1ns/1ns
`include "uvm_macros.svh"  // 包含宏定义import uvm_pkg::*;  // 导入UVM库
`include "F:/modelsim_workspace/uvm_learning/test0/my_driver.sv"module top_tb;reg clk;
reg rst_n;
reg[7:0] rxd;
reg rx_dv;
wire[7:0] txd;
wire tx_en;dut my_dut(.clk(clk),.rst_n(rst_n),.rxd(rxd),.rx_dv(rx_dv),.txd(txd),.tx_en(tx_en));initial begin   // 定义drv 并进行实例化my_driver drv;drv = new("drv", null);drv.main_phase(null);   // 调用drive的 main_phase$finish();
endinitial beginclk = 0;forever begin#1 clk = ~clk;end
endinitial beginrst_n = 1'b0;#10;rst_n = 1'b1;
endendmodule

3、编写脚本

        编写command.do脚本。

cd F:/modelsim_workspace/uvm_learning/test0vlib workset UVM_HOME F:/modelsim_workspace/uvm_learning/uvm-1.1d/uvm-1.1d     set WORK_HOME F:/modelsim_workspace/uvm_learning/test0vlog +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   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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/193418.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于Vue和SpringBoot的康复中心管理系统

项目编号&#xff1a; S 056 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S056&#xff0c;文末获取源码。} 项目编号&#xff1a;S056&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员…

[Linux] PXE批量装机

一、PXE批量装机简介 1.1 常见的三种系统安装方式 u启动安装&#xff1a;在U盘中下载相关的安装系统及镜像文件&#xff0c;u盘插机安装 光驱安装&#xff1a;将带有所需系统的光盘放进电脑服务器中&#xff0c;按照官方引导装机 网络下载安装&#xff1a;在网上下载相关镜…

文本转语音

免费工具 音视频转译 通义听悟 | https://tingwu.aliyun.com/u/wg57n33kml5nkr3p 音色迁移 speechify | https://speechify.com/voice-cloning/ 视频生成 lalamu | http://lalamu.studio/demo/ 画质增强 topazlabs video AI | https://www.topazlabs.com 付费工具 rask | htt…

C++之函数对象

C之函数对象 #include<iostream> using namespace std; #include<string> ///函数对象 (仿函数) //函数对象在使用时&#xff0c;可以像普通函数那样调用&#xff0c;可以有参数&#xff0c;可以有返回值 //函数对象超出普通函数的概念&#xff0c;函数对象可以有自…

mongodb——原理简介,docker单机部署

MongoDB noSQL数据库 特点 数据文件存储格式为 BSON &#xff08;JSON 的扩展&#xff09; &#xff5b;“name”&#xff1a;“joe”&#xff5d;这是 BSON 的例子&#xff0c;其中"name"是键&#xff0c;"joe"是值。键值对组成了 BSON 格式。面向集合…

Android问题笔记四十六:解决open failed: EACCES (Permission denied) 问题

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC &#x1f449;关于作者 专…

【如何将任何直流电机变成伺服电机】

【如何将任何直流电机变成伺服电机】 1 前沿2 伺服电机工作原理3 如何制作定制伺服电机4 AS5600 编码器 – 磁性旋转位置传感器5 定制伺服电机电路图6 PCB设计7 自定义伺服3D模型8 定制伺服齿轮箱的 3D 打印零件9 对控制器进行编程9.1 引导加载程序刻录9.2 代码上传9.3 源代码9…

北邮22级信通院数电:Verilog-FPGA(10)第十周实验 实现移位寄存器74LS595

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 二.管脚分配 三.实现过程讲解及效…

振南技术干货集:CPU,你省省心吧!(2)

注解目录 1、石油测井仪器 1.1 背景知识 &#xff08;了解一下石油行业。石油到底是怎么找到的&#xff1f;&#xff09; 1.2 测井数据采传的实现 1.2.1 最直接的初级方案 1.2.2 加入 DMA 的优化方案 &#xff08;看看一般工程师与高手在技术实现上到底有什么区别。充分…

计算机的发展

硬件的发展 第一台电子数字计算机&#xff1a;ENIAC&#xff08;1946&#xff09;&#xff0c;作者&#xff1a;冯诺依曼&#xff0c;逻辑元件&#xff1a;电子管 bug&#xff1a;小虫子&#xff0c;会影响打点 Intel&#xff1a; 机器字长&#xff1a;计算机一次整数运算所能…

Vue3问题:如何实现el-tree树的单选?

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约1400字&#xff0c;整篇阅读大约需要3分钟。 本文主要内容分三部分&#xff0c;第一部分是需求分析&#xff0c;第二部分是实现步骤&#xff0c;第三部分是问题详解。 …

80C51单片机的七种寻址方式

首先理解这样的等式 地址是20H的寄存器中&#xff0c;存放的内容是01H (20H)#01H 符号指令的书写格式 单个操作数的指令&#xff1a; 操作助记符 [目的操作数] 两个操作数的指令&#xff1a; 操作助记符[目的操作数],[源操作数] 描述符号 Rn(n0~7)当前工作寄存器组中的寄…