|
1金币
[例1]. 用阻塞赋值的反馈振荡器& k& O q) q! T
module fbosc1 (y1, y2, clk, rst);
- Q) t( _! `6 N7 r, K output y1, y2;
( `% F# ?, a/ y1 n input clk, rst;
0 P9 o+ T1 C8 b6 A# Z& d1 s- A reg y1, y2;
8 g9 q- a+ q0 z" w$ ^% E* N5 N% d; c; k* ?1 H3 L1 j7 @5 t
always @(posedge clk or posedge rst)
- `1 u! A; [: H5 B if (rst) y1 = 0; // reset% ]* Y- h9 b9 b0 X, g* d/ q
else y1 = y2;
/ v5 L) x( Z9 w8 f( d0 N
, @6 x5 \- i- d( H always @(posedge clk or posedge rst)$ P. X" r$ ] D1 U
if (rst) y2 = 1; // preset
2 m N7 E8 _, f) N/ t7 [ else y2 = y1;
3 T, f) K% s# P* e& J6 U' Z endmodule
q2 F/ h; I& {# w ) c" W) c% u& Q: p- f. v1 M
依据IEEE Verilog标准,这两个always块可以以任意的次序执行。如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。这个例子清楚地展示了一个Verilog竞争条件地产生。5 R9 a2 a6 C6 {' H
. [5 G" Q L' B3 ?* k
很多书上都用来这个例子,我google中翻了10多页,也都是这么说的,并且没人质疑,那看来是很对的,而且也没人问为什么,那说明这是一个很简单的不能再简单的例子了。可是我愣是没想通。希望各位能指点指点,在此先谢过了。% H! @4 [$ M/ K4 Q2 Q0 s) t: ]
) x9 ?7 ^% j" A! |如果第一个先被执行,那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。”
|