EDA365电子工程师网

标题: 关于阻塞赋值的疑问 [打印本页]

作者: Addylee    时间: 2009-12-25 23:39
标题: 关于阻塞赋值的疑问
[例1]. 用阻塞赋值的反馈振荡器
' Y! C% C) q' s8 [2 Z5 F    module fbosc1 (y1, y2, clk, rst);5 I4 w# b8 j& ~
      output y1, y2;4 g, n6 S5 c4 ?0 x2 O6 F
      input  clk, rst;
) o, `3 r2 R/ P5 I! a      reg    y1, y2;
4 C0 m& F3 e6 \6 @. d8 I: q) c9 q" v
4 }" E3 B0 B! ?& `6 J      always @(posedge clk or posedge rst)
& I2 \! N+ v* s" c$ n- b        if (rst) y1 = 0;  // reset7 p; S- q! g/ _
        else     y1 = y2;
. ]) K2 l  p" C& a# U& E
- }1 g$ u! M  T! {2 G# N; U      always @(posedge clk or posedge rst)
% @! k) c1 P3 L0 q6 z0 |7 C        if (rst) y2 = 1;  // preset3 B' T$ ^7 {$ Y( M& I& w5 C) k
        else     y2 = y1;
$ h! ~& F/ t, f    endmodule# I& _! t, Y0 Y, }& l6 t2 ]% ]
    , h4 A0 ^6 _6 G$ X- R
依据IEEE Verilog标准,这两个always块可以以任意的次序执行。如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。这个例子清楚地展示了一个Verilog竞争条件地产生。
; {$ q: i6 w( z. F5 I- a# V# ?  j" J4 I/ L- H" {; Z& a
很多书上都用来这个例子,我google中翻了10多页,也都是这么说的,并且没人质疑,那看来是很对的,而且也没人问为什么,那说明这是一个很简单的不能再简单的例子了。可是我愣是没想通。希望各位能指点指点,在此先谢过了。8 j1 L* @) {4 j

4 Y! ~3 P. b4 G如果第一个先被执行,那if (rst),就执行y1=0,然后,第二个块,if (rst) y2 =1,为啥不对呢?谁能告诉我,我哪里错了呢?谢谢!!!!
作者: zxli36    时间: 2009-12-25 23:39
拙见:3 E3 V0 h7 X) r+ V* ]% m+ B
“如果第一个先被执行,那if (rst),就执行y1=0,然后,第二个块,if (rst) y2 =1...”
5 P4 J, @! z2 p0 t+ b4 X( Z2 f# M: L是reset后先执行和后执行,reset期间是保持复位状态,原文是:
$ @4 S9 J, j3 l0 C2 I2 }9 P“如果在reset后第一个块先被执行,结果将是y1和y2都获得赋值1;如果在reset后第二个块先被执行,结果将是y1和y2都被赋值0。”
作者: Addylee    时间: 2009-12-27 23:47
非常感谢!!一字只差,我郁闷了好长时间。如果在reset 之后,第一个块先被执行。如果在reset结束后,第一个块先被执行。0 J( Q. z" B4 F4 p, e  ^4 ^7 m4 R  y
这样,就更容易了,呵呵!!
作者: zxli36    时间: 2009-12-28 12:03
一个人有时候是挺郁闷的,这就是论坛的好处,多交流。




欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2