Re: [問題] 關於verilog signal&varieble問題
※ 引述《zxvc (修行)》之銘言:
: ※ 引述《sasako (只想把你留在心中)》之銘言:
: : 我這樣分,是希望在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)設計硬體,
: 因為大多合成器不能合成。
首先,我絕對不會寫initial這種語法在我的code裡,我不知道大部分的人是
否一樣,這種東西我只會寫在test.v檔裡...
另外假如真的要區分non-blocking和blocking,我真的比較認同CIC的舉例,
用圖說明真的是最簡單的,畢竟設計者要瞭解,你寫出什麼東西,大概就會
知道合成的電路,講這些的先例的可不是我,我也是從CIC上課,在寫程式和
欣賞別人程式的過程中慢慢體會一種"感覺"..
這也是為什麼coding style這麼重要,因為數位電路圖,可以用區塊表示,每
個訊號的功用都會區分清楚,在我們實驗室學長大概都是這樣訓練學弟..
不需要把spec的東西擺在台面上來跟我說明,那些參考資料,說真的我很懶得看
,不是沒看過,是看到不想看,你不知道學長多重視每個人的coding style,以
前老是從公司印一堆資料叫我看,再加上CIC上課的東西,真的很足夠了!
verilog的語法並不難,難在如何寫出來讓人看得懂,難在邏輯上,難在想法,
在寫一個大型的程式前,其實就需要作很多前制的紙上作業,將整個細節都要想
清楚,而不是馬上在電腦上硬幹,還記得我畢業前是寫LDPC,光是紙上作業,就
弄了兩個月,將每個環節會碰到的問題要先想辦法解決,但是通常都會有所遺漏
,他們工程師都稱之為surprise,另外RD有個有趣的講法"research & debug",
個人認為非常貼切,在這個板上,有很多強者的存在,我也曾經在此請教過很多
問題,我也不想關公面前耍大刀...閒聊於此囉!
--
軍人的假期是寶貴的壓!!哈哈..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.103.42
推
04/12 10:39, , 1F
04/12 10:39, 1F
→
04/12 10:40, , 2F
04/12 10:40, 2F
→
04/12 10:41, , 3F
04/12 10:41, 3F
→
04/12 10:43, , 4F
04/12 10:43, 4F
→
04/12 10:44, , 5F
04/12 10:44, 5F
→
04/12 10:47, , 6F
04/12 10:47, 6F
→
04/12 10:48, , 7F
04/12 10:48, 7F
→
04/12 10:50, , 8F
04/12 10:50, 8F
→
04/12 10:50, , 9F
04/12 10:50, 9F
→
04/12 16:22, , 10F
04/12 16:22, 10F
→
11/11 15:04, , 11F
11/11 15:04, 11F
→
01/04 21:55,
7年前
, 12F
01/04 21:55, 12F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 10 篇):