![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UVM文章
硅码农
这个作者很懒,什么都没留下…
展开
-
浅谈UVM/SV中的进程管理
在System Verilog中 initial/always/task/function/fork 等都会产生进程,产生的过程是自动产生的(process),用户不可以手动的产生process,但是可以引用已经存在的进程句柄,从而实现进程的管理,在SV中 ,定义了class process ...原创 2020-09-04 20:35:42 · 2997 阅读 · 0 评论 -
UVM之uvm_callback详解
在DV中,我们可以使用factory,override机制来实现方法的重载,继而修改现有类的方法和属性。想象一下下面的一个应用场景,driver从sequencer拿到transaction,需要根据一些条件进行一些特殊处理才可以驱动到interface上,而现有的环境没有做这方面的处理。这个时候我们可以重载这个类,修改这个方法(用户的角度),但是TB开发人员(有时候不是用户),比如VIP开发的时候,开发人员可能无法穷经所有的情况,或者锁着项目的迭代,出现了一些新的特性,在TB中使用回调函数变成了一种可选项原创 2020-07-29 20:52:28 · 3960 阅读 · 1 评论 -
UVM中寄存器模型中的高级用法->参数uvm_object extension的用处
在write方法中有一个参数uvm_object extension。这个参数我们在之前一般不会去关注,在调用adapter时,reg2bus,方法reg2bus的只能接受一些通用参数,比如addr,data,access等,但是在一些特殊寄存器访问时,我们在driver中不仅要在同一个driver中驱动bus总线,还要驱动别的信号(类bus信号),这个时候参数extension就有了用处。在调用...原创 2020-07-19 10:13:32 · 2543 阅读 · 1 评论 -
UVM中(TB 环境)不同组件参数类型的要求
本文的目的在于总结,总结在应用中可以不注意的点,导致出现意想不到的错误,下面暂时给出下面几条总结(1)TLM 端口的参数类型必须一致才可以试下连接,两边类型不一样,即使是一边是parent_class,一边是child_class,发生连接时也会报错(2)sequencer和driver的参数类型必须一致,本质上是TLM端口的连接(3)sequence和sequencer的参数类型可以出现不一致的情况,但是要满足parent_class,child_class的关系,因为在sequencer中将se原创 2020-06-20 17:13:43 · 816 阅读 · 0 评论 -
uvm_mem模型(2)
这里介绍mem模型的常用方法,write,readburst_write,burst_readclass my_mem extends uvm_mem; function new (strng name); super.new(name,1024,32,"RW"); endfunctionendclassclass my_blk extends uvm_reg_block; my_mem mem_clent; uvm_reg_map my_map;原创 2020-06-04 20:07:42 · 1723 阅读 · 0 评论 -
uvm_mem 模型 (1)
class my_mem extends uvm_mem; function new (strng name); super.new(name,1024,32,"RW"); endfunctionendclassclass my_blk extends uvm_reg_block; my_mem mem_clent; uvm_reg_map my_map; function build(); mem_clent=my_mem::typ原创 2020-06-04 19:39:05 · 2488 阅读 · 0 评论 -
UVM RAL 中的显示预测 uvm_reg_predictor
在之前简单介绍了uvm_reg_predict是怎么实现显示预测的,连上map,连上adapter,连上bus_in即可,下面我们要详细的解释原因先解释uvm_reg_predict中重要变量的作用uvm_reg_map map : 从bus总线上上采样到addr信息之后,有map根据addr寻找到RAL中相关寄存器句柄uvm_reg_adapter adapter:从bus总线上上采样到addr信息之后,调用adapter.bust2reg实现transaction 转换uvm_analysis原创 2020-06-01 19:48:07 · 2404 阅读 · 0 评论 -
UVM RAL uvm_reg_map.get_reg_by_offset
在UVM寄存器模型中,调用uvm_reg_block::lock_model完成整个RAL模型的生成,整个时候整个寄存器scope的地址也已经生成了,比如有下面的层次化结构 reg_blk.reg1。向写寄存器reg1,可以调用reg_blk.reg1,write()方法。那还存在别的友好的方法开获取RAL模型中某个寄存器的句柄吗,毕竟如果整个RAL模型存在上百个寄存器,记住某个寄存器的句柄还是比较困难的。下面我们来介绍uvm_reg_map.get_reg_by_offset开获取寄存器句柄在lock原创 2020-06-01 17:31:01 · 2092 阅读 · 0 评论 -
SV 中宏的使用
在SV中,养成使用宏的习惯可以大大提高code 的可阅读性,让我们从简单重复的工作中脱离出来,聚焦技术方法本身或者硬件的理解上,可以有效的提高我们的验证效率。在我们验证的过程或多或少的会遇到在TB/test中使用宏的方法,当然我们是看的懂的,但是我们一定要思考这个TB、test为什么要这么写,有什么好处,如果让我们自己开搭建的话,我们会思考使用这种方法吗,而不能仅仅停留在看的懂,会用的level,毕竟这个是可以成为我们的核心技能的。下面我们给个实际的工程例子class base_test extend原创 2020-05-16 10:04:20 · 1269 阅读 · 0 评论 -
UVM中通过宏启动sequence 的弊端
在UVM中启动sequence的方法主要有两种,一种是start的方法,一种是通过宏,比如`uvm_do。我们推荐在使用UVM的过程中尽量不要使用宏来启动sequence,而是使用start,因为使用宏的方法有一些意想不到的弊端,会给我们带来意想不到的惊喜,一旦出现问题,会给debug调试带来困难。下面我们讲解一下使用宏启动sequence有什么样的弊端。在UVM中经常有一个顶层virtual ...原创 2020-04-27 19:31:43 · 855 阅读 · 0 评论 -
UVM 代码生成器 easier UVM
转自:http://www.eetop.cn/blog/html/28/1561828-3571704.htmlUVM大大提高了我们开发验证平台的效率。但同时,熟练掌握UVM搭建验证平台也并不是一件容易的事情。同时由于不同验证工程师搭建环境的风格不太一致,所以在一个项目中常会出现不好管理,甚至前后不一相互矛盾的UVM代码。对于这些问题UVM 代码生成器基本都可以解决,更为关键的是,这对...转载 2020-04-18 08:24:59 · 2174 阅读 · 0 评论 -
UVM sequence机制(4)(response 特性)
这篇我们介绍一下sequence 机制的response 属性。/////sequence1class sequence1 extends uvm_sequence;........................................................virtual task body(); item1 req1; item1 ...原创 2020-03-22 13:11:17 · 2388 阅读 · 1 评论 -
UVM sequence机制(3)(sequence的仲裁2)
这篇主要介绍仲裁算法的使用,sequence在发送item的过程中,sequencer使用别的仲裁算法,在UVM中仲裁算法有下面这几种typedef enum{ UVM_SEQ_ARB_FIFO, UVM_SEQ_ARB_WEIGHTED, UVM_SEQ_ARB_RANDOM, UVM_SEQ_ARB_STRICT_FIFO, UVM_SEQ_ARB_STRICT_RAN...原创 2020-03-22 12:08:40 · 564 阅读 · 0 评论 -
UVM sequence机制(2)(sequence的仲裁1)
这篇我们介绍一下多个sequence同时挂载到sequencer上的情形在上一篇博客中有讲到,在sequencer中有下面几个重要的变量arb_sequence_q[$]中存放每一次sequence发送的请求bit arb_complete[int]中存放仲裁结果(那个sequence 的请求获得了胜利)/////sequence1class sequence1 extends uvm...原创 2020-03-21 16:13:23 · 486 阅读 · 1 评论 -
UVM sequence机制(1)
sequence机制时UVM的核心机制,主要作用的是发送transaction以及对transaction的控制,下面将会重点介绍item transaction是如何从sequence传入到driver的。在这里,我们暂时不会介绍start方法的使用,主要还是item如何从sequence传入到driver的。首先在sequence中负责发送item的方法是start_item和finish...原创 2020-03-21 14:49:55 · 1565 阅读 · 0 评论 -
UVM配置之resource机制(2)
这部分我们将要详细介绍uvm_config_db机制时如何解决uvm_resource_db机制带来的弊端的首先我们来看看uvm_config_db是如何工作的,两个核心方法set和getpackage UVM_cmd; import uvm_pkg::*' `include "uvm_macros.svh" class unit_agent extends ...原创 2020-03-15 12:28:48 · 881 阅读 · 0 评论 -
UVM配置之resource机制(1)
UVM为什么会迅速成为业内标准(已经是IEEE的标准),在于UVM的TB的可复用性,用户友好性。想象一下下面的一个应用场景,我们在搭建TB时,某些case run起来的时候需要配置某些参数,在TB中利用SV的系统函数来获取相应的参数来配置某些特定的应用场景,这样做在现在看来又两处不友好的地方,首先在run的时候需要命令行加入参数,其次如果在环境集成的时候,同样的子TB需要两个来构成上一层的环境...原创 2020-03-15 09:52:48 · 3490 阅读 · 2 评论 -
uvm_object的常见操作print,copy,compare,pack,unpack
在uvm_object中封装了非常有用的方法,主要是print,copy,compare,pack,unpack,下面我们来说明一下print:打印package UVM_cmd; import uvm_pkg::*' `include "uvm_macros.svh" class obj extends uvm_object; int a; ...原创 2020-01-03 17:05:21 · 4853 阅读 · 0 评论 -
UVM field automation
field automation机制在UVM中非常重要,主要是牵扯到打印,比较,复制,打包以及解包等操作。看下面一段代码package UVM_cmd; import uvm_pkg::*' `include "uvm_macros.svh" class obj extends uvm_object; int a; `uvm_object_u...原创 2020-01-03 16:25:26 · 1517 阅读 · 0 评论 -
UVM phase机制(三)objection机制
在上一篇博客UVM phase机制(二)中,我们有介绍到run_phase以及12个run_time_phase是如何运转起来的,但是留了一个小问题就是objection,想要run必须raise_objection,要想结束run必须drop_objection。下面我们详细分析一下为什么会这样在运行到run_node的时候,是这样一个执行结构,fork fork ...原创 2019-12-30 15:36:46 · 6916 阅读 · 0 评论 -
UVM phase机制(二)
UVM中所有的phase是按照一定的顺序执行的,那么UVM是如何组织的?下面我们详细说明一下。首先在phase运行之前已经生成了完整的common domain,这个common domain中的node就是执行的顺序。牵扯到的核心函数是task uvm_phase::m_run_phases(); uvm_root top = uvm_root::get(); // initi...原创 2019-12-30 11:11:42 · 1019 阅读 · 0 评论 -
UVM phase机制(一)
UVM的执行严格按照phase机制在执行的,顺序是:->build_phase->connect_phase->end_of_elaboration_phase->start_of_simulation_phase->run_phase->extract_phase->check_phase->report_phase->fi...原创 2019-12-29 15:13:30 · 2805 阅读 · 0 评论 -
寄存器模型中的预测机制
在操作UVM寄存器模型时,模型中mirror值是如何更新的呢,在RAL机制中,有两种方式可以实现mirror值得更新。(1)自动预测:所有的后门访问均是自动预测,对于前门访问,需要在map中进行设置map.set_auto_predict(1);这个时候,前门访问之后,会调用do_predict进行预测(2)显示预测自动预测有弊端,如果在系统中,一组寄存器除了可以总线驱动之外,也可以使...原创 2019-12-18 15:29:50 · 1274 阅读 · 1 评论 -
寄存器(RAL)模型中的lock
在使用寄存器UVM寄存器模型的时候,当整个模型建立完成以后,必须在root block中调用lock_model,这样整个模型才算建立完整,那么为什么要这么做呢,因为我们在建立模型的时候所有寄存器的地址均是相对地址,在进行前门访问,是以绝对地址进行的,因此lock_model帮助我们得到所有寄存器的绝对地址。 extern virtual function void lock_model();...原创 2019-12-17 11:25:55 · 1440 阅读 · 0 评论 -
寄存器(RAL)模型中的后门操作路径
我们在进行寄存器模型的后门操作时,必须提前设置后门操作路径,以此RAL模型方能进行操作。``在上面这个RAL 模型中,当调用reg_blk.reg1.write(*),参数指定是后门操作(UVM_BACKDOOR),那么RAL模型时如何取得硬件rtl的绝对路径?核心的方法是调用reg::get_full_hdl_path,下面来讨论一下首先要得到这个reg所在block的路径,设置bloc...原创 2019-12-16 18:17:42 · 5095 阅读 · 0 评论 -
寄存器(RAL)模型中的predict操作
在寄存器模型中,比如读写操作,我们是怎么进行预测的,也就是说怎么更新field的3个值得,即value,mirror_value,desired_value。核心方法是do_predict。我们发现在后门访问时,会自动调用do_predict方法进行预测,而在前门访问时,是否会进行预测是有条件的,必须得设置map.set_auto_predict。只有设置了map的自动预测功能才可以在执行完前门读...原创 2019-12-15 16:24:42 · 3083 阅读 · 0 评论 -
寄存器(RAL)模型中的mirror实现读操作
在寄存器读操作中,除了了使用read方法,peek方法,还可以使用mirror方法,mirror方法最大的好处可以进行check,也就是说如果read的值value与RAL中的现有的镜像值不一致的话,可以报出相应的信息。task uvm_reg::mirror(output uvm_status_e status, input uvm_ch...原创 2019-12-15 16:01:46 · 3164 阅读 · 0 评论 -
寄存器(RAL)模型中的peek方法
我们在进行寄存器读操作时,除了使用read方法,还可以使用peek方法,peek方法与read方法不同之处在于(1)read方法支持前门/后门访问,但是peek方法仅仅支持后门访问,(2)read方法会根据field的实际access policy进行read操作,但是peek方法不会case这些,相当于force的方式。task uvm_reg::peek(output uvm_status_...原创 2019-12-15 08:58:37 · 1516 阅读 · 0 评论 -
寄存器(RAL)模型中的set update实现写操作
我们在进行寄存器写操作时,除了使用write方法,还可以使用poke方法,poke方法与write方法不同之处在于(1)write方法支持前门/后门访问,但是poke方法仅仅支持后门方法,(2)write方法会根据field的实际access policy进行write操作,但是poke方法不会case这些,相当于force的方式。task uvm_reg::poke(output uvm_st...原创 2019-12-15 08:52:33 · 2362 阅读 · 0 评论 -
寄存器(RAL)模型中的read方法
在使用UVM寄存器模型时,当对寄存器进行读操作时,有很多种方法,这里介绍最常用的方法:假设已经生成了一个uvm_reg_block模型,名字时reg_blk,在模型中有一个寄存器名字叫reg1。并且reg1添加到了名字是map1的uvm_reg_map中在这里插入代码片下面来讲解一下寄存器模型是如何完成read操作的 extern virtual task read(output uv...原创 2019-12-14 15:01:39 · 3263 阅读 · 0 评论 -
寄存器(RAL)模型中的write方法
在使用UVM寄存器模型时,当对寄存器进行写操作时,有很多种方法,这里介绍最常用的方法:假设已经生成了一个uvm_reg_block模型,名字时reg_blk,在模型中有一个寄存器名字叫reg1。并且reg1添加到了名字是map1的uvm_reg_map中下面来讲解一下寄存器模型时如何完成write操作的 extern virtual task write(output uvm_stat...原创 2019-12-14 14:36:54 · 4331 阅读 · 0 评论 -
UVM消息打印机制之uvm_report (二)
上一个文章中讲解了uvm_report_enable。当enable了,就会执行真正的message的执行方法,还是以`uvm_error宏讲解`define uvm_error(ID, MSG) \ begin \ if (uvm_report_enabled(UVM_NONE,UVM_ERROR,ID)) \ uvm_report_error (ID, MSG,...原创 2019-11-25 17:01:55 · 2263 阅读 · 0 评论 -
UVM消息打印机制之uvm_report (一)
report机制可以实现对信息打印的精确控制。下面分点讲解,均是在uvm_component组件中使用信息宏。(uvm_object中使用原理相同)下面以`uvm_error(“ID”,”message”)来说明:首先介绍在UVM中存在verbosity这个概念,verbosity可以这么理解:反应信息需要被打印的过滤程度,主要有下面几种类型 typedef enum{...原创 2019-11-25 16:14:52 · 5925 阅读 · 0 评论 -
UVM资源池之uvm_pool
class uvm_pool #(type KEY=int,T=uvm_void) extends uvm_object资源类是一个参数类,每一个特定类型的资源类(参数类型确定的话)采用single模式,全局唯一资源类中核心的是联合数组 T pool [KEY];两个核心的静态方法1:get_global_pool:获取全局唯一的pool(资源池)2...原创 2019-11-19 18:37:38 · 1866 阅读 · 0 评论 -
UVM进程同步之uvm_barrier
在UVM中除了使用uvm_event来做同步之外,有时候还有这种应用场景,比如所有进程均在等待,到达一个的等待阈值时,所有进程再同时执行。这个时候可以使用uvm_barrier这个类来实现这种操作。uvm_barrier专门用来同步一定个数进程的类。比如我们需要同步6个进程,那么6个进程各自调用uvm_barrier.wait_for。同时要设置阈值个数是6。这里面有3个重要的方法1:wait...原创 2019-11-18 17:27:58 · 818 阅读 · 0 评论 -
UVM进程的同步之uvm_event
在SV中,可以使用event来实现进程之间的同步,在UVM中也与专门的类来实现进程之间的同步:uvm_event#(typeT=uvm_object)。uvm_event相比于event最大的优势是可以实现不同组件之间的同步。比如组件A,B要实现同步,如果使用SV的方法,必须在组件B中将组件A中的事件event赋值给组件B中的event,B.event=A.event。但是这样做出现了跨组件之...原创 2019-11-18 16:25:50 · 5310 阅读 · 0 评论 -
UVM命令行传参uvm_cmdline_processor
在UVM中环境中,在我们执行simulation的过程中,会在命令行添加一些simulation args。比如./simv –l vcs_run.log +UVM_TESTNAME=my_test在UVM世界中,有一个class专门来处理这些参数。这个类就是uvm_cmdline_processor类的继承关系是:uvm_object->uvm_report_object->...原创 2019-11-18 14:10:03 · 2781 阅读 · 0 评论 -
UVM factory机制 override机制详解
factory机制 顾名思义,factory机制(工厂机制),最大的优点是根据字符串(类名),创建该类的实例,比如下面的一个类:class my_driver extends uvm_driver;当使用factory机制时就可以根据字符串“my_driver”创建属于类my_driver的一个实例。还有另一种解释是factory机制本质上是对new函数的重载,从某种意义上也确实是这么回事...原创 2019-11-16 11:02:11 · 8186 阅读 · 1 评论 -
UVM中一些自带的DPI方法(主要是与后门访问有关)
uvm-hdl.c(包括了所要用到的.c文件,主要是uvm_hdl_vcs.c(VCS),uvm_hdl_inca.c(C),uvm_hdl_questa.c(M)),很久不同 的define来选择不同 的EDA vendor。我们以S家为例子进行简单介绍一下。在uvm-hdl.svh文件中,有下面的方法(DPI)int uvm_hdl_check_path(string path) p...原创 2019-11-14 17:08:56 · 5736 阅读 · 0 评论 -
UVM中利用宏来启动sequence或者item的方法
核心的宏 `uvm_do_on_pri_with(SEQ_OR_ITEM,SEQR,PRIORITY,CONSTRAINTS)参数SEQ_OR_ITEM表示sequence或者item参数SEQR:表示挂载的sequencer参数PRIORITY:表示sequence 或者item的优先级参数CONSTRAINTS:表示另加的约束下面展开这个宏,看看这个宏内部做了什么...原创 2019-11-10 10:28:01 · 3410 阅读 · 0 评论