Re: [問題] 關於verilog signal&varieble問題
※ 引述《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)
推
04/12 08:12, , 1F
04/12 08:12, 1F
推
04/12 09:22, , 2F
04/12 09:22, 2F
→
04/12 09:22, , 3F
04/12 09:22, 3F
推
04/12 18:03, , 4F
04/12 18:03, 4F
→
04/12 21:16, , 5F
04/12 21:16, 5F
→
04/12 21:17, , 6F
04/12 21:17, 6F
→
04/12 21:22, , 7F
04/12 21:22, 7F
→
04/12 21:24, , 8F
04/12 21:24, 8F
→
04/12 21:25, , 9F
04/12 21:25, 9F
→
04/12 21:26, , 10F
04/12 21:26, 10F
推
04/12 22:09, , 11F
04/12 22:09, 11F
推
04/12 22:50, , 12F
04/12 22:50, 12F
→
04/12 23:27, , 13F
04/12 23:27, 13F
→
04/12 23:54, , 14F
04/12 23:54, 14F
→
04/12 23:55, , 15F
04/12 23:55, 15F
→
04/12 23:55, , 16F
04/12 23:55, 16F
→
04/12 23:56, , 17F
04/12 23:56, 17F
→
11/11 15:04, , 18F
11/11 15:04, 18F
→
11/11 15:04, , 19F
11/11 15:04, 19F
→
01/04 21:55,
7年前
, 20F
01/04 21:55, 20F
→
01/04 21:55,
7年前
, 21F
01/04 21:55, 21F
討論串 (同標題文章)