verilog - 具有不同输入的系统 Verilog 接口(interface)

标签 verilog system-verilog uvm

我已经为我的 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/

相关文章:

audio - Nexys 4上的信号启用音频输出

macos - 在 Mac OS X 10.6.8 上使用什么来编译和模拟 Verilog 程序?

Python:打印基类变量

verification - 在systemverilog中正确使用 "disable fork"

system-verilog - 使用系统 Verilog 生成随机枚举

c++ - 创建 C++ 测试台以​​驱动 Verilog DUT

Verilog:如何实例化模块

vhdl - 将多维 systemverilog 端口连接到 vhdl 模块

system-verilog - 有没有办法将 uvm_tlm_analysis_fifo 连接到 uvm_driver?

class - 参数化类和多态性