当前位置:首页 > 公众号精选 > 芯片验证工程师
[导读]宏是任何软件中不可或缺的组成部分,通用验证方法(UVM)库也不例外。在日常编程中应该尽可能地使用宏,以避免书写重复的代码,同时通过不同的宏可以区分不同的版本。对于uvm中的宏`uvm_*_imp_decl,可以定义了特殊的imp端口,使一个组件能够实现一个TLM接口的多个实例化。...

宏是任何软件中不可或缺的组成部分,通用验证方法(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);...endfunctionvirtual function void write_act(my_tr tr);...endfunctionendclass

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

uvm_analysis_imp_expuvm_analysis_imp_actwrite_expwrite_act如果不想使用*_imp_decl宏,可以通过“策略”类实现类似操作。定义一个将策略类作为参数的通用uvm_analysis_impaimp 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);endfunctionendclass
class wr_to_A #(type T=int, IMP=int);static function void write(T tr, IMP comp);comp.write_A(tr);endfunctionendclass
class wr_to_B #(type T=int, IMP=int);static function void write(T tr, IMP comp);comp.write_B(tr);endfunctionendclass
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);...endfunctionvirtual function void write_B(my_tr tr);...endfunctionendclass

 


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭