Electronics 板


LINE

※ 引述《zxvc (修行)》之銘言: : 我是習慣這種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。 : 題外話:這個世界不是最好的東西就是最好,還要大家說最好才算數。 我的習慣也是不會刻意去分開成兩個 always,但是 仔細想一想吧,多寫一些code就會體會把 always @(*) , always @(posedge ...) 分開的好處 最明顯的是用在 FSM 上, 雖然也可以都寫在一塊... 例, always @(*) begin a = 1; b = 0; c =1; if ( S == 1 ) a = 0; if ( S == 2 ) b = 1; if ( S == 3 ) c = 0; end always @( posedge clk ) begin a_r <= a; b_r <= b; c_r <= c; end 你可以試著把他寫成一個 always @( posedge ... ) 看看, 會不會比較好閱讀 這個例子的電路有點簡單, 直接分開成 三個 always @( posedge ... ) 反而更好, 當然我的用意不是這樣,希望你可以理解 如果舉的例子是 a~z 呢? 那每個 if 都要連貫, if 內要有 a~z 的描述... 應該會亂掉吧 ===================================================================== 另外,如果今天我要改設計,想拿掉 c_r register呢? 變 wire out 呢? : 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, fork join都是simulation的用法,是不能合成的 還有 non-blocking, blocking 最好不要一起用,很有趣,但沒多少人看的懂, 連simulator都可能有不同解釋 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.64.79.59 ※ 編輯: pierreqq 來自: 61.64.79.59 (04/14 23:17)
1F:推 zxvc:non-blocking跟blocking的scheduling問題,IEEE 1364都定得很 04/15 06:29
2F:→ zxvc:清楚,它們也不很冷門的語法。我用過的simulator都有一致的 04/15 06:33
3F:→ zxvc:結果。不過難懂倒是有點如此,所以即使是testbench也不建議 04/15 06:34
4F:→ zxvc:混著用。要看懂它,還必需先了解scheduling的觀念,我想這是 04/15 06:37
5F:→ zxvc:一些人學HDL的一個障礙。不過我覺得學scheduling也不能去逃避 04/15 06:39
6F:→ zxvc:我最近在使用SystemC,許多意想不到的結果,仍然是不懂 04/15 06:40
7F:→ zxvc:它scheduling的問題。VHDL也有它自己的一套scheduling,像 04/15 06:41
8F:→ zxvc:它的signal跟variable是不一樣的,很類似Verilog的 04/15 06:43
9F:→ zxvc:non-blocking與blocking assignment。 04/15 06:43
我的建議也是搞懂,但是不要刻意用, HDL 愈簡單愈好, 因為flow的不同, 用的tool不盡相同, 會出什麼問題也不知道 Verilog雖然長的像C, 但是其實精神還是 HDL, 而編譯器(synthesizer?)也不單純 所以我是不太會去挑戰tool的極限的 (有興趣研究的人例外...)
10F:推 M9407120:沒寫過always(*),請問這是什麼意思??? 04/15 08:40
我好像打漏了 @, 補一下
11F:推 zxvc:這是用來model combinational circuits用的。 04/15 09:15
12F:推 pupucar:懶人用法in this case = a or b or c 04/15 09:16
13F:→ zxvc:(*)代表把所有inputs,以level sensitive加到sensitivity 04/15 09:16
14F:→ zxvc:list。這種寫法的好處在於不必手動一個一個加。 04/15 09:17
15F:→ zxvc:手動加很容易漏掉一兩個,這樣behaviroal simulation的結果 04/15 09:18
16F:→ zxvc:就可能不是真正combinational circuits的結果。 04/15 09:18
17F:推 zxvc:這語法我當初也是在IEEE 1364看到的。 04/15 09:23
18F:→ zxvc:補充:何謂inputs。簡單的說就是等號右手邊的東西。左手邊的 04/15 09:24
19F:→ zxvc:是outputs。 04/15 09:25
20F:推 M9407120:我明白了,謝謝 04/15 09:51
※ 編輯: pierreqq 來自: 211.78.167.166 (04/15 10:43)
21F:推 zxvc:p大,我覺得不要刻意去用的原因是因為難懂、沒必要這麼用。 04/15 12:45
22F:→ zxvc:要不然一開始學Verilog時,你也不知道哪些語法可不可以用, 04/15 12:47
23F:推 zxvc:不是難的東西就代表每個tool有不一樣的結果。 04/15 12:52
嗯,當然, 隨著tools的更新,對scheduling的解讀應該會趨向一致,這東西會愈用愈明白 只是之前遇上了, 而且這也不是正規寫法,只好避開不用,對我之後的coding也沒影響 因為寫 HDL 重點不在這,就算我在 test bench 可以這樣用, 但是為了別人閱讀上的 方便,我也會儘量去寫穩定不會出錯的code 這就跟有人可以去參加比賽,寫出最怪異的C,而且是有功能的,贏得冠軍 但是教科書上絕對不會教你有這種寫法的道理一樣 ※ 編輯: pierreqq 來自: 211.78.167.166 (04/15 14:51)
24F:→ sneak: 它的signal跟va https://noxiv.com 11/11 15:04
25F:→ sneak: 它scheduling https://daxiv.com 01/04 21:55







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping 或 站內搜尋

TOP