1、Soc/ASIC/FPGA验证有什么区别
2、验证策略:白盒验证、灰盒验证、黑盒验证
白盒验证:设计细节对验证者是完全可见的
灰盒验证:设计细节对验证者部分可见
黑盒验证:设计细节对验证者不可见
3、factory机制
factory机制的目的是在不改变代码的情况下实现不同对象的替换。它主要通过两张表来实现,第一张表是注册表,记录了所有注册的类;第二张表是替换表,记录了哪些类替换了哪些类。当初始化某个类的实例时,factory机制会检查该类是否被替换了,如果被替换的话,则调用替换类的new函数实例化对象。使用factory机制的前提有以下几点:
-无论是重载的类还是被重载的类,都需要在类定义时注册到factory机制中。
-被重载的类在实例化时,要使用factory机制式的实例化方式,而不能使用传统的new方式
-重载的类必须派生自被重载的类
4、信息服务机制
uvm内置打印语句有四种严重性,`uvm_info,`uvm_warning,`uvm_error和`uvm_fatal,这四种严重性之间可以互相重载。
uvm_info的冗余度有UVM_NONE,UVM_LOW,UVM_MEDIUM,UVM_HIGH等
5、configuration机制
可以用来传递值、对象和interface,增加了平台的可重用性。它支持通配符和正则表达式,可对多个变量进行配置;支持用户自定义的数据类型;可以在仿真运行的过程中进行配置。
configuration的机制由两部分组成,设置配置资源和获取配置资源。设置的配置资源被存放在uvm资源池中(通过set函数实现),然后在适当的地方获取配置资源(通过get函数实现),先设置后获取。
6、sequence机制:sequence、sequencer和driver是如何协作的?
①sequence产生的事务发送给相应的sequencer,然后等待driver返回完成标志才开始下一个事务的产生
②sequencer将收到的事务存在fifo中,当收到driver发来的事务请求时,将fifo中的事务发送给driver
③driver处理收到的事务,处理完成后向sequencer发送一个完成标识
④sequencer将收到的完成标识转发给sequence,于是sequence开始下一轮的事务产生周期
7、advanced sequence
sequence library:本质是sequence类,包含了一组在其内部注册了的sequence类。在定义sequence时,使用`uvm_add_to_lib()宏将其注册到sequence_library中。sequence library和普通的sequence有以下的区别:
-其他sequence可以向sequence library注册
-可根据配置产生并且执行已经在其内部注册过的sequence
-具有多种内嵌的选择sequence的方法
-支持用户自定义的sequence算法
-注册方式的多样化
8、常用的uvm_do系列宏
-`uvm_do(SEQ_OR_ITEM):实例化一个事务,并将其随机化,最终将其送给seqr
-`uvm_do_pri(SEQ_OR_ITEM,PRIORITY):额外配置事务的优先级
-`uvm_do_with(SEQ_OR_ITEM,CONSTRAINTS):额外对事务进行约束
-`uvm_do_pri_with(SEQ_OR_ITEM,PRIORITY,CONSTRAINTS)
-`uvm_do_on(SEQ_OR_ITEM,SEQR):显示地指定使用哪个seqr发送此事务,在不指定的情况下默认使用启动seq时指定的seqr
-`uvm_do_on_pri(SEQ_OR_ITEM,SEQR,PRIORITY)
-`uvm_do_on_with(SEQ_OR_ITEM,SEQR,CONSTRAINTS)
-`uvm_do_on_pri_with(SEQ_OR_ITEM,SEQR,PRIORITY,CONSTRAINTS)
*uvm_create宏与uvm_send宏也可以共同使用用来产生事务。uvm_create宏的作用是实例化事务,然后可以对事务做自定义的处理,之后再通过uvm_send宏发送出去。
*uvm_do宏主要封装了哪些内容?
tr = new("tr");//初始化事务
start_item(tr);
assert(tr.randomize()with{...});//随机化事务
finish_item(tr);
9、TLM:Transaction Level Model,事务级建模,为某种事务项建立专门的通信通道,避免多种通信之间出现混乱。
上图中介绍了6种常用的port端口,其中括号中的T代表transaction,即传输的数据对象类型。箭头表示端口包含了哪些方法。
-put()是一个task,可能会阻塞当前进程直到transaction传输成功;
-try_put()是一个function,不会阻塞当前进程,不管transaction传输是否完成都会立刻返回;
-can_put()是一个function,不会阻塞当前进程,不会发生transaction传输,只是检查对方是否准备好了接收;
-get()是一个task,会阻塞当前进程直到成功获取了一个transaction之后返回;
-try_get()是一个function,不会阻塞当前进程而立即返回,获取transaction可能会失败;
-can_get()是一个function,不会阻塞当前进程,不会发生transaction传输,只是检查对方是否准备好发送transaction。
上图列出了6种常用的imp端口,与6种port端口一一对应。其中括号中的参数T表示transaction,参数IMP表示实现这个接口的component。imp中的put方法原型如下,get方法与其类似:
//put方法原型
virtual task put(input T t);
uvm_report_error("put",`UVM_TASK_ERROR,UVM_NONE)
endtask
//try_put方法原型
virtual function bit try_put(input T t);
uvm_report_error("try_put",`UVM_TASK_ERROR,UVM_NONE)
return 0;
endfunction
//can_put方法原型
virtual function bit can_put();
uvm_report_error("can_put",`UVM_TASK_ERROR,UVM_NONE)
return 0;
endfunction
在PORT,EXPORT和IMP三种端口类型中,IMP的优先级最低,PORT的优先级最高,通信操作只能由高优先级的端口向低优先级端口发起,且链接的终点必须是IMP。IMP所在的类中需要重载名为put或get的函数,具体的函数由IMP的类型决定。
*还存在analysis_port和analysis_export端口,它们与上述port和export端口的区别是:
第一:这两种端口可以与多个IMP(analysis_imp)连接,类似于广播,是一对多的通信,而port和get是一对一的通信(除非在实例化时制定可以连接的数量)。
第二:put和get系列端口都有阻塞和非阻塞的区分,但是对于analysis_port和analysis_export端口来说没有阻塞和非阻塞的概念。
analysis_imp所在的组件中必须要定义名为write的函数。
*平台中经常使用fifo通信(uvm_analysis_fifo),它的本质是一块缓存加上两个IMP。
10、callback机制
callback机制的作用是提高验证平台的可重用性,使得某个组件在不同的用例中能执行不同的操作,post_randomize(),pre_body(),post_body()等都属于广义的callback函数。
原理:在某个组件中调用了callback类的pre()函数,我们希望在不同的用例中该函数实现的内容也不一样。 解决方法是定义一个基类,在基类中定义虚的pre()函数,同时定义一个以该类为元素的数组(该数组需是全局的) 。 在用例中自定义继承自基类的callback类,对pre()函数进行重载,并将实例化的callback对象添加到全局变量数组中。在组件中会遍历数组,将所有实例化的对象的pre()函数都调用一遍。
11、寄存器模型RAL
UVM的寄存器模型是一组高级抽象的类,用来对DUT中具有地址映射的寄存器和存储器进行建模。它非常贴切的反映DUT中寄存器的各种特性,可以产生激励作用于DUT并进行寄存器功能检查。通过UVM的寄存器模型,可以简单高效的实现对DUT的寄存器进行前门或后门操作。它本身也提供了一些寄存器测试的sequence,方便用户直接使用。
————————————————
版权声明:本文为CSDN博主「wonder_coole」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wonder_coole/article/details/91879378
①frontdoor模式:寄存器模型产生事务,通过driver将事务驱动到总线上来对寄存器进行操作,需要消耗仿真时间
②backdoor模式:寄存器模型通过dut的层次结构直接对寄存器进行操作,不消耗仿真时间