[SystemVerilog]Interface Array使用案例

本文介绍了如何在UVM验证环境中利用Interface数组和generate块来避免重复设置接口,通过示例展示了Interface数组的配置、成员赋值以及成员操作,强调了正确引用和操作Interface数组的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元直数字电路验证

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值