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