|
1金币
[例1]. 用阻塞赋值的反馈振荡器% u3 m) o( ^3 H- r
module fbosc1 (y1, y2, clk, rst);
1 b6 z6 e& t- L, v output y1, y2;
* w$ q4 k# E0 B, D- \6 a input clk, rst;, ^; l: ^; l- X4 P3 C) K2 O/ e
reg y1, y2;' y7 h" a1 K' e+ I
1 M9 S" a4 P$ ~1 ^
always @(posedge clk or posedge rst)
+ G/ g) j8 Q b if (rst) y1 = 0; // reset3 |: }- X; p, i) e* f L5 U: O
else y1 = y2;
. A4 `* i3 M: J
5 k/ l* D. ?: e- Z1 b3 M always @(posedge clk or posedge rst)
( w! k- X; c! i$ {+ Y( C) h if (rst) y2 = 1; // preset
( C4 L5 V, J, b) l' p7 Z+ } else y2 = y1;2 b8 H3 w- v- Q+ a
endmodule
; A1 f3 g( L- o- U 5 z+ B: p7 a3 R5 j- B
依据IEEE Verilog标准,这两个always块可以以任意的次序执行。如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。这个例子清楚地展示了一个Verilog竞争条件地产生。0 F; C( R4 Y0 x5 L
7 `5 V0 A* v: A9 s0 Q. J5 H( Q很多书上都用来这个例子,我google中翻了10多页,也都是这么说的,并且没人质疑,那看来是很对的,而且也没人问为什么,那说明这是一个很简单的不能再简单的例子了。可是我愣是没想通。希望各位能指点指点,在此先谢过了。; j9 A2 N! @! V3 X& g) D" Z
+ l" d. {! R B7 i/ \如果第一个先被执行,那if (rst),就执行y1=0,然后,第二个块,if (rst) y2 =1,为啥不对呢?谁能告诉我,我哪里错了呢?谢谢!!!! |
最佳答案
查看完整内容
拙见:
“如果第一个先被执行,那if (rst),就执行y1=0,然后,第二个块,if (rst) y2 =1...”
是reset后先执行和后执行,reset期间是保持复位状态,原文是:
“如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。”
|