我在 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。
事实上,我已经找到了解决这个问题的方法,只需在“初始块”的最开头添加@(cb) 即可:
initial begin
@(cb);
cb.reset <= '0;
##2 cb.reset <= '1;
##3 cb.reset <= '0;
end
在我添加之后,它将按我的预期运行。但是在理解题上,我还是没有头绪,这是怎么回事? “@(cb)”的任务是什么,这个问题是因为我的代码还是编译器导致的???。 如果有人可以详细解释,我将不胜感激。 谢谢