0

我在接口中使用时钟块进行信号混叠。我想将一些位连接在一起形成一个总线,然后从我的驱动程序驱动这个总线。因此,例如:

interface bus_intf (clk);
    input logic      clk;
          logic[1:0] x_lsb;
          logic[1:0] x_msb;

   clocking driver_bus @(posedge clk)
      default input #1step output #0;
      output x_bus = {x_msb, x_lsb};
   endclocking
endinterface

现在的问题是,在我的一个断言中,我需要阅读bus_intf.driver_bus.x_bus。如 SV 手册中所述,测试平台不应读取时钟块的输出变量,如果是,则模拟器会吐出错误(或在我的情况下发出警告)。

于是我修改了界面:

interface bus_intf (clk);
    input logic      clk;
          logic[1:0] x_lsb;
          logic[1:0] x_msb;

   clocking driver_bus @(posedge clk)
      default input #1step output #0;
      inout x_bus = {x_msb, x_lsb};
   endclocking
endinterface

现在的问题是,在我的波形中,我看到创建了两个信号 - x_busx_bus__o。我理解 Questasim 这样做的原因——它是为了将inout声明分开,以便我可以查看两个版本。然而,现在的问题是我所有的时钟驱动都延迟了一个时钟周期!因此连接到 DUT 的x_bus__ox_bus晚一个时钟周期。尽管我明确指出输出偏斜为#0,但还是如此。

知道为什么会这样吗?我做错了什么还是我误解了?

4

2 回答 2

2

我已将您的代码放在 EDAPlayground 上并进行了尝试。它似乎按预期工作。这是我的测试工具:

module top;
  bit clk;
  always #1 clk = ~clk;

  bus_intf busif(clk);

  initial begin
    @busif.driver_bus;
    $display("time = ", $time);
    busif.driver_bus.x_bus <= 'hf;

    repeat (2)
      @(negedge clk);
    $display("time = ", $time);
    busif.driver_bus.x_bus <= 'ha;

    #100;
    $finish();
  end

  always @(busif.x_lsb)
    $display("time = ", $time, " x_lsb = ", busif.x_lsb);

  always @(busif.x_msb)
    $display("time = ", $time, " x_msb = ", busif.x_msb);
endmodule

如果您想在线尝试,链接在这里:http ://www.edaplayground.com/x/Utf

如果我x_bus以姿势行驶,那么值将立即写入,正如由于#0输出延迟所预期的那样。如果我x_bus在 negedge(或在 posedge 之外的任何其他时间)开车,那么它将等到下一个 posedge 驱动价值。无论是否x_bus声明为output或,我都会看到这种行为inout

检查您何时安排写入;这可能是您看到波浪出现延迟的原因。

于 2014-09-10T11:52:22.783 回答
0

当您通过时钟模块进行双向流动时,从验证到硬件并返回的信号必须通过两个虚拟 D-FF。所以原来的观察是正确的。1-step的输入为设计的一个D-FF;然后返回是出现 0ns 的又一个 D-FF 返回(即,就在时钟之后)。时钟模块在需要单周期周转的信号情况下没有用,因此,如果需要,请避免使用它们。对于大多数设计,根本没有必要。监视器会以一个周期的流水线延迟来观察信号,这通常不是问题。

于 2021-02-20T19:23:23.783 回答