system-verilog - 为代理数组设置参数化虚拟接口
问题描述
我正在尝试为一组代理创建具有参数化值的虚拟接口。
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。
如何在不参数化代理/驱动程序类的情况下将参数值传递给代理/驱动程序?
任何人都可以对此有所了解,请告诉我。
解决方案
请修改后尝试如下:
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
推荐阅读
- jdbc - 尝试路由 HTTPS 流量时,SSH 隧道无法与 JDBC 一起使用
- ios - 在 Swift 中按条件使用 dispatchqueue 的最佳方法
- android - (kotlin) editText.toString().toInt() 在 anroid studio 中不起作用
- android - 连接的线程返回空对象
- ruby-on-rails - Rails 5.2 服务器错误 - 完成新手
- php - 取决于从和到日期excel报告需要在php中下载
- python - 在 Python 中为条形图的多个条形设置不同的颜色?
- node.js - Jenkins - env:'node':没有这样的文件或目录
- javascript - 使用对象属性从对象数组中删除一个对象
- ruby-on-rails - 功能测试在生产中工作但不在开发中