作者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