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

这篇具有很好参考价值的文章主要介绍了1-搭建一个最简单的验证平台UVM,已用Questasim实现波形!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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验证平台。

1-搭建一个最简单的验证平台UVM,已用Questasim实现波形!,UVM验证-项目实战,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) begin
  if(!rst_n)  begin
    txd   <= 8'b0;
	tx_en <= 1'b0;
  end  
  else begin
    txd   <= 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中的类。

这个driver的功能非常简单,只是向rxd上发送256个随机数据,并将rx_dx信号置为高电平。当数据发送完毕后,将rx_dx信号置为低电平。在这个driver中,有两点应该引起注意:
(1)所有派生自uvm_driver的类的new函数有两个参数,一个是string类型的name,一个是uvm_component类型的parent。关于name参数,就是名字而已;关于parent参数先放一边。事实上,这两个参数是由uvm_component要求的,每一个派生自uvm_component或派生类的类在其new函数中要指明两个参数:name和parent,这是uvm_component类的一大特征。而uvm_driver是一个派生自uvm_component的类,所以也会有这两个参数。
(2)driver所做的事情几乎都在main_phase中完成。UVM由phase来管理验证平台的运行,这些phase统一以xxxx_phase来命名,且都有一个类型为uvm_phase、名字为phase的参数。main_phase是uvm_driver中预先定义好的一个任务,因此几乎可以简单地认为,实现一个driver等于实现其main_phase。

下述代码还出现了uvm_info宏。这个宏的功能于Verilog中display语句的功能类似,但是它比display语句更强大。它有三个参数:
第一个是字符串,用于把打印的信息归类;
第二个是字符串,是具体需要打印的信息;
第三个是冗余级别。
在验证平台中,某些信息非常关键,这些信息就设置为UVM_LOW;有些信息可有可无,就设置为UVM_HIGH;介于两者之间的是UVM_MEDIUM。UVM默认只显示UVM_MEDIUM或者UVM_LOW的信息。
uvm_info宏非常强大,包含了打印信息的物理文件来源、逻辑结点信息(在UVM树中的路径索引)、打印时间、对信息的分类组织以及打印的信息。 在搭建验证平台时应尽量使用uvm_info宏取代display语句。

// UVM 验证平台中的 driver应该派生自 uvm_driver,
// 下面是一个简单的 driver 
`ifndef MY_DRIVER_SV
`define MY_DRIVER_SV

`include "uvm_macros.svh"  // 这是UVM的一个文件,里面包含了众多的宏定义,只需要包含一次
import uvm_pkg::*;   // 只要导入了这个库,编译器在编译my_driver.sv文件时才会认识其中的uvm——driver等类名。

class my_driver extends uvm_driver;

  function new(string name = "my_driver", uvm_component parent = null);
    super.new(name, parent);
  endfunction
  extern virtual task main_phase(uvm_phase phase);
endclass

task 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 begin
  my_driver drv;
  drv = new("drv", null); // 注意这里调用new函数时,其传入的名字参数为drv。前文介绍的uvm_info宏的打印信息时出现的代表路径索引的drv就是在这里传入的参数drv。
 // 另外传入的parent的参数为null,在真正的验证平台中,这个参数一般不是null,这里是暂时用null。 
  drv.main_phase(null);
  // 这里调用的死my_driver 中的main_phase,在main_phase的声明中,有一个uvm_phase类型的参数phase
  // 在真正的验证平台中,这个参数是不需要用户理会的。这里搭建的还不是一个完整的验证平台,所以暂且传入null。
  $finish();
end

initial begin
  clk = 0;
  forever begin
    #100 clk = ~clk;
  end
end

initial begin
  rst_n = 1'b0;
  #1000;
  rst_n = 1'b1;
end

endmodule


3,Questasim仿真输出

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

(1)compile all,成功!

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

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

1-搭建一个最简单的验证平台UVM,已用Questasim实现波形!,UVM验证-项目实战,UVM文章来源地址https://www.toymoban.com/news/detail-626462.html

到了这里,关于1-搭建一个最简单的验证平台UVM,已用Questasim实现波形!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UVM学习——搭建简单的UVM平台

      本专栏的博客均与 UVM 的学习相关,学习参考:  【1】UVM Tutorial  【2】张强著,UVM实战 (卷 Ⅰ)  【3】Download UVM (Standard Universal Verification Methodology) 本专栏的学习基本依照 资料【2】的主线,以【1】【3】资料作为参考。特别是【3】是官方的UVM手册,具有很高的可参考性

    2024年02月16日
    浏览(37)
  • 【UVM】-- UVM测试平台搭建与调试

    《UVM》实战中这个DUT的功能比较简单: 在clk的上升沿,且rst不为低电平的时候,将输入的信号直接发送出去,并且输出输入的使能信号; 在clk上升沿,如果rst为低电平,复位输出信号和使能信号 clk 时钟输入信号 rst_n 复位输入信号  rxd 8bit输入数据信号 rx_dv 输入使能信号

    2024年02月15日
    浏览(38)
  • 基于UVM+VCS基本平台,运行《UVM实战》中的第一个UVM代码并输出结果

    (1)下载puvm.tar.gz和uvm-1.1d.tar.gz压缩包 ,使用分别使用tar zxvf puvm.tar.gz和 tar zxvf uvm-1.1d.tar.gz解压到当前目录下 (2)找到puvm-src-ch2-dut-dut.sv文件,将该文件拷贝到puvm-src-ch2-section2.2-2.2.1目录下 (3)打开puvm-src-ch2-section2.2-2.2.1-Makefile.vcs文件并按照下面的方法进行编辑,编辑完后

    2024年02月09日
    浏览(47)
  • 基于vcs+uvm+xilinx ip的仿真平台的半自动化搭建

    系 统:ubuntu 18.04 仿真平台:vcs_2018.09-SP2 开发平台:vivado 2019.2 本文的主要目的是自动化搭建基于vcs+uvm+xilinx ip的仿真平台,节省平台搭建的时间与精力。 拿到一个项目,一般的平台搭建的步骤:去网上找一个makefile脚本(或者使用原项目脚本),修改相应的软件路径,添加

    2024年01月18日
    浏览(48)
  • 使用CSS、HTML、JavaScript实现一个简单的身份验证页

      这是我在博客园的第一篇博客,也是我人生中的第一篇博客。希望它能够记录我的成长,帮助更多的人。   最近在写我们社团的社团网站,有一个页面不太希望普通访客能访问到,所以想做一个“统一身份验证验证”,但是又苦于社团网站搭建是纯静态站,没法做数据

    2024年02月08日
    浏览(71)
  • java对接打码平台用selenium实现对图片验证码识别(对接文档看这一个就够了)

    在很多平台软件中,咱们登录之后都有一些验证,例如图片数字验证,还有现在流行的滑块验证码,点选验证码,这么复杂的事情,我们程序员当然要用程序的方式解决啦,所以也有一些平台提供了快捷验证的方式,在这里,博主就给大家分享一下,如何实现对图片数字的识

    2023年04月25日
    浏览(71)
  • 如何快速搭建一个大模型?简单的UI实现

    🔥博客主页: 是dream 🚀系列专栏: 深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 💘每日语录:相信自己,一路风景一路歌,人生之美,正在于此。 🎉感谢大家点赞👍收藏⭐指正✍️ 前言:本文章纯属是自己无聊,调用了星火认知大模

    2024年02月05日
    浏览(55)
  • 如何搭建一个简单的springCloudAlibaba项目,并实现基本的使用

    微服务是一种软件架构风格,它将一个大型应用程序拆分成一组更小、独立的服务,每个服务都可以独立开发、部署和扩展。每个服务都有自己的业务逻辑和数据库,并且通过轻量级通信机制(如RESTful API)来相互通信。 微服务架构的优点包括 可扩展性:由于每个服务都是独

    2024年01月21日
    浏览(61)
  • 怎样从一个新手,实现windows搭建wvp+zlm流媒体平台?

    在流媒体日趋成熟的今天,大家每天都会刷大量视频,又或者拥有一部手机就能远程查看家里的监控;那作为新手的你,怎么从无到有打造自己的流媒体平台呢? 这里我们选用wvp+ZLMediaKit开源平台,WEB VIDEO PLATFORM(wvp)是一个基于GB28181-2016标准实现的网络视频平台,支持NAT穿

    2024年02月02日
    浏览(58)
  • UVM验证方法学_phase机制

    phase机制是uvm最重要的几个机制之一,它使得uvm的运行仿真层次化,使得各种例化先后次序正确,保证了验证环境与DUT的正确交互。 目录 一、phase机制概述 二、phase执行顺序 (1)时间顺序 (2)空间顺序 三、phase机制中uvm树的遍历 四、phase的super 五、phase的跳转 六、phase的调

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包