|
1金币
[例1]. 用阻塞赋值的反馈振荡器% u) |2 x8 @% q8 ^4 r, M$ j: K$ Q
module fbosc1 (y1, y2, clk, rst);
! Y7 C4 X) b9 O# V, U output y1, y2;0 {; o! y0 j2 F
input clk, rst;
4 h) w7 M c: A. Q) ? reg y1, y2;
2 g' Q, G! s% b* q- e) g6 w" i* I5 J/ x- I* t) z
always @(posedge clk or posedge rst)2 Z3 E, n* X4 t
if (rst) y1 = 0; // reset
$ s5 t) a, V; {( h7 ` else y1 = y2;9 ?, h; u1 {3 l& I! h
$ J4 d9 E, G. ~6 L8 @1 I* _# H3 } always @(posedge clk or posedge rst)/ H0 m, i& [+ ~5 x: l
if (rst) y2 = 1; // preset: N* L) U7 c- y
else y2 = y1;
5 x0 }- `) X9 q: q$ Y" }5 S5 Q endmodule
2 A" m8 ^* }. h0 e# K , @! l" A/ j; Z% p; K. D$ s, _
依据IEEE Verilog标准,这两个always块可以以任意的次序执行。如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。这个例子清楚地展示了一个Verilog竞争条件地产生。/ }4 A \) L, r- Z; r2 [* l
: t* }# b! `5 M( ~很多书上都用来这个例子,我google中翻了10多页,也都是这么说的,并且没人质疑,那看来是很对的,而且也没人问为什么,那说明这是一个很简单的不能再简单的例子了。可是我愣是没想通。希望各位能指点指点,在此先谢过了。1 {7 Y5 k. G0 _2 r. b. ?+ }) R& ?$ c
: @0 Z* B; A: Z* T
如果第一个先被执行,那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。”
|