Re: [問題] 關於verilog signal&varieble問題

看板Electronics作者 (只想把你留在心中)時間16年前 (2009/04/12 09:55), 編輯推噓1(1011)
留言12則, 3人參與, 7年前最新討論串6/10 (看更多)
※ 引述《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
好,code最後會寫不下去,自己都不知道自己在寫什麼。
04/12 10:40, 2F

04/12 10:41, , 3F
但我覺得Verilog的語法其實有點難懂。
04/12 10:41, 3F

04/12 10:43, , 4F
有很多似是而非的解釋、與觀念。這些觀念在某一些情形下就會
04/12 10:43, 4F

04/12 10:44, , 5F
出錯。像non-blocking與blocking解釋成同時不同時就是一個例
04/12 10:44, 5F

04/12 10:47, , 6F
子。基本上standard是最嚴謹的,follow它是不太會出錯的。
04/12 10:47, 6F

04/12 10:48, , 7F
不過也難以保證一個simulator 100%相容某個標準。
04/12 10:48, 7F

04/12 10:50, , 8F
不只是硬體的simulator,就我所知目前也只有一個C++ compiler
04/12 10:50, 8F

04/12 10:50, , 9F
是可以100%相容於standard。
04/12 10:50, 9F

04/12 16:22, , 10F
知道自己在幹什麼的話就一點也不難懂了.
04/12 16:22, 10F

11/11 15:04, , 11F
但我覺得Verilog https://noxiv.com
11/11 15:04, 11F

01/04 21:55, 7年前 , 12F
但我覺得Verilog https://noxiv.com
01/04 21:55, 12F
文章代碼(AID): #19uKd-AC (Electronics)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 10 篇):
文章代碼(AID): #19uKd-AC (Electronics)