Dinglei_hello · 2021年09月26日

聊聊uvm_imp_decl的底层实现原理

宏是任何软件中不可或缺的组成部分,通用验证方法(UVM)库也不例外。在日常编程中应该尽可能地使用宏,以避免书写重复的代码,同时通过不同的宏可以区分不同的版本。

对于uvm中的宏`uvm_imp_decl,可以定义了特殊的imp端口,使一个组件能够实现一个TLM接口的多个实例化。例如,uvm_analysis_imp调用了组件的write 方法,多个这样的uvm_analsys_imps都将调用相同的write 方法。要解决这个问题,可以调用uvm_imp_decl宏来定义多个调用组件中不同方法的imp端口。

下面是示例代码

‘uvm_analysis_imp_decl(_exp)
‘uvm_analysis_imp_decl(_act)
class scorebd extends uvm_component;
uvm_analysis_imp_exp #(my_tr,scorebd) expect;
uvm_analysis_imp_act #(my_tr,scorebd) actual;
virtual function void write_exp(my_tr tr);
...
endfunction
virtual function void write_act(my_tr tr);
...
endfunction
endclass

写入expect将调用write_exp,写入actual将调用write_act,其基本原理是使用了‘uvm_analysis_imp_dec宏扩展一小部分代码,完成声明所需的类和方法。

uvm_analysis_imp_exp
uvm_analysis_imp_act
write_exp
write_act

如果不想使用*_imp_decl宏,可以通过“策略”类实现类似操作。定义一个将策略类作为参数的通用uvm_analysis_imp。aimp 的write方法调用了策略类中的静态写方法,该方法调用了组件中的一个唯一write方法。需要为uvm_analysis_imp的每个实例定义一个单独的策略类。

class aimp #(type T=int, IMP=int, POLICY=int) extends uvm_port_base #(tlm_if_base #(T,T));
`UVM_IMP_COMMON(`TLM_ANALYSIS_MASK,“uvm_analysis_imp”,IMP)
function void write (input T t);
POLICY::write(m_imp , t);
endfunction
endclass

class wr_to_A #(type T=int, IMP=int);
static function void write(T tr, IMP comp);
comp.write_A(tr);
endfunction
endclass

class wr_to_B #(type T=int, IMP=int);
static function void write(T tr, IMP comp);
comp.write_B(tr);
endfunction
endclass

class my_comp extends uvm_component;
aimp #(my_tr, my_comp, wr_to_A) A_ap;
aimp #(my_tr, my_comp, wr_to_B) B_ap;
virtual function void write_A(my_tr tr);
...
endfunction
virtual function void write_B(my_tr tr);
...
endfunction
endclass

END

作者:验证哥布林
原文链接:https://mp.weixin.qq.com/s/rbo0\_rgRQ\_Bmzj3nzdn55g
微信公众号:
芯片验证工程师.jpg

推荐阅读

更多IC设计技术干货请关注IC设计技术专栏
推荐阅读
关注数
11164
内容数
1222
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息