【问题标题】:SystemVerilog hierarchical reference in nonblocking assigment非阻塞赋值中的 SystemVerilog 分层引用
【发布时间】:2021-04-28 14:11:51
【问题描述】:

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

我的测试台通过bind cache cov cov_top 将一个模块“cov”绑定到 cpu.cache 的 DUT,并且在“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

【问题讨论】:

  • 是的,它与 cache.cntrl 实例中的 clk 相同
  • 您编辑的问题表明它不是同一个时钟,

标签: verilog system-verilog questasim


【解决方案1】:

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

时钟块事件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

【讨论】:

    【解决方案2】:

    时钟模块的使用会以某种方式影响 NBA 采样的时间,将 always @(cclk) 更改为 always @(clk) 可以解决问题。

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多