具有不同输入的系统Verilog接口

具有不同输入的系统Verilog接口,verilog,system-verilog,uvm,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定义了如下接口:

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),
.............
);
现在的问题是,我的代理中有两个驱动程序:

司机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可以工作,但在尝试驱动x_lsb和x_msb时,DriverB会遇到相同的问题

有解决办法吗?
谢谢

你的问题有点不清楚。。。 驾驶员
A
B
是否同时驾驶
x
?当
x_msb
x_lsb
B
驱动且
x
A
驱动时,
x
的值应该是多少

您已经在界面中分配给x。因此,您不能在另一个模块(驱动程序A)中驱动它,因为x不能有多个驱动程序

如果两个驱动程序不同时驱动,那么下面的多路复用解决方案如何

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

您可以使用时钟块,每个驱动器一个:

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;
@(posedge时钟);

video_if.cb_a.x谢谢@Tudor。我有几个问题:1)为什么没有在顶部声明输出x为逻辑[3:0]x?2) 这到底是怎么回事?对于driverA,我可以直接驱动x,因为它被声明为输出?但是连接到DUT的是x_msb和x_lsb,所以它们不是输出吗?对不起,我有点紧张confused@noobuntu在“cb_b”中,“x_lsb”和“x_msb”是时钟变量,它们直接引用接口信号。在“cb_a”中,“x”也是一个时钟变量,但它不必是接口内部的信号。时钟变量可以有任何表达式(分层路径、切片、其他信号的合成)。基本上,模拟器知道当你驾驶“x”时,他应该驾驶“x_lsb”和“x_msb”。如果您还想读取“x”(例如在监视器中),则必须将其声明为“inout”。好的,我想我明白了。所以基本上,时钟变量与接口变量完全不同。它们可用于引用接口变量或以任何需要的方式将它们组合起来。我的理解正确吗?我只是有点不确定为什么它被声明为输出?什么是输出?时钟块?是的,这意味着当您引用时钟块中的时钟变量时,您可以对其进行写入,它会将值传播到接口信号。@Tudor:时钟块不意味着它内部的信号与时钟同步吗?我在OP的问题中看不到这种同步。对不起,我应该说清楚。一次只能有一个驱动程序驱动接口。我喜欢您的解决方案,但更愿意使用时钟块来实现这一点。@noobuntu:使用时钟块是可行的,但请注意,它们使您的信号与
clk
同步。你的问题不是这样的。
@(posedge clk);
video_if.cb_b.x_msb <= 'h1;
video_if.cb_b.x_lsb <= 'h2;