请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

UVM实战[二]

[复制链接]
查看: 139|回复: 0

2万

主题

3万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
85193
发表于 2020-2-6 15:38 | 显示全部楼层 |阅读模式
本期将讲解UVM情况组成和启动方式。重要参考材料为
http://bbs.eetop.cn/thread-320165-1-1.html
http://rockeric.com/
情况组成

举行仿真考证的底子流程是

  • 例化DUT
  • 发生并发送激励
  • 检测响应
  • 检查响应能否正确
在考证情况中,发生并发送激励将会交给两个差此外类完成,即uvm_driver和uvm_sequence,检测响应经过uvm_monitor完成,而检查响应能否正确经过uvm_scoreboard。除了保证某项功用正确,我们还需要可以大要确保spec中的每一项功用都经过测试,而权衡考证完整性的目标之一就是功用覆盖率,在我们的考证情况中收集功用覆盖率的使命则交给了conv_coverage实现。
接下来将以数据从uvm_driver驱动到DUT,再从DUT到uvm_monitor,再到uvm_scoreboard的次第讲解考证情况的组成。
接口界说

当我们需要举行仿真考证时,与DUT的交互是一个必要的内容,所我们首先分析DUT的接口,较为简单,一共有四组接口,一组寄存器设备接口,三组数据接口用于输入特征图、权重和偏置数据的读取,一组数据接口用于输出特征图的存储接口。
interface的界说在顶层的tb.sv中,三组输入数据几口可以操纵同一典范的接口实现,以下代码中的具体内容省略了,详情请自行检察。末端一组接口用于检测寄存器的内容,当前版本没有操纵寄存器模子,所以这个接口是必要的。
  1. interface cfg_intf (input clk , input rst_n);  clocking drv_ck @(posedge clk);    default input #1ns output #1ns;  endclocking  clocking mon_ck @(posedge clk);    default input #1ns output #1ns;  endclockingendinterfaceinterface mem_in_intf (input clk , input rst_n);  clocking drv_ck @(posedge clk);    default input #1ns output #1ns;  endclocking  clocking mon_ck @(posedge clk);    default input #1ns output #1ns;  endclockingendinterfaceinterface mem_out_intf (input clk , input rst_n);  clocking mon_ck @(posedge clk);    default input #1ns output #1ns;  endclockingendinterfaceinterface conv_intf (input clk , input rst_n);  clocking mon_ck @(posedge clk);    default input #1ns output #1ns;  endclockingendinterface
复制代码
留意在interface界说中,别离界说了两个时钟块,一组驱动用的时钟块,一组检测用的时钟块,方针就是为了模仿实在的建立连结时候,时钟块的具体用法可以参考绿皮书的第四章内容。
情况组件

有了接口界说今后,经过接口界说,我们即可以大要与DUT交互,那末举行交互我们需要做什么呢?
首先看团体结构,假如看不清,背景复兴UVM结构图获得VISIO文件。依照接口举行分类,可以分红两大类,一类经过接口与DUT实现交互,此外一类组成了其他的组件,例如checker,经过其他组件收集到的数据举行数据比对,保证DUT的功用正确性。
UVM实战[二]  游戏 1516117-20200206130111816-1993490029

考证情况一共由四个PKG组成,经过在顶层import导入:
  1. import cfg_pkg::*;import mem_in_pkg::*;import mem_out_pkg::*;import conv_pkg::*;
复制代码
与DUT间接联系的组件

我们从DUT与考证情况的接口处起头说起,cfg_pkg包含了对于寄存器举行考证的组件。构建UVM情况底子的几个组件包含uvm_driver,uvm_sequencer,uvm_monitor,uvm_agent。而uvm_sequence_item和uvm_sequence则不属于情况的组件,他们是情况组件之间转达信息的载体。
  1. package cfg_pkg;  import uvm_pkg::*;  `include "uvm_macros.svh"  typedef enum {WR,RD,IDLE}cmd_t;  class cfg_item extends uvm_sequence_item;  endclass : cfg_item  class cfg_driver extends uvm_driver #(cfg_item);  endclass :cfg_driver  class cfg_sequencer extends uvm_sequencer #(cfg_item);  endclass: cfg_sequencer  class cfg_base_sequence extends uvm_sequence #(cfg_item);  endclass: cfg_conv_sequence  class cfg_monitor extends uvm_monitor;  endclass: cfg_monitor  class cfg_agent extends uvm_agent;    cfg_driver driver;    cfg_monitor monitor;    cfg_sequencer sequencer;    local virtual cfg_intf vif;  endclass:cfg_agent    endpackage
复制代码
UVM的脑筋之一就是要低落组件之间的耦合度,让组件的功用加倍纯真。
uvm_driver和uvm_monitor是间隔DUT近来的两个组件,可以间接与DUT的接口举行互动。
uvm_monitor经过检测接口上的信号,转化为数据包,照实地发送给checker,只实现这一纯真的功用,而对于驱动DUT这一功用则交给uvm_driver。
uvm_driver经过从uvm_sequencer获得到的uvm_sequence_item分解出驱动数据,照实的将uvm_sequence_item的内容驱动到DUT的接口上,也执俚现这一纯真的功用,至于具体的激励内容,则经过uvm_sequencer袒露接口给顶层情况,让考证职员经过uvm_sequencer发送激励。
而uvm_sequencer的功用就加倍简单了,只需要实现转达uvm_sequence_item即可,不需要关注其他的工作。
而uvm_agent中则凡是会例化四个组件,uvm_driver,uvm_sequencer,uvm_monitor和对应的interface。uvm_agent的功用也很是单一,仅仅只是将对于一组接口的相关组件举行一个打包,把他们整合起来,这样在顶层就只需要例化这一个组件即可。
mem_in_pkg和mem_out_pkg的内容团体上和cfg_pkg底子同等,不再赘述。
与DUT没有间接联系的组件

经过cfg_pkg的内容,我们实现了对DUT的驱动与检测,那末驱动的内容从何而来,而检测的数据包又要发送到那边去呢?畴前面图中我们可以看到,除了五个agent之外,我们另有其他的组件,包含conv_checker,conv_coverage和conv_virtual_sequencer。
  1.   class conv_checker extends uvm_scoreboard;  endclass:conv_checker  class conv_coverage extends uvm_component;  endclass:conv_coverage  class conv_virtual_sequencer extends uvm_sequencer;    cfg_sequencer    cfg_sqr;    mem_in_sequencer fmi_sqr;    mem_in_sequencer wt_sqr;    mem_in_sequencer bias_sqr;  endclass:conv_virtual_sequencer
复制代码
conv_checker继续自uvm_scoreboard,他经过前面所述的五个agent中的monitor,获得DUT的信息,举行数据对照检查。在现在的DUT中,他所实现的功用是,在一次卷积运算竣事后,操纵软件算法间接举行卷积运算,然后与DUT的盘算结果举行对照,确保DUT功用正确。
UVM并没有预置的类用于覆盖率收集,所以conv_coverage继续自uvm_component,成为最简单的UVM组件。由于除了寄存器的接口之外,其他都是简单得sram接口,所以只对寄存器举行覆盖率收集。覆盖率组件经过覆盖率的收集,量化功用考证的完整性,按照对应的功用点,设定对应的覆盖率,而功用考证的方针就是为了到达100%的功用覆盖率。
conv_virtual_sequencer继续自uvm_sequencer,其自己并没有什么功用,所以他的名字中带有virtual,他只是一个捏造的sequencer。其内部包含了cfg_sqr,fmi_sqr,wt_sqr和bias_sqr,感化就是将他们整合在一路,sequencer就是一根数据线,uvm_sequence_item就是传输的数据,而virtual_sequencer就一个集线器大要说一个拓展坞,把很多条数据线绑在一路。
conv_env

数据的驱动由uvm_driver实现,检测由uvm_monitor实现,激励由uvm_sequencer转达,数据对照由conv_checker实现,覆盖率收集由conv_coverage实现。那末接下来就需要把这些组件全数整合在一路,成为一个考证情况,这即是conv_env。在这里,我们只需要完成各个组件的例化和他们之间的毗连,不要关心其他工作。
  1.   class conv_env extends uvm_env;    cfg_agent cfg_agt;    mem_in_agent fmi_agt;    mem_in_agent wt_agt;    mem_in_agent bias_agt;    mem_out_agent fmo_agt;    conv_checker chker;    conv_coverage cvrg;    conv_virtual_sequencer virt_sqr;  endclass: conv_env
复制代码
uvm_test

现在我们已经获得了一个针对卷积模块的DUT,那末怎样起头仿真测试?回想前面所提到的virtual_sequencer,我们只需要经过virtual_sequencer对每个DUT的接口举行驱动,就能让DUT运转起来。针对每一个测试,我们需要建立对应的uvm_test类,然后再uvm_test内经过virtual_sequencer举行激励发送即可。
  1.   class conv_base_test extends uvm_test;    conv_env env;          task run_phase(uvm_phase phase);      phase.raise_objection(this);      this.run_top_virtual_sequence();      phase.drop_objection(this);    endtask    virtual task run_top_virtual_sequence();    endtask  endclass: conv_base_test
复制代码
上述代码中的run_phase的内容就是在构建情况后,全部仿真真正需要举行的测试内容。可以看到我们界说了一个run_top_virtual_sequence方式,用于运转virtual_sequence。
与virtual_sequencer对应的,virtual_sequence就是virtual_sequencer所需要传输的内容,它的内部会包含林林总总的sequence,针对每一个agent发送差此外激励。经过点窜virtual_sequence的内容,我们便可以大要完成差此外测试用例。
启动方式

这里先不会商全部情况的树状结构、毗连方式和运转机制,这些将在后续的推送中实现。
在构建完全部情况和测试用例今后,我们就需要在顶层启动测试。
[code]module tb ();logic clk;logic rst_n;    conv i_conv ();//这里省略了端口毗连,具体请参考尝试代码  // clock generation  initial begin    clk

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表