0

我在我的测试台中看到奇怪的行为,其中非阻塞分配充当连续分配,而不是输出延迟一个周期的 RHS。

我的测试台通过 将模块“cov”绑定到 cpu.cache 的 DUT bind cache cov cov_top,并且在“cov”模块中我有这个非阻塞分配:

module cov
  import cachePkg::*;
(
  input logic clk,
  input logic rst
);
  clocking cclk @(posedge clk iff !rst); endclocking

  logic [1:0] LinkState_d1, LinkState_d2;
  always @(cclk) begin
    LinkState_d1 <= cache.cntrl.LinkState;
    LinkState_d2 <= LinkState_d1;
  end
endmodule

DUT 中的 cache.cntrl.LinkState 是非阻塞分配的输出,所以我希望 LinkState_d1 只是简单地跟随来自 DUT 的 LinkState,只是延迟了一个周期。但是在波形查看器中,我看到 LinkState_d1 与 LinkState 完全匹配,就好像它是连续分配一样,这是我在波形中看到的时钟图:

             __    __    __
clk       __|  |__|  |__|  |__
                   ________
LinkState    _____|
                   ________
LinkState_d1 _____|
                         __
LinkState_d2 ___________|

当我们在连续分配的 RHS 中使用分层引用时,会发生什么不同的事情吗?或者这只是一个模拟器错误?我正在使用 questasim 2019.4

4

2 回答 2

1

您编辑的问题与原始问题非常不同。问题是您使用不同的时钟。它与分层引用或您在模块中使用 NBA 语句无关cov

时钟块事件cclk被安排在被观察区域中,这可能是 cache.cntrl.LinkState用它的新值更新之后。

不应将时钟模块与来自时钟模块外部的信号混合。要么停止使用时钟块,要么移动里面的所有东西。

logic [1:0] LinkState_d1, LinkState_d2;

clocking cclk @(posedge clk iff !rst); 
  input LinkState = cache.cntrl.LinkState;
  inout LinkState_d1l
  output LinkState_d2;
endclocking

  always @(cclk) begin
    cclk.LinkState_d1 <= cclk.LinkState;
    cclk.LinkState_d2 <= cclk.LinkState_d1;
  end
endmodule
于 2021-04-28T17:34:29.337 回答
0

不知何故,时钟块的使用会影响 NBA 采样的时间,改变always @(cclk)always @(clk)解决问题。

于 2021-04-28T16:27:10.087 回答