作者Acme ( )
看板Electronics
标题Re: [问题] 关於verilog signal&varieble问题
时间Wed Apr 15 22:21:17 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底下,的确还是可以合成,只是当在写大电路时,
基本上 d 并不是 combinational 电路
而是一个 有 clk 的 DFF,因为有写了 posedge clock
不信的话,您可以合成看看....一定会有 clk
combinational ckt 与 sequential ckt 分开,是很好的 coding style
但是,有时候,并不一定会比较好阅读
下面这个电路,其实两个还是合在一起
///////////
always @( posedge clk or negedge rst)
if(!rst) test <= 0 ;
else test <= test +1 ;
///////////
下面这个,才真的分开
///////////
always @(posedge clk or negedge rst)
if(!rst) test <= 0;
else test <= test_pre ;
assign test_pre = test +1 ;
////////////
强制分开的话,我觉得对新人很好
因为可以避免有人把他当成 c 语言来写....
如果心中先有电路,再把他描述出来,(或是有先纸上作业)
基本上,会有多少DFF,心中早就知道了
而且,combitional ckt 该怎样,其实也早就知道了...
所以这两个分开的写法,会比较像是 : 心中有电路 --> coding
: 这就会造成debug上的困扰,至少我在初学者的时候,我曾经也是这样
: ,後来当程式写得越多越大时,就会发现这样的style实在是不好的...
: 或许刚开始大家可能为了交作业,只想function对就行了,但往後
: 程式开始复杂时,学长、老师的要求就会是整齐,把每个讯号分清楚,
: 加上注解,这样以後再回头看,自己还记得当初在写什麽,交接学弟
: 时,至少不会让人阅读起来很痛苦...
: 而回到原作者一开始的问题,我觉得可以去参考一下CIC design compiler
: 那本教科书,他甚至举完例子,还画出了合成的示意图,非常容易了解..
: 而坊间的书多半都是解释"<=" 就是在同时间一起动作,"="则是有次序的
: 动作,虽然是有次序,但在Wave上是看不出来,不过我的经验是有时候写
: a=a+1; 与 b=a+1; 结果会是不一样的...
: b=a+1; a=a+1;
: 我相信这每个人都会迟早会碰到..一开始会觉得很奇怪,不过等遇到时就
: 会开始注意,只能说debug真的是在累积错误的经验...呵呵
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.44.230.4
1F:推 colinshih:1. simulation-synthesis mismatch: 你们说的都对, 一个 04/15 23:32
2F:→ colinshih:以simulation 角度, 一个以synthesis角度 04/15 23:33
3F:→ colinshih:2. seq. 电路 block 包含 combination 电路, 基本上就是 04/15 23:34
4F:→ colinshih:一个 bad coding style, 基本的linting rule通常都是出 04/15 23:34
5F:→ colinshih:error,而非warning, 最好避免. 另外coding完跑linting 04/15 23:35
6F:→ colinshih:是qualified designer 基本要求, 建议慢慢养成习惯 04/15 23:37
7F:推 zxvc:真的一定要把combinational circuits从sequential circuits 04/16 04:50
8F:→ zxvc:分开吗?这是我第一次跑nLint的结果,似乎是过的: 04/16 04:50
10F:推 zxvc:这个也过了: 04/16 05:02
12F:推 ksmrt0123:那牌的linter说 a<=a+1; 是error的? 真是太超过 04/16 13:11
13F:→ ksmrt0123:而且... linter会出error喔? nLint 好像只有warning 04/16 13:14
14F:推 zxvc:nLint有error,不过是compile还是lint有error我没注意。 04/16 21:09
15F:→ colinshih:linting rule 由 rule specification (setting) 决定 04/16 23:29
16F:→ colinshih:和tools 有何关系? nLint 怎麽没有error setting? 04/16 23:30
17F:→ colinshih:k兄少见多怪了, 另外我在工作前均使用 IPQ 定义 rule 04/16 23:31
18F:→ colinshih:setting, 由IPQ联盟制定, 为IP竞赛基本rule setting fil 04/16 23:32
19F:→ colinshih:所以,以SIP deliverable,此类coding style是被IPQ禁止 04/16 23:38
20F:→ colinshih:当然以a<=a+1'b1而言, 不考量IP设计, 当然不必特别限制 04/16 23:40
21F:推 ksmrt0123:linter都有 pre-defined rules吧, 这些rule也是每家 04/17 01:35
22F:→ ksmrt0123:linter都一样? 刚特地翻了nLint的文件, pre-defined 04/17 01:36
23F:→ ksmrt0123:rules都是warning没错啊 会出error可能是user-defined 04/17 01:38
24F:→ ksmrt0123:rules吧 04/17 01:38
25F:推 ksmrt0123:nLint的warning/error跟severity设定有关 是我搞错了 04/17 01:51
26F:推 zxvc:刚才测试nLint也有IPQ rules。但我用该rule,lint的结果仍没 04/17 08:06
27F:→ zxvc:没有要分离出combinational circuits的警告或错误。(或许是 04/17 08:07
28F:→ zxvc:nLint的IPQ rules不完整!?) 04/17 08:08
29F:→ zxvc:(我已经把severity调成最高的level 10) 04/17 08:09
30F:推 zxvc:我想不是每家公司都在做IP,没有必要都用这麽严格的rules吧。 04/17 08:15
31F:→ zxvc:像IPQ rules中,注解没写也算errors。 04/17 08:16
32F:→ zxvc:那请问一般业界都用哪个rules?nLint、RMM、IPQ? 04/17 08:18
33F:推 pierreqq:col应该是指 IPQ 的 SIM.2 那条 04/17 11:58
34F:→ pierreqq:你们之前把com定为a+1,seq定会a<=1,所以讨论起来很乱 04/17 12:02
35F:→ pierreqq:不自觉的一直钻牛角尖下去 04/17 12:03
36F:→ pierreqq:com always-> block? seq always-> nonblocking? 04/17 12:09
37F:→ pierreqq:感觉像是表达上的失准 04/17 12:13
38F:→ pierreqq:大家都有经验,应该不会卡在这种基本问题上才是 04/17 12:14
39F:推 zxvc:我觉得我应该没有误解co、Acme大的意思。 04/17 17:35
40F:→ zxvc:我们现在讨论的问题不是哪里该用blocking、non-blocking, 04/17 17:35
41F:→ zxvc:而是写sequential circuits要不要把combinational circuits 04/17 17:36
42F:→ zxvc:分离出来。 04/17 17:36
43F:→ zxvc:我是觉得讨论这麽detail的问题感觉有点"钻牛角尖",但从讨论 04/17 17:39
44F:→ zxvc:的过程我觉得学到不少东西。 04/17 17:40
45F:→ Acme:其实,我的重点是:d是DFF,不是combinational ckt... 04/17 20:50
46F:→ Acme:我也说了,分开不一定会比较好阅读..... 04/17 20:51
47F:→ Acme:而且,tst<=tst+1; 其实不是分开...而是test<=test_pre才是 04/17 20:52
48F:→ Acme:我说对新人很好,是只对完全空白的新人,还没有seq. com.的概念 04/17 20:58
49F:→ Acme:当然...各位早就远远超过了新人许久了... 04/17 21:01