这是一个verilog代码:(此代码不用于综合)
`timescale 1 ns / 1 ns
module test;
reg r1, r2, r3, r4;
reg clk_at_time, clk_from_clk;
// Initialize signals
initial begin
r1 <= 1;
r2 <= 0;
clk_at_time <= 1;
#200
$finish();
end
// Generating simple a clock (period time is 10ns) (as expected)
always #5
clk_at_time <= ~clk_at_time;
// Generating a clock based on the clk_at_time.
// This clk_from_clk is always equals the clk_at_time (as expected)
always @ clk_at_time
clk_from_clk <= clk_at_time;
// r1 and r2 inverted at all posedge event. (as expected)
// r3 is constant 0 (as expected)
always @(posedge clk_at_time) begin
r1 <= r2;
r2 <= r1;
r3 <= clk_from_clk;
end
// r4 is constant 1 ???!!!??? HOW ???!!!???
always @(posedge clk_from_clk) begin
r4 <= clk_at_time;
end
endmodule
在代码中有两个时钟:第一个是由时间always #5
生成的传统时钟,第二个是由此时钟生成的always @ clk_at_time
两个时钟总是相等(如预期的那样)
奇怪的是,如果我在clk_at_time&block; s块中使用clk_from_clk,那么前一个值将用于clk_from_clk。 (好),但是如果我在clk_from_clk块中使用clk_at_time,那么将使用clk_at_time的新值。
修改
澄清:
请参阅波形:clk_from_clk
和clk_at_time
始终等于。
请参阅代码:r3
和r4
是模拟的:
r3
位于clk_at_time
块中并由clk_from_clk
r4
位于clk_from_clk
块中并由clk_at_time
因此,如果clk_from_clk
和clk_at_time
真的相同,r3
和r4
应始终相等。但请参见波形:r3
始终为0,r4
始终为1
怎么样?规则是什么?
答案 0 :(得分:0)
我不知道确切的答案,但我想分享一个意见,从模拟的角度思考。我把它写成答案而不是评论,因为它不适合评论。
我认为这与模拟的有限元分析性质有关。在模拟的每个时间步骤,模拟器逐个组件地解决电路。由于你的clk_from_clk
是从clk_at_time
导出的,因此模拟器将始终首先评估后者。
在r4
之后评估clk_from_clk
,因此它的值始终为1.至于r3
,它将在clk_at_time
的同时进行评估并同时进行评估使用clk_from_clk
并具有以前的值。