在我的替补课程中,我有类似的东西(简化):
// bench.sv
program tb (input clk, ...);
initial begin
...
repeat (100) begin
main_module_interface.write_index <= bench.write_index;
// drive additional inputs
...
@(clk);
$display("%t : BENCH", $realtime);
在我的主模块中,我有一个生成循环来创建我的index_reg
模块
// main_module.sv
generate
for (genvar ix = 0; ix < 32; ix++) begin
index_reg #(.WIDTH(32), .INDEX(ix)) r (
.clk,
.ind(writeIFC.write_index),
...
);
end
endgenerate
然后在我的index_reg
模块中,我添加了以下调试代码:
// index_reg.sv
always @ (posedge clk) begin
if (INDEX == 10) begin
$display("I see the clock");
end
end
我希望看到这个输出:
I see the clock
10 : BENCH
I see the clock
20 : BENCH
I see the clock
30 : BENCH
I see the clock
40 : BENCH
I see the clock
50 : BENCH
etc.
但有时候,“我看时钟”只会出现在其他时间。所以我看到
10 : BENCH
I see the clock
20 : BENCH
30 : BENCH
I see the clock
40 : BENCH
50 : BENCH
etc.
我无法理解为什么会发生这种情况。有人可以指点我正确的方向吗?非常感谢。
答案 0 :(得分:2)
没有看到更多的代码,这是我最好的猜测。
@(clk);
该代码会在clk
和posedge
的每个negedge
边缘触发。
always @ (posedge clk) begin
该代码仅在posedge
clk
上触发,这是每隔一次。
这可能就是为什么您BENCH
的频率是I see the clock
的两倍。
如果这不能回答您的问题,请提供一个完整的代码示例,任何人都可以编译并运行。