问题描述
我正在尝试为一组代理创建具有参数化值的虚拟接口。
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