首页 > 解决方案 > 为代理数组设置参数化虚拟接口

问题描述

我正在尝试为一组代理创建具有参数化值的虚拟接口。

interface trig_if #(parameter width=16) (input clk, input reset);
    logic [width-1 :0] en;
    logic [width-1 :0] trig_out;
endinterface
module tb_top; 
..
..
trig_if #(.width(16)) trig1;
trig_if #(.width(8)) trig2;
trig_if #(.width(9)) trig3;
...

uvm_config_db#(virtual trig_if#(16))::set(null, "uvm_test_top.env.tagent[0].*", "trig_vif", trig1);
uvm_config_db#(virtual trig_if#(8))::set(null, "uvm_test_top.env.tagent[0].*", "trig_vif", trig2);
uvm_config_db#(virtual trig_if#(9))::set(null, "uvm_test_top.env.tagent[0].*", "trig_vif", trig3);
..
endmodule
//Env
class env extends uvm_env;
..
agent tagent[];//dynamic array
..
tagent = new[3];
..
for (int i=0; i < 3; i++) begin
  tagent[i] = agent::type_id::create($sformatf("tagent[%0d]",i), this);
end
..
endclass
//driver
class driver extends uvm_driver;
virtual trig_if vif;
..
..
if(!uvm_config_db#(virtual trig_if)::get(this, "", "trig_vif", vif))
  `uvm_fatal("NOVIF", {"Virtual interface must be set for: ", get_full_name(), ".vif"})
..
endclass

` 错误信息:必须为:uvm_test_top.env.tagent[1].driver 设置虚拟接口

从这个错误中,我的理解是在驱动程序内部创建的虚拟接口宽度为 16,而不是精确的参数化宽度为 8。

如何在不参数化代理/驱动程序类的情况下将参数值传递给代理/驱动程序?

任何人都可以对此有所了解,请告诉我。

标签: system-veriloguvm

解决方案


请修改后尝试如下:

module tb_top; 
..
..
trig_if #(.width(16)) trig1;
trig_if #(.width(8)) trig2;
trig_if #(.width(9)) trig3;
...

uvm_config_db#(virtual trig_if#(16))::set(null, "uvm_test_top.env.tagent[0].*", "trig_vif_16b", trig1);
uvm_config_db#(virtual trig_if#(8))::set(null, "uvm_test_top.env.tagent[0].*", "trig_vif_8b", trig2);
uvm_config_db#(virtual trig_if#(9))::set(null, "uvm_test_top.env.tagent[0].*", "trig_vif_9b", trig3);
..
endmodule

司机:

//driver
class driver extends uvm_driver;
virtual trig_if  #(.width(16)) vif_16;
virtual trig_if  #(.width(8)) vif_8;
virtual trig_if  #(.width(9)) vif_9;
..
..
if(!uvm_config_db#(virtual trig_if#(16))::get(this, "", "trig_vif_16b", vif_16))
  `uvm_fatal("NOVIF", {"Virtual interface must be set for: ", get_full_name(), ".vif16b"})
if(!uvm_config_db#(virtual trig_if#(8))::get(this, "", "trig_vif_8b", vif_8))
  `uvm_fatal("NOVIF", {"Virtual interface must be set for: ", get_full_name(), ".vif8b"})
if(!uvm_config_db#(virtual trig_if#(9))::get(this, "", "trig_vif_9b", vif_9))
  `uvm_fatal("NOVIF", {"Virtual interface must be set for: ", get_full_name(), ".vif9b"})
..
endclass

推荐阅读