为代理数组设置参数化虚拟接口

问题描述

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

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,trig2);
uvm_config_db#(virtual trig_if#(9))::set(null,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,"",vif))
  `uvm_fatal("NOVIF",{"Virtual interface must be set for: ",get_full_name(),".vif"})
..
endclass

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

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

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

有没有人有这方面的想法,请告诉我。

解决方法

请在修改后尝试如下:

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,"trig_vif_8b",trig2);
uvm_config_db#(virtual trig_if#(9))::set(null,"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,"",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,vif_8))
  `uvm_fatal("NOVIF",".vif8b"})
if(!uvm_config_db#(virtual trig_if#(9))::get(this,vif_9))
  `uvm_fatal("NOVIF",".vif9b"})
..
endclass