1

考虑以下 SV 代码片段:

module clocks();

  logic a ;
  bit  clk =0;

  initial begin
    forever  #1ns clk = ~clk ;
  end



  clocking cb@(posedge clk);
    default input #1step output negedge;
    output a;
  endclocking

  initial begin
    @(cb);
    #100ps;
    cb.a <= 1 ;
    @(cb);
    #100ps;
    cb.a <= 0 ;
    repeat(10) @(cb);
  end

endmodule
在时钟块事件后 100ps 后,信号通过输出同步驱动发生变化。我在使用两个 EDA 模拟器运行它时观察到不同的行为。对于第一个模拟器,时钟模块输出a作用于第二个姿态,信号在第二个下降沿发生变化。你可以看到下面的图片。 第一个模拟器

另一方面,对于第二个模拟器,时钟模块输出作用于第一个时钟,并且可以在第一个时钟下降沿看到效果。你可以看到下面的图片。 第二个模拟器

另一方面,如果我更改输出偏移延迟,使用小于 100ps 延迟的延迟(es 10ps),则第二个模拟器的行为与第一个模拟器相同(在第二个姿势后, a信号发生变化,输出偏移为10ps)。

两个模拟器中哪一个更符合 IEEE 1800-2017 SV 标准?在我看来,根据我对标准的理解,第一个模拟器更符合标准。

时间刻度设置为 1fs 以避免与模拟器分辨率相关的任何问题。

4

1 回答 1

1

第二个模拟器(具有意外的 negedge 行为)是 VCS。我在 Solvnet 上找到了以下信息:

倾斜为 negedge/posedge 时增强的时钟块行为 默认情况下,当倾斜指定为 posedge/negedge 时,VCS 会使用倾斜覆盖时钟事件。但是,您可以使用 -ntb_opts no_cb_edge_override 选项来避免覆盖输入、输出和 inout 处的时钟事件。以下是此选项在不同时钟方向上的行为: • 输入:在时钟事件之前以指定的时钟偏移延迟对值进行采样,并在时钟事件发生更新。• 输出:输出在时钟事件后以指定的时钟偏移延迟更新。1

不知道为什么 VCS 有这样的行为,但是使用标志“-ntb_opts no_cb_edge_override”,模拟在 Questa 中运行。

于 2021-03-24T18:22:53.863 回答