聊聊`uvm_*_imp_decl的底層實(shí)現(xiàn)原理
時(shí)間:2021-11-12 14:15:40
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]宏是任何軟件中不可或缺的組成部分,通用驗(yàn)證方法(UVM)庫也不例外。在日常編程中應(yīng)該盡可能地使用宏,以避免書寫重復(fù)的代碼,同時(shí)通過不同的宏可以區(qū)分不同的版本。對于uvm中的宏`uvm_*_imp_decl,可以定義了特殊的imp端口,使一個(gè)組件能夠?qū)崿F(xiàn)一個(gè)TLM接口的多個(gè)實(shí)例化。...
宏是任何軟件中不可或缺的組成部分,通用驗(yàn)證方法(UVM)庫也不例外。在日常編程中應(yīng)該盡可能地使用宏,以避免書寫重復(fù)的代碼,同時(shí)通過不同的宏可以區(qū)分不同的版本。
對于uvm中的宏`uvm_*_imp_decl,可以定義了特殊的imp端口,使一個(gè)組件能夠?qū)崿F(xiàn)一個(gè)TLM接口的多個(gè)實(shí)例化。例如,uvm_analysis_imp調(diào)用了組件的write 方法,多個(gè)這樣的uvm_analsys_imps都將調(diào)用相同的write 方法。要解決這個(gè)問題,可以調(diào)用uvm_*_imp_decl宏來定義多個(gè)調(diào)用組件中不同方法的imp端口。
下面是示例代碼
寫入expect將調(diào)用write_exp,寫入actual將調(diào)用write_act,其基本原理是使用了‘uvm_analysis_imp_dec宏擴(kuò)展一小部分代碼,完成聲明所需的類和方法。
?
對于uvm中的宏`uvm_*_imp_decl,可以定義了特殊的imp端口,使一個(gè)組件能夠?qū)崿F(xiàn)一個(gè)TLM接口的多個(gè)實(shí)例化。例如,uvm_analysis_imp調(diào)用了組件的write 方法,多個(gè)這樣的uvm_analsys_imps都將調(diào)用相同的write 方法。要解決這個(gè)問題,可以調(diào)用uvm_*_imp_decl宏來定義多個(gè)調(diào)用組件中不同方法的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將調(diào)用write_exp,寫入actual將調(diào)用write_act,其基本原理是使用了‘uvm_analysis_imp_dec宏擴(kuò)展一小部分代碼,完成聲明所需的類和方法。
uvm_analysis_imp_exp
uvm_analysis_imp_act
write_exp
write_act
如果不想使用*_imp_decl宏,可以通過“策略”類實(shí)現(xiàn)類似操作。定義一個(gè)將策略類作為參數(shù)的通用uvm_analysis_imp。aimp 的write方法調(diào)用了策略類中的靜態(tài)寫方法,該方法調(diào)用了組件中的一個(gè)唯一write方法。需要為uvm_analysis_imp的每個(gè)實(shí)例定義一個(gè)單獨(dú)的策略類。?
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
?