|
1E币
[例1]. 用阻塞赋值的反馈振荡器2 I7 P5 k& Z: M
module fbosc1 (y1, y2, clk, rst);1 s" n. O( c) p x& q
output y1, y2;
7 j+ T+ _: A$ S4 B# p: f3 B- O$ T input clk, rst;9 {( l9 z0 G, `( h; F
reg y1, y2;1 s- A8 G" K5 r& T2 D
! L* J- }1 F" Y; t0 G always @(posedge clk or posedge rst)
; l3 G* N$ V3 l+ w! P- n if (rst) y1 = 0; // reset
) j- U( ~# u% `: _# t. F else y1 = y2;
; B! |3 c1 a5 r* r% A! }, [" x4 ^" s# K2 n( L* P
always @(posedge clk or posedge rst)
2 Q" b9 L# q2 _) D if (rst) y2 = 1; // preset
4 ^, `$ W; U. W2 Y5 e. t" F9 n else y2 = y1;
3 A& q/ k$ ?4 h' [3 @1 Q endmodule
) K. [) k: x5 a, D/ ^9 ] + @$ A, N- V' b# t% R
依据IEEE Verilog标准,这两个always块可以以任意的次序执行。如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。这个例子清楚地展示了一个Verilog竞争条件地产生。
) E6 e7 o7 O+ m9 X- l6 ^6 J8 u7 u @+ Y
很多书上都用来这个例子,我google中翻了10多页,也都是这么说的,并且没人质疑,那看来是很对的,而且也没人问为什么,那说明这是一个很简单的不能再简单的例子了。可是我愣是没想通。希望各位能指点指点,在此先谢过了。 l5 L s; @6 R& l- a
, J& y1 |& G2 C3 g: n如果第一个先被执行,那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。”
|