|
1金币
[例1]. 用阻塞赋值的反馈振荡器5 ~' ?- o$ ?! T* i
module fbosc1 (y1, y2, clk, rst);: K4 j+ {/ j- m: C
output y1, y2;
1 O$ F* @+ Y! Y' V( N, |9 }$ G input clk, rst;
1 l0 x- H: F* ?4 U1 ~ reg y1, y2;
! n1 v& _! i/ X; b" B# V) E; L# t4 t1 w6 ~ K) U- o
always @(posedge clk or posedge rst)
+ H+ m' V3 J ^' j- v if (rst) y1 = 0; // reset f+ ^( y: i2 I- |
else y1 = y2;: N! h T. L5 n$ D8 s! e9 n" H
+ |" h; _1 I, }+ d8 F. B+ v
always @(posedge clk or posedge rst) \0 M% S$ B+ R- M6 l9 g/ R5 m
if (rst) y2 = 1; // preset; f! I+ ~7 _+ s! a) P* w! y* N4 u
else y2 = y1;% p% i: i* W5 q. C" h) N
endmodule
9 S" Z9 f- {4 w+ E% s+ H0 F0 S* ]
- T3 F* q# V* F3 H依据IEEE Verilog标准,这两个always块可以以任意的次序执行。如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。这个例子清楚地展示了一个Verilog竞争条件地产生。7 y$ i, E4 n* A" x: z3 p( ^
9 H. T6 l. M n很多书上都用来这个例子,我google中翻了10多页,也都是这么说的,并且没人质疑,那看来是很对的,而且也没人问为什么,那说明这是一个很简单的不能再简单的例子了。可是我愣是没想通。希望各位能指点指点,在此先谢过了。& N1 ~" c1 q* |; J$ g: T& n& H
7 u, L9 ]/ b! [( a; i$ B如果第一个先被执行,那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。”
|