作者zxvc (修行)
看板Electronics
标题Re: [问题] 关於verilog signal&varieble问题
时间Sun Apr 12 03:24:08 2009
※ 引述《sasako (只想把你留在心中)》之铭言:
: ※ 引述《zxvc (修行)》之铭言:
: : non-blocking与blocking不是这样分的。
: : 都可以用来model sequential或combinational circuits。
: : 例如:
: : module Test(d, c, e, f, b, a);
: : output reg d, c;
: : input e, f, b, a;
: : always@(*)
: : if(a == 1 & b == 1)
: : c = 1;
: : else
: : c = 0;
: : always@(*)
: : if(e == 1 & f == 1)
: : d <= 1;
: : else
: : d <= 0;
: : endmodule
: : c跟d都会合出AND gates。
: : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: : 又如sequential circuit:
: : module Test(c, d, Clock , Reset1);
: : output reg [2:0] c;
: : output reg d;
: : input Clock, Reset1;
: : always@(posedge Clock)
: : if(Reset1)
: : c = 0;
: : else
: : begin
: : c = c+1;
: : if(c == 3)
: : d = 1;
: : else
: : d = 0;
: : end
: : endmodule
: : 这个用blocking的写法会造成c = 3的那个(clock) cycle,d = 1。
: : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: 我这样分,是希望在coding style大家能保持良好的习惯,
: 把sequential和combinational作分开,这样在debug的时候
: 会比较容易..
: 至於你上面写的这个例子,个人认为就是一个bad example,
: c可以知道会合出DFF,且会是一个简单的conuter..
: 至於d他是一个combinational的电路,你将sequential和combinational
: 混在同一个always底下,的确还是可以合成,只是当在写大电路时,
我是习惯这种coding style。
或许你以为这样就是分开sequential circuit与combinational circuit,
module Test(c, d, Clock, Reset1);
output reg [2:0] c;
output reg d;
input Clock, Reset1;
reg d2;
always@(posedge Clock)
if(Reset1)
c = 0;
else
begin
c = c+1;
d = d2;
end
always@(*)
if(c == 2)
d2 = 1;
else
d2 = 0;
endmodule
但其实c = c+1;会合出加法器(combinational circuit)。
所以这种叙述也是bad style!?:
always@(posedge Clock)
if(Reset1)
a = 0;
else
begin
if(b)
a = 1;
else
a = 0;
end
因为if(b)会合出多工器。
如果这真是你们实验室的coding style,我也认了。
不过我没有轻视任何coding style的意思,只是习惯的差异。
至於debug的容易与否我想跟你自己习惯的coding style有关。
你自己习惯哪种coding style,你就觉得它容易debug。
不过如果大多数人的coding style跟我不一样,
我想我也只好习惯别人的coding style。
题外话:这个世界不是最好的东西就是最好,还要大家说最好才算数。
: 这就会造成debug上的困扰,至少我在初学者的时候,我曾经也是这样
: ,後来当程式写得越多越大时,就会发现这样的style实在是不好的...
: 或许刚开始大家可能为了交作业,只想function对就行了,但往後
: 程式开始复杂时,学长、老师的要求就会是整齐,把每个讯号分清楚,
: 加上注解,这样以後再回头看,自己还记得当初在写什麽,交接学弟
: 时,至少不会让人阅读起来很痛苦...
: 而回到原作者一开始的问题,我觉得可以去参考一下CIC design compiler
: 那本教科书,他甚至举完例子,还画出了合成的示意图,非常容易了解..
: 而坊间的书多半都是解释"<=" 就是在同时间一起动作,"="则是有次序的
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
很多人喜欢这样看,但其实是错的。例如(我没说可合成):
initial
begin
a = 0; (1)
a <= 1; (2)
b = 0; (3)
c <= a; (4)
end
(2)跟(4)如果视为同时动作,所以最後a = 1,
c = 0!?就错了。
硬要用"同时"、"不同时"去解释也解释不通这initial怎麽跑。
blocking assignment中block作动词解释为"阻挡",不是"方块"。
阻挡什麽?答案是执行的控制权。
也就是当assignment的update动作还没完成,它是不会执行下一行的。
begin...end在Verilog中叫sequential block,
也就它里面的叙述是一行一行(sequential)执行的(IEEE 1364-2005 Sec. 9.8.1)。
fork...join在Verilog中叫parallel block,
它里面的各叙述才是同时(concurrent)执行的(IEEE 1364-2005 Sec. 9.8.2)。
所以上面的initial要怎麽跑?答案就是,initial後面接sequential block,
所以它会先执行(1)。(1)是blocking assignment,
所以它会先对等号右手端求值(evaluation),然後更新(update)完a才继续执行下一行。
所以现在a = 0,然後执行(2)。(2)是non-blocking assignment,它会先evaluation,
但不会立即update就执行下一行(3)。
non-blocking assignment update的动作是当
遇到blocking assignment或sequential block的end才会update。
(3)是blocking assignment,所以a会被强制update。所以(3)执行完後
a = 1, b = 0。
接着执行(4),但a此时=1,所以最後a = 1, b = 0,
c = 1。
有兴趣可以用ModelSim验证看看。
另外请勿使用parallel block(fork...join)设计硬体,
因为大多合成器不能合成。
: 动作,虽然是有次序,但在Wave上是看不出来,不过我的经验是有时候写
: a=a+1; 与 b=a+1; 结果会是不一样的...
: b=a+1; a=a+1;
: 我相信这每个人都会迟早会碰到..一开始会觉得很奇怪,不过等遇到时就
: 会开始注意,只能说debug真的是在累积错误的经验...呵呵
--
西方三圣:
http://p8.p.pixnet.net/albums/userpics/8/3/553683/1193661731.jpg
《佛说阿弥陀经》
http://web.cc.ncu.edu.tw/~93501025/amtf.doc
十一面观音咒:
http://file.buda.idv.tw/music/DBZFY04.mp3
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.126.142.97
※ 编辑: zxvc 来自: 122.126.142.97 (04/12 04:32)
1F:推 katheryne:推"大家说好才算数" 04/12 08:12
2F:推 sasako:基本上 initial这种写法多半出现在testbench里面 04/12 09:22
3F:→ sasako:看看大部分的程式 很少人直接写在code里面.. 04/12 09:22
4F:推 ksmrt0123:c+1是 combinational, 但c=c+1是 sequential 04/12 18:03
5F:→ zxvc:对,楼上说的没错。sequential circuits的定义是可以包涵 04/12 21:16
6F:→ zxvc:combinational circuits。 04/12 21:17
7F:→ zxvc:不过把always model的sequential circuits的combinational 04/12 21:22
8F:→ zxvc:circuits分离出来的coding style有必要吗?我见到多数人都不 04/12 21:24
9F:→ zxvc:是这样。我老板也没这样要求。 04/12 21:25
10F:→ zxvc:像上述的计数器,把加法器分离出来的code我反而很少看到。 04/12 21:26
11F:推 ksmrt0123:所以你举这个例子(c=c+1那段)的用意是? 抱歉看不太出来 04/12 22:09
12F:推 n052111089:感谢大大用心举例:) 那请问一下(2)跟(3)是同时update? 04/12 22:50
13F:→ zxvc:(2)是先执行的,所以会比(3)先update。 04/12 23:27
14F:→ zxvc:我这篇文章的第一段是要说明,我觉得没必要把所有的 04/12 23:54
15F:→ zxvc:combinational circuits从sequential circuits中分离出来 04/12 23:55
16F:→ zxvc:model。 04/12 23:55
17F:→ zxvc:上面三行话是回覆k大。 04/12 23:56
18F:→ sneak: com 11/11 15:04
20F:→ sneak: com 01/04 21:55