1 认识一下只有driver的验证平台-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

认识一下只有driver的验证平台

冬至子 来源:不二鱼 作者:不二鱼 2023-06-15 18:09 次阅读

对于一个验证平台而言,最重要的角色是激励的产生,最开始,driver是集合了数据的产生、发送于一体这么一个重要的角色(后面到进入真正UVM会将功能分离)。对于整个验证平台而言,产生激励,将激励送到DUT,收集DUT产生的数据,进行对比,这是最基本的功能。后面一系列的UVM机制,都只是为了能够更好的实现这个基本功能。

这里也强调一点,学习UVM,我个人觉得最重要的是搞清楚,what,where,how。你应该产生什么样的激励数据(what),你的激励是在哪里产生(where),能各个组件之间是怎么连接,数据怎么发送,怎么收集,怎么对比,这就是how的问题。数据在哪里对比,这又是where的问题。能够从数据产生的源头,一路追,追到数据在各个组件里头的流转。就像你找到了一条小溪的源头,你能够沿着这条小溪,一路追下去,直到你明白这条小溪会流经那些村庄,目的地是哪里。

学过verilog的应该知道,verilog里面进行验证,只有两个部分,一个是DUT,一个是tb,这两个组件,组成了最最基本的验证平台,其中,它包含了激励部分,以及代码部分。在UVM中,最基本的验证平台也是由这两部分组成,但是多了一个top_tb.sv的组件。下面,先认识一下这个简单的平台,从代码进行剖析,代码全部来自张强老师的《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

这个dut确实是很简单。当复位也就是rst_n=0时,将输出数据(txd)和使能(tx_en)都设置为0,否则,将输入给输出。

图片

看到这个DUT,如果让你自己写一个Tb.v,你会怎么写呢?不妨自己写一个,然后再对照下面这个。其实思路也很简答,就是产生相应的数据给四根输入信号,经过dut,看输出的数据。产生时钟给clk,产生复位信号给rst_n,产生数据给rxd,产生使能信号给rx_dv。下面我们来看看driver和tb。

`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
//这个`ifndef和`define其实就是相当于一个判断条件,便于调用
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
//这里出现了extern,你翻翻SV的书就知道,只是因为把代码全部写在这个类里面显得臃肿
//所以,在这里用extern留下了一个索引,具体的内容放到class外面
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// 复位结束之后开始for循环,产生256个数据
      @(posedge top_tb.clk);
      top_tb.rxd <= $urandom_range(0, 255);//产生随机数,赋值给rxd
      top_tb.rx_dv <= 1'b1;
      `uvm_info("my_driver", "data is drived", UVM_LOW)
   end
   @(posedge top_tb.clk);//赋值结束以后,等待时钟上升沿,将rx_dv,重新归零
   top_tb.rx_dv <= 1'b0;
endtask
`endif
`timescale 1ns/1ps //时钟精度
`include "uvm_macros.svh"//导入uvm的库文件,才能识别定义的宏变量


import uvm_pkg::*; // 导入uvm的包
`include "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));
//这是信号的例化,相当于把这个文件中的信号,和DUT的输入信号连接起来
initial begin
   my_driver drv;//指定一个类的指针,你可以理解为用drv代替了driver.
   drv = new("drv", null);//实例化一个driver,不实例化的driver相当于一张图纸
   drv.main_phase(null);
   $finish();
end


initial begin
   clk = 0;
   forever begin  // forever,永远发生,你还能想到其他方法吗?
      #100 clk = ~clk; //这是产生时钟的地方,#是延迟,意思是每隔100个时钟单位,clk进行翻转
   end
end


initial begin
   rst_n = 1'b0;
   #1000; //复位持续了1000个时钟单位
   rst_n = 1'b1;
end


endmodule

用vcs进行仿真

看一下波形:

图片

从波形图中,我们怎么看呢? 看复位 ,是不是在1000个时间单位以前在复位; 看采样 ,复位之后的时钟上升沿是否开始采样,采的样是不是复位之后的有效数据, 看数据 ,数据个数,对照输入输出的数据是否一致;我们就基本可以判定,DUT的功能有没有实现。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真器
    +关注

    关注

    14

    文章

    1017

    浏览量

    83719
  • UVM
    UVM
    +关注

    关注

    0

    文章

    182

    浏览量

    19167
  • CLK
    CLK
    +关注

    关注

    0

    文章

    127

    浏览量

    17156
  • DUT
    DUT
    +关注

    关注

    0

    文章

    189

    浏览量

    12373
收藏 人收藏

    评论

    相关推荐

    认识一下这款名叫“CAN总线存储器”的神器

    CAN总线数据不能及时查看怎么办?CAN总线数据过多没时间处理怎么办?想要回看CAN总线历史数据又怎么办?总线数据三连问,却只需要个答案,是时候认识一下这款名叫“CAN总线存储器”的神器了。
    的头像 发表于 05-20 08:08 8253次阅读

    认识一下NI SWITCH模块的组成和特点

    许多自动化测试应用都需要通过部署个开关网络来实现仪器仪表和DUT之间的信号路由。而开关不仅可用于路由信号,也是增加昂贵仪器仪表的通道数以及提高测量灵活性和可重复性的种低成本方法。
    的头像 发表于 03-22 13:41 1550次阅读
    <b class='flag-5'>认识一下</b>NI SWITCH模块的组成和特点

    IC验证"个简单的UVM验证平台"是如何搭建的(六)

    个文件,里面包含了众多的宏定义,只需要包含 次。第4行通过import语句将整个uvm_pkg导入验证平台中。只有导入了这个库,编译器
    发表于 12-04 15:48

    IC验证"UVM验证平台加入factory机制"(六)

      加入factory机制 上节《IC验证"个简单的UVM验证平台"是如何搭建的(五)》给出了
    发表于 12-08 12:07

    认识一下针对单片机几个基本概念

    我们日常的生活离不开秒表的计时,它提醒着我们什么时刻该干什么,单片机也样,通过单片机内置的晶振来计时,首先让我们认识一下针对单片机几个基本概念:时钟周期:时钟周期 T 是时序中最小的时间单位,具体
    发表于 11-22 06:43

    认识一下Boost拓扑结构

    上期答案揭晓:答案上图 c ,下图 a小伙伴们答对了吗?YTDFWANGWEI :我的笨办法:source,源的意思,就是提供电流。所以,只要是电流流出,就是source。不知道是否正确?作者:完全正确。继续下步讲解:参考一下以下两个图:sink...
    发表于 12-31 08:25

    先来认识一下正激的基本原理

    我们先来认识一下正激的基本原理,如图所示:正激在原边加正向电压 MOS 管导通时,副边的输出符合变压器原理,即:Vs = n* VinVs :变压器副边输出电压n:匝比 = Ns/NpVin:输入电压由上式可知正激拓扑不难理解。* 注意:原边还有个绕组称为复位绕组,副边有...
    发表于 12-31 06:18

    简单地认识一下D/A和A/D

    随着我们学习的逐步推进,我们可以了解到51单片机的更多的知识和元件,今天我们就来简单地认识一下D/A和A/D。首先我们先来介绍一下D/A,就是两个单词digital和anolog.就是把数据量转换
    发表于 02-24 07:21

    个真实网站的验证码为例,实现了基于一下KNN的验证码识别

    很多网站登录都需要输入验证码,如果要实现自动登录就不可避免的要识别验证码。本文以个真实网站的验证码为例,实现了基于一下KNN的
    的头像 发表于 12-24 17:27 7775次阅读

    带你重新认识一下真正的PID

    网上关于PID算法的文章很多,但是感觉有必要自己再进行次总结,抽丝剥茧地重新认识一下PID;
    的头像 发表于 10-10 14:48 2693次阅读

    认识一下丙烷传感器

    丙烷传感器主要用于丙烷气体(C3H8)的检测,般基于半导体或催化燃烧原理。
    的头像 发表于 09-07 16:41 2020次阅读
    <b class='flag-5'>认识一下</b>丙烷传感器

    认识一下并列刷写(Parallel Flash)

    再有,在车辆下线时EOL(End of Line),工厂追求效率,般会1(刷写上位机)拖N(N个 ECU)刷写,这是不是种Parallel Flash呢?
    的头像 发表于 11-15 16:03 4348次阅读
    <b class='flag-5'>认识一下</b>并列刷写(Parallel Flash)

    带你认识一下铝电解电容

    电解电容是种由两块平行金属板以及两金属板之间放置电解液所构成的电容。
    的头像 发表于 05-16 10:53 5194次阅读
    带你<b class='flag-5'>认识一下</b>铝电解电容

    简单认识一下EMC中共模和差模的区别

    电压电流的变化通过导线传输时有两种形态, 即共模和差模。下面带大家简单认识一下共模和差模的区别。
    发表于 06-08 14:58 6889次阅读
    简单<b class='flag-5'>认识一下</b>EMC中共模和差模的区别

    认识一下几个常用的门级电路

    标准单元库是数字集成电路的积木,是复杂电路和系统的基础。今天我们来认识一下其中的几个常用门级电路。
    的头像 发表于 10-09 15:49 1727次阅读
    <b class='flag-5'>认识一下</b>几个常用的门级电路