我已经为我的 DUT 定义了一个接口(interface),如下所示:
interface video_input_interface(clk, rst);
input logic clk;
input logic rst;
logic[1:0] x_lsb;
logic[1:0] x_msb;
logic[3:0] x;
assign x = {x_msb, x_lsb};
endinterface
我这样做的原因是因为我的 DUT 有单独的 x_msb 和 x_lsb 端口,并且我想明确显示我正在连接到这些端口的信号 x
的哪些位。例如,在实例化 DUT 时:
interface video_input_interface vif;
dut udut(
.msb(vif.x_msb),
.lsb(vif.x_lsb),
.............
);
现在的问题是我的代理中有 2 个司机:
司机A: 当从驱动程序 A 驱动接口(interface)时,我想驱动信号 x 而不是 x_lsb、x_msb。
司机B: 当从驱动程序B驱动接口(interface)时,我想单独驱动信号x_lsb和x_msb。
我认为我的解决方案会将接口(interface)中的信号 x 拆分为 x_lsb 和 x_msb。在DriverA中,我可以驱动这个信号x
。另外,对于驱动程序 B,接口(interface)可以让我单独访问这些位,并且一切都会正常工作......不是!
赋值导致信号 x 为“X - 未知值”。我必须为 DriverA 单独驱动 x_msb 和 x_lsb。或者其他选择是
assign x_lsb = x[1:0]
assign x_msb = x[3:2]
这意味着 DriverA 可以工作,但 DriverB 会遇到同样的问题(当尝试驱动 x_lsb 和 x_msb 时)。
这个问题有解决办法吗? 谢谢
最佳答案
您可以使用时钟 block ,每个驱动程序一个:
interface video_input_interface(clk, rst);
input logic clk;
input logic rst;
logic[1:0] x_lsb;
logic[1:0] x_msb;
clocking cb_a @(posedge clk);
output x = { x_lsb, x_msb };
endclocking
clocking cb_b @(posedge clk);
output x_lsb;
output x_msb;
endclocking
endinterface
从驱动程序 A 中,您始终会引用 cb_a:
@(posedge clk);
video_if.cb_a.x <= 'hA;
从驱动程序 B 中,您始终会引用 cb_b:
@(posedge clk);
video_if.cb_b.x_msb <= 'h1;
video_if.cb_b.x_lsb <= 'h2;
EDAPlayground 上的完整示例:http://www.edaplayground.com/x/3hK
您只需小心不要同时从两个司机处开车即可。有关时钟模块的更多信息,请参阅第 14 节:SV 2012 标准的时钟模块。
关于verilog - 具有不同输入的系统 Verilog 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24025669/