我为我的DUT定义了一个接口:
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驱动接口时,我想驱动信号x而不是x_lsb,x_msb。
司机B: 当从驱动器B驱动接口时,我想分别驱动信号x_lsb和x_msb。
我认为我的解决方案会将我界面中的信号x分成x_lsb和x_msb。在DriverA中,我可以驱动此信号x
。此外,对于驱动程序B,接口可以单独访问位,一切都可以正常工作......不是!
分配使信号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时)。
有解决方案吗? 感谢
答案 0 :(得分:3)
您可以使用时钟模块,每个驱动程序一个:
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节.SW 2012标准的时钟模块。
答案 1 :(得分:2)
你的问题有点不清楚......
那么驱动程序A
和B
同时驱动x
吗?当x
和x_msb
由x_lsb
和B
驱动时,x
由A
推动,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;
logic driverIsA; //Indicates the driver is A
logic xValueFromA; //The x value driven by A
assign x = driverIsA ? xValueFromA : {x_msb, x_lsb};
endinterface
的价值应该是什么?
您已在界面中分配给x。因此,您无法在另一个模块(驱动程序A)中驱动它,因为x不能有多个驱动程序。
如果两个驱动器没有同时驱动,那么多路复用解决方案如下所示?
{{1}}