作者sasako (只想把你留在心中)
看板Electronics
标题Re: [问题] 关於verilog signal&varieble问题
时间Sun Apr 12 00:05:18 2009
※ 引述《zxvc (修行)》之铭言:
: ※ 引述《sasako (只想把你留在心中)》之铭言:
: : 一个用法是用在sequential circuit的always中...
: : ex:always(posedge clk or negedge n_rst)
: : 另一个是用在combinational circuit的always中...
: : ex:always(*)
: 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底下,的确还是可以合成,只是当在写大电路时,
这就会造成debug上的困扰,至少我在初学者的时候,我曾经也是这样
,後来当程式写得越多越大时,就会发现这样的style实在是不好的...
或许刚开始大家可能为了交作业,只想function对就行了,但往後
程式开始复杂时,学长、老师的要求就会是整齐,把每个讯号分清楚,
加上注解,这样以後再回头看,自己还记得当初在写什麽,交接学弟
时,至少不会让人阅读起来很痛苦...
而回到原作者一开始的问题,我觉得可以去参考一下CIC design compiler
那本教科书,他甚至举完例子,还画出了合成的示意图,非常容易了解..
而坊间的书多半都是解释"<=" 就是在同时间一起动作,"="则是有次序的
动作,虽然是有次序,但在Wave上是看不出来,不过我的经验是有时候写
a=a+1; 与 b=a+1; 结果会是不一样的...
b=a+1; a=a+1;
我相信这每个人都会迟早会碰到..一开始会觉得很奇怪,不过等遇到时就
会开始注意,只能说debug真的是在累积错误的经验...呵呵
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.103.42
※ 编辑: sasako 来自: 220.135.103.42 (04/12 00:27)
1F:推 n052111089:感谢^^ 04/12 01:19
2F:→ n052111089:所以 <= 是concurrent然後 =是sequential? 04/12 01:22
3F:推 zxvc:我想这还是习惯的问题。我大学的时候的专题就是blocking一路 04/12 01:37
4F:→ zxvc:用到底,最後还不是做出来了。 04/12 01:38
5F:→ zxvc:(blocking assignment一路用到底) 04/12 01:39
6F:推 zxvc:其中包括复杂的有限状态机、sequential circuits。 04/12 01:41
7F:→ zxvc:你举的a=a+1...的例子。在我看来结果不一样本来就是很正常的 04/12 01:43
8F:→ sasako:nonono..只有在某些情况才会不一样 04/12 01:55
9F:→ sasako:你正常写在always(*)底下 应该是会一样的 这是verilog和 04/12 01:56
10F:→ sasako:C语言最大的不同点 04/12 01:56
11F:→ sasako:另外 你的习惯我不与置评 只是到了业界 习惯终究是会被学长 04/12 01:58
12F:→ sasako:纠正的 04/12 01:58
14F:→ sasako:verilog_blocking_nonblocking.html 04/12 02:17
15F:→ sasako:1F自己连起来吧 google搜寻这种资讯很多啦... 04/12 02:18
16F:推 zxvc:我说的不一样就是指在某些sequential circuits下的情况。 04/12 03:26
17F:→ zxvc:如果你的coding style就是跟业界一样,我也许会follow。(不过 04/12 03:30
18F:→ zxvc:我不一定会去业界) 04/12 03:31
19F:推 zxvc:我老师是比较开明loop generate跟for loop只要你写得出来她都 04/12 03:41
20F:→ zxvc:接受。 04/12 03:42
21F:→ zxvc:另外你给的连结第三点观念错误。continuous assignment跟 04/12 03:44
22F:→ zxvc:non-blocking、blocking assignments一点关系都没有。 04/12 03:45
23F:→ zxvc:它是另外一种assignment。non-blocking与blocking assignment 04/12 03:46
24F:→ zxvc:是procedure assignment (IEEE 1364-2005 Sec 6)。 04/12 03:48
25F:→ zxvc:procedure assignment是用在reg、integer等data types。 04/12 03:49
26F:→ zxvc:continouse assignment是用在wire之类的data types上。 04/12 03:50
27F:→ zxvc:它们update values的方式也不太一样(IEEE 1364-2005 Sec. 9.2 04/12 03:51
28F:→ zxvc:)。 04/12 03:51
29F:推 zxvc:continuous assignment是等号右边出现的inputs一变,就 04/12 04:14
30F:→ zxvc:evaluate与update,这通常用在model combinational circuits 04/12 04:16
31F:→ zxvc:。procedure assignment的evaluation/update则往往受到 04/12 04:18
32F:→ zxvc:sensitivity list的影响,它不总是等号右边的inputs一有变化 04/12 04:19
33F:→ zxvc:就evaluation/update。但always(*)就可以达到跟continuous 04/12 04:21
34F:→ zxvc:assignment一样的效果,所以它也可以用来model combinational 04/12 04:22
35F:→ zxvc:circuits。 04/12 04:22
36F:推 zxvc:另外我老师也是待过业界的。她建议(没有强制)只要用 04/12 04:42
37F:→ zxvc:non-blocking assignment就好,包括用always model 04/12 04:43
38F:→ zxvc:combinational circuits。 04/12 04:43
39F:→ zxvc:其实我觉得non-blocking assignment一个好用的地方在於用 04/12 04:45
40F:→ zxvc:always model shift registers。 04/12 04:45
41F:推 zxvc:其实用non-blocking或blocking assignment与always model 04/12 04:51
42F:→ zxvc:combinational circuits的结果似乎是一样的(我没证明过)。 04/12 04:51
43F:→ zxvc:不过用blocking可以做到non-blocking做不到的事,例如我之前 04/12 04:53
44F:→ zxvc:在板上po的priority encoder就是利用blocking update的特性。 04/12 04:54
45F:推 zxvc:抱欺我上两句话有错。我把那个priority encoder改成 04/12 05:02
46F:→ zxvc:non-blocking assignment,结果也合出一样的priority encoder 04/12 05:03
47F:→ zxvc:可能non-blocking与blocking在always(*)情况下是等价的。 04/12 05:04
48F:→ zxvc:(我指的是合出来的电路是等价的) 04/12 05:05