SystemVerilog 中的时钟块周期延迟问题

问题描述 投票:0回答:0

我在 SystemVerilog 中有一个卡住的时钟块,我试图理解但我不能。我只有一个像这样的普通时钟块,我只是驱动一个信号来理解。

`timescale 1ns/100ps
module quiz();
    bit clk;
    logic reset;
    
    
    default clocking cb @(posedge clk);
    default input #1step output #5;
    output reset;
    endclocking
    
    always #5 clk = ~clk;
    
    initial begin
    cb.reset <= '0;
    ##2 cb.reset <= '1;
    ##3 cb.reset <= '0;
    end
endmodule

正如我所料,在第一个 rising_edge clk + 5ns 之后,重置将从 X 变为 0。然后重置 = 0 将持续下一个 2 rising_edge。那时+5ns,reset将从0变为1并持续接下来的3个rising_edge。 但它并不像我想的那样工作,reset = 0 只持续了一个 rising_edge。否则 reset = 1 仍然持续 3 个 rising_edge。

enter image description here

事实上,我已经找到了解决这个问题的方法,只需在“初始块”的最开头添加@(cb) 即可:

    initial begin
    @(cb);
    cb.reset <= '0;
    ##2 cb.reset <= '1;
    ##3 cb.reset <= '0;
    end

enter image description here

在我添加之后,它将按我的预期运行。但是在理解题上,我还是没有头绪,这是怎么回事? “@(cb)”的任务是什么,这个问题是因为我的代码还是编译器导致的???。 如果有人可以详细解释,我将不胜感激。 谢谢

system-verilog fpga test-bench
© www.soinside.com 2019 - 2024. All rights reserved.