System Verilog接口具有不同的输入

时间:2014-06-03 21:58:50

标签: verilog system-verilog uvm

我为我的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时)。

有解决方案吗? 感谢

2 个答案:

答案 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)

你的问题有点不清楚...... 那么驱动程序AB同时驱动x吗?当xx_msbx_lsbB驱动时,xA推动,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}}