在简单的测试平台里,component之间通过变量或者config_db机制通信是可行的,但是如果在复杂测试平台中依然使用这种耦合性很强的方式通信的话,就不太行了。
因此,uvm提供了tlm这样的概念。接下来将会从需求出发,逐步引入port、export、imp、analysis端口、uvm_analysis_imp_decl宏以及fifo等。
1 典型uvm验证平台
2 一对一如何通信(一般方法)说明:这里以monitor和scoreboard之间的通信为例
方法一 使用全局变量 :在monitor里对此全局变量进行赋值, 在scoreboard里监测此全局变量值的改变问题:所有模块都可以修改全局变量,合作中他人误修改可能导致致命bug方法二 a中pulic变量+b对模块a的引用 :scoreboard中使用public类型的变量,然后monitor中使用指向scoreboard的指针对该变量进行赋值问题:monitor可以修改scoreboard中所有public类型变量方法三 config机制(类似于在指定模块作用域构建了全局变量) :在base_test中实例化一个config_object,并将其指针通过config_db传递给scoreboard和monitor,然后两个模块就可以对该config_object中变量进行操作问题1:需要引入一个专门的config_object类问题2:一定要有base_test(父模块)这个第三方的参与,这样就不能保证某一个从base_test派生而来的类会不会改变这个config_object类中某些变量的值现有机制更多通信问题
通信需要考虑阻塞和非阻塞的处理方式如果scoreboard主动要求向monitor请求数据, 这样的行为方式使用systemverilog搭建会非常复杂3 一对一如何通信(引入tlm)3.1 新概念tlm:是transaction level modeling( 事务级建模) 的缩写,是将某一特定功能的一组信息封装在一起成为一个类,通过这个类(即事务)进行通信。三个端口:port(发起者)、export(接收者)、imp(执行者)端口方法:put/get/transport/peek/get_peek3.2 使用举例说明:以blocking_put系列端口,port>export>imp的连接举例说明
a|port发起端口操作put :task a::main_phase中a_port.put(tr);建立a|port和b|export的连接 :ab的顶层模块my_env::connect_phase中:a_inst.a_port.connect(b_inst.b_export);建立b|export和b|imp的连接 :b::connect_phase中:b_export.connect(b_imp);建立b|imp和b中操作put的连接 :b模块定义中:uvm_blocking_put_imp#(my_transaction, b) b_imp;b中操作put的实现 :function void b::put(my_transaction tr);注意:export可以省略,即 port直接连接到imp
4 一对多如何通信(引入analysis端口)4.1 使用举例
a|analysis_port发起端口操作write :task a::main_phase中a_ap.write(tr);
建立a|analysis_port和(b或c)|analysis_imp,的连接 :a(b或c)的顶层模块my_env::connect_phase中
a_inst.a_ap.connect(b_inst.b_imp);
a_inst.a_ap.connect(c_inst.c_imp);
建立(b或c)|analysis_imp和(b或c)中操作write的连接 :(b或c)模块定义中:
uvm_analysis_imp#(my_transaction, b) b_imp;或
uvm_analysis_imp#(my_transaction, c) c_imp;
(b或c)中操作write的实现 :
function void b::write
function void c::write
5 多imp的模块的通信问题5.1 问题描述一个component(my_scoreboard)内有多个imp时,依据前面知识,component(my_scoreboard)中只能有一个write方法,这如何处理两个imp(来自输出监视monitor 和 来自参考模型model)
5.2 解决方法方法一:使用宏uvm_analysis_imp_decl通过宏uvm_analysis_imp_decl,在component(my_scoreboard)中添加不同的后缀以区分两个imp的处理逻辑。具体实现如下:
通过宏uvm_analysis_imp_decl声明两个后缀_monitor和_model
uvm_analysis_imp_decl(**_monitor**)
uvm_analysis_imp_decl( _model )
使用带后缀的analysis_imp端口类声明两个analysis_imp端口
uvm_analysis_imp**_monitor**#(my_transaction, my_scoreboard) monitor_imp;
uvm_analysis_imp**_model**#(my_transaction, my_scoreboard) model_imp;
使用带后缀的write方法实现analysis_imp对信号的处理逻辑
extern function void write**_monitor**(my_transaction tr);
extern function void write**_model**(my_transaction tr);
宏uvm_analysis_imp_decl的特性会让 相同后缀的 analysis_imp端口 和 write函数 对应上
function void my_scoreboard ::write_model(my_transaction tr);
function void my_scoreboard ::write_monitor(my_transaction tr);
方法二:使用fifo通信将imp的实现逻辑放在fifo中,而component(my_scoreboard)作为port端,主动请求get到fifo中的数据,关键代码如下:
// my_scoreboard类中uvm_blocking_get_port #(my_transaction) exp_port;uvm_blocking_get_port #(my_transaction) act_port;// task my_scoreboard::main_phase中exp_port.get(get_expect); // 获取的数据存到get_expect中act_port.get(get_actual); // 获取的数据存到get_actual中// my_env类中uvm_tlm_analysis_fifo #(my_transaction) agt_scb_fifo;uvm_tlm_analysis_fifo #(my_transaction) agt_mdl_fifo;uvm_tlm_analysis_fifo #(my_transaction) mdl_scb_fifo;// function void my_env::connect_phase中i_agt.ap.connect(agt_mdl_fifo.analysis_export);mdl.port.connect(agt_mdl_fifo.blocking_get_export);mdl.ap.connect(mdl_scb_fifo.analysis_export);scb.exp_port.connect(mdl_scb_fifo.blocking_get_export);o_agt.ap.connect(agt_scb_fifo.analysis_export);scb.act_port.connect(agt_scb_fifo.blocking_get_export);注意:fifo中的analysis_export和blocking_get_export虽然名字中有关键字export, 但是其类型却是imp
5.3 用fifo还是用imp个人推荐使用fifo,尤其是对于使用端口数组的情况。因为ap与imp直接相连不能使用for循环(write函数需要一个一个写,没法用数组),会导致代码量增加,理解困难。
国产ADC可100%兼容AD7192用于电子秤系统
eSIM技术对物联网的重要性
基于一种去中心化的博彩平台Augur介绍
领唐:物联网技术中的佼佼者
明确图像处理检测任务选择合适的工业相机
在UVM中component之间如何通信呢?
看懂EMC整改知识:原来竟然如此简单!(上)
电脑主板元件认识视频
一文详细了解荣耀Earbuds 3 Pro耳机
微软推送Win10新版:有何独特之处?要如何升级?
华为平板M5青春版搭载麒麟710处理器拥有过滤蓝光技术呵护双眼
iPhone与安卓手机最大的不同是什么?
手持式地物光谱仪在遥感中的应用案例
精彩预告 | OpenHarmony Meetup 2023 广州站即将启幕
步入“Bank4.0”时代,奥拓电子助力多家银行智慧化升级
人工智能的发展有何新变化?
为什么晶振不集成到IC内部
传感器/变送器原理
关于Vivado时序分析介绍以及应用
自动驾驶芯片之争:ARM Cortex-A76AE对决MIPS I6500-F