1-搭建一个最简单的验证平台UVM,已用Questasim实现波形!

news/2025/3/14 2:05:23/

UVM-搭建一个最简单的验证平台,已用Questasim实现波形

      • 1,背景知识
      • 2,".sv"文件搭建的UVM验证平台,包括代码块分享
      • 3,Questasim仿真输出
        • (1)compile all,成功!
        • (2)simulation,仿真波形输出。

1,背景知识

验证是用于找出DUT的bug,这个过程通常是把DUT放入一个验证平台中来实现的。
一个验证平台要实现如下基本功能:
(1)验证平台要模拟DUT的各种真实使用情况,这意味着要给DUT施加各种激励,有正常的激励,也有异常的激励;有这种模式的激励,也有那种模式的激励。激励的功能是由driver来实现的。
(2)验证平台要能够根据DUT的输出来判断DUT的行为是否与预期相符合,完成这个功能的是记分板(scoreboard,也称:checker)。既然是判断,那么牵扯到两个方面:一是判断什么,需要把什么拿来判断,这里很明显是DUT的判断;二是判断的标准是什么。
(3)验证平台要收集DUT的输出并把它们传递给scoreboard,完成这个功能的是monitor。
(4)验证平台要能够给出预期结果。在记分板中提到了判断的标准,判断的标准通常就是预期。假设DUT是一个加法器,那么当它的加数和被加数中分别输入1,即输入1+1时,期待DUT输出2。当DUT在计算1+1的结果时,验证平台也必须相应完成同样的过程,也计算一次1+1。在验证平台中,完成这个过程的是参考模型(reference model)。

本篇章将从一个最简单的验证平台开始,逐步搭建起一个复杂的UVM验证平台。

在这里插入图片描述

2,".sv"文件搭建的UVM验证平台,包括代码块分享

第一块代码,dut.sv
这个DUT功能非常简单,通过rxd接收数据,再通过txd发送出去。其中,rx_dv是接收的数据有效指示,tx_en是发送的数据有效指示。

// UVM实战
// 最简单的验证平台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;end  else begintxd   <= rxd;tx_en <= rx_dv;end
end
endmodule

第二块代码,my_driver.sv

UVM是一个库,在这个库中,几乎所有的东西都是使用类(class)来实现的。
driver,monitor,reference model,scoreboard等组成部分都是类。类是像SystemVerilog这些面向对象编程语言中最伟大的发明之一,是面向对象的精髓。
类有函数(function)、任务(task),通过这些function和task可以完成driver的输出激励功能。类中可以有成员变量,这些成员变量可以控制类的行为,如控制driver的行为等。当要实现一个功能时,首先想到的是从UVM的某个类派生出一个新的类,在这个新的类中实现所期望的功能。
因此,使用UVM的第一条原则是:验证平台中所有的组件应该派生自UVM中的类。

// UVM 验证平台中的 driver应该派生自 uvm_driver,
// 下面是一个简单的 driver 
`ifndef MY_DRIVER_SV
`define MY_DRIVER_SV`include "uvm_macros.svh"
import uvm_pkg::*;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++) begin@(posedge top_tb.clk)top_tb.rxd   <= $urandom_range(0,255);top_tb.rx_dv <= 1'b1;`uvm_info("my_driver", "data is drived", UVM_LOW);end@(posedge top_tb.clk)top_tb.rx_dv <= 1'b0;
endtask`endif

uvm_pkg的解释:
uvm_pkg是一个开放源代码的解决方案库,用于基于IEEE 1800 SystemVerilog标准实现通用验证方法(Universal Verification Methodology,简称UVM)。UVM是一种常用的硬件验证方法学,用于验证集成电路设计的正确性。

uvm_pkg提供了一组类、函数和宏,用于建模和实现验证环境中常见的验证功能,如生成和管理事务、约束和随机性、组织测试用例、收集和报告结果等。它还定义了一套规范,描述了验证架构的结构和交互方式。

通过使用uvm_pkg,验证工程师可以更高效地编写可重用和可扩展的验证环境,加快验证开发的速度,提高项目的可靠性和生产力。

第三块代码,top_tb.sv

// 对 my_driver 实例化并且最终搭建的验证平台如下:`timescale 1ns/1ps
`include  "uvm_macros.svh"   // UVM宏
import uvm_pkg::*;  //  通过 import 语句将整个 uvm_pkg导入验证平台。// 只有导入了这个库,编译器在编译my_driver.sv文件时才会认识其中的ruvm_driver等类名。`include "my_driver.sv"      // 对 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 beginmy_driver drv;drv = new("drv", null);drv.main_phase(null);$finish();
endinitial beginclk = 0;forever begin#100 clk = ~clk;end
endinitial beginrst_n = 1'b0;#1000;rst_n = 1'b1;
endendmodule

3,Questasim仿真输出

注明:参考文献:,这里有Questasim仿真时碰到的各种错误解决方案,非常有用!
1,questasim常见问题解决方案

(1)compile all,成功!

在这里插入图片描述

(2)simulation,仿真波形输出。

在这里插入图片描述


http://www.ppmy.cn/news/1001416.html

相关文章

为了规避风险,如何给大模型打水印?

大型语言模型&#xff0c;如最近开发的ChatGPT&#xff0c;可以撰写文件、创建可执行代码和回答问题&#xff0c;通常具有人类般的能力。 随着这些大模型的应用越来越普遍&#xff0c;越来越大的风险也显现了出来&#xff0c;它们可能被用于恶意目的。这些恶意目的包括&#xf…

php运算符的短路特性

php运算符的短路特性 1、逻辑运算符&#xff1a;逻辑与&#xff08;&&)和逻辑或&#xff08;||&#xff09;&#xff0c;存在着短路特性 PHP中有以下两个运算符具有短路的特性&#xff0c;他们是逻辑运算符的逻辑与&#xff08;&&)和逻辑或&#xff08;||&am…

C++ MQTT客户端

下面是一个简单的ROS节点的C MQTT客户端的示例&#xff0c;包括.h和.cpp文件。 很抱歉&#xff0c;我之前提供的代码中似乎有一些错误。下面是更新后的代码&#xff0c;修复了mqtt命名空间中disconnect_response的问题&#xff1a; mqtt_client.h&#xff1a; #ifndef MQTT_…

VR虚拟仿真技术在道路桥梁中有哪些具体应用?

虚拟现实(VR)是一种新兴的技术&#xff0c;可以为桥梁工程提供许多应用场景。以下是一些可能的应用场景&#xff1a; 1.桥梁设计和模拟 VR元宇宙可以用于桥梁的设计和模拟。工程师可以使用VR技术来创建桥梁的三维模型&#xff0c;并对其进行测试和优化。这可以帮助工程师更好地…

排查管家婆财务试算不平衡

总账的财务期初试算不平衡&#xff0c;就会导致不能成功开账。当分销A\V系列总账版本软件中出现试算不平衡的情况&#xff0c;应该如何排查&#xff1f;请按照下面的排查步骤操作吧。 PART.01 期初建账-账务期初&#xff0c;币种选择【综合本位币】&#xff0c;点下面的【试算…

微信小程序使用editor富文本编辑器 以及回显 全屏弹窗的模式

<!--富文本接收的位置--><view class"white-box"><view class"title"><view class"yellow-fence"></view><view class"v1">教研记录</view></view><view class"add-btn"…

测试工程师与研发工程师之间的差别

目录 为什么要讨论二者的差别? 测试工程师的分类 测试工程师与研发工程师之间的差别

Linux C 获取主机网卡名及 IP 的几种方法

在进行 Linux 网络编程时&#xff0c;经常会需要获取本机 IP 地址&#xff0c;除了常规的读取配置文件外&#xff0c;本文罗列几种个人所知的编程常用方法&#xff0c;仅供参考&#xff0c;如有错误请指出。 方法一&#xff1a;使用 ioctl() 获取本地 IP 地址 Linux 下可以使用…