|
1E币
[例1]. 用阻塞赋值的反馈振荡器
& U+ K( ^- ]- M( D( q% d& ?5 p module fbosc1 (y1, y2, clk, rst);
4 q9 y5 l5 L: @7 h% b* T output y1, y2;
& g! A" a! o* v0 D3 j1 F input clk, rst;
; i# G% Y9 j( i o- k/ l reg y1, y2;/ z; N6 n$ W9 V( X! K" z; ]$ P
' W- l" X( M# w% r
always @(posedge clk or posedge rst)
; e0 F2 @- Z$ l* L0 O6 y9 b3 Z if (rst) y1 = 0; // reset, J; }4 l0 M: F* |" A& i% p# Z2 L& R4 n
else y1 = y2;
0 o% @7 K9 n3 \
; K2 t% a+ X/ W always @(posedge clk or posedge rst)
8 Y$ `9 W4 M2 x, q+ T if (rst) y2 = 1; // preset5 x9 \7 E3 G1 z% s& |- l. H
else y2 = y1;4 _& q5 K" i# D. K- a" k
endmodule! h: _: [( g. x
4 D9 L2 d4 l7 N6 F* V依据IEEE Verilog标准,这两个always块可以以任意的次序执行。如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。这个例子清楚地展示了一个Verilog竞争条件地产生。
5 V( F. y6 B2 s, r6 M
0 R2 C2 h+ ~: ^. o9 W很多书上都用来这个例子,我google中翻了10多页,也都是这么说的,并且没人质疑,那看来是很对的,而且也没人问为什么,那说明这是一个很简单的不能再简单的例子了。可是我愣是没想通。希望各位能指点指点,在此先谢过了。2 H2 C* B, h" B G. B
; f E6 I9 a8 @) R如果第一个先被执行,那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。”
|