Interface Array使用案例
前言:在IT/SoC Level验证中,经常会遇到一个agent例化多次的问题,因此每个agent都需要给它set interface,如果展开写,将会出现很多uvm_config_db::set()语句,显得冗余。那么有没有办法通过循环来实现这种场景下的Interface set呢?本文将介绍一种可行的方案 --- 使用Interface数组和generate块来简化Interface set。
一、Interface array configuration
bit clk[`IF_NUM];
bit ext_clk;
generate
for(genvar ii = 0; ii < `IF_NUM; ii++) begin: if_loop
if(ii < `IF_NUM-1) begin: nor_ck
clk_if clk_vif(.clk(clk[ii]));
end
else begin: nor_ck
clk_if clk_vif(.clk(ext_clk));
end
initial begin
uvm_config_db#(virtual clk_if)::set(uvm_root::get(), $sformatf("uvm_test_top.env.clk_agt[%0d].*", ii), "vif", if_loop[ii].nor_ck.clk_vif);
end
end
endgenerate
- 注意:上面uvm_config_db中引用clk_vif的hierarchy时,要加上if_loop[ii].nor_ck。
二、Interface array中的成员赋值
bit pro_ck;
stream_if strm_vif[`STM_NUM](.clk(por_ck));
initial begin
force strm_vif[2].clk = 0;
end
- 上述代码原本期望的结果是只有strm_vif[2].clk被force成0,而实际 产生的结果是所有的strm_vif[*].clk全部force成0了;
- 建议声明interface array时,传入的参数也要是array,如一中的例子。
三、Interface array成员操作
generate
for(genvar ii = 0; ii< `STM_NUM; ii++) begin: if_loop
stream_if strm_vif(.clk(por_ck[ii]));
end
endgenerate
for(genvar ii = 0; ii < `STM_NUM; ii++) begin
initial
force if_loop[ii].strm_vif.clk = 0;
end
end