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

看板Electronics作者 ( )時間16年前 (2009/04/15 22:21), 編輯推噓11(11040)
留言51則, 6人參與, 7年前最新討論串9/10 (看更多)
※ 引述《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底下,的確還是可以合成,只是當在寫大電路時, 基本上 d 並不是 combinational 電路 而是一個 有 clk 的 DFF,因為有寫了 posedge clock 不信的話,您可以合成看看....一定會有 clk combinational ckt 與 sequential ckt 分開,是很好的 coding style 但是,有時候,並不一定會比較好閱讀 下面這個電路,其實兩個還是合在一起 /////////// always @( posedge clk or negedge rst) if(!rst) test <= 0 ; else test <= test +1 ; /////////// 下面這個,才真的分開 /////////// always @(posedge clk or negedge rst) if(!rst) test <= 0; else test <= test_pre ; assign test_pre = test +1 ; //////////// 強制分開的話,我覺得對新人很好 因為可以避免有人把他當成 c 語言來寫.... 如果心中先有電路,再把他描述出來,(或是有先紙上作業) 基本上,會有多少DFF,心中早就知道了 而且,combitional ckt 該怎樣,其實也早就知道了... 所以這兩個分開的寫法,會比較像是 : 心中有電路 --> coding : 這就會造成debug上的困擾,至少我在初學者的時候,我曾經也是這樣 : ,後來當程式寫得越多越大時,就會發現這樣的style實在是不好的... : 或許剛開始大家可能為了交作業,只想function對就行了,但往後 : 程式開始複雜時,學長、老師的要求就會是整齊,把每個訊號分清楚, : 加上註解,這樣以後再回頭看,自己還記得當初在寫什麼,交接學弟 : 時,至少不會讓人閱讀起來很痛苦... : 而回到原作者一開始的問題,我覺得可以去參考一下CIC design compiler : 那本教科書,他甚至舉完例子,還畫出了合成的示意圖,非常容易瞭解.. : 而坊間的書多半都是解釋"<=" 就是在同時間一起動作,"="則是有次序的 : 動作,雖然是有次序,但在Wave上是看不出來,不過我的經驗是有時候寫 : a=a+1; 與 b=a+1; 結果會是不一樣的... : b=a+1; a=a+1; : 我相信這每個人都會遲早會碰到..一開始會覺得很奇怪,不過等遇到時就 : 會開始注意,只能說debug真的是在累積錯誤的經驗...呵呵 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.44.230.4

04/15 23:32, , 1F
1. simulation-synthesis mismatch: 你們說的都對, 一個
04/15 23:32, 1F

04/15 23:33, , 2F
以simulation 角度, 一個以synthesis角度
04/15 23:33, 2F

04/15 23:34, , 3F
2. seq. 電路 block 包含 combination 電路, 基本上就是
04/15 23:34, 3F

04/15 23:34, , 4F
一個 bad coding style, 基本的linting rule通常都是出
04/15 23:34, 4F

04/15 23:35, , 5F
error,而非warning, 最好避免. 另外coding完跑linting
04/15 23:35, 5F

04/15 23:37, , 6F
是qualified designer 基本要求, 建議慢慢養成習慣
04/15 23:37, 6F

04/16 04:50, , 7F
真的一定要把combinational circuits從sequential circuits
04/16 04:50, 7F

04/16 04:50, , 8F
分開嗎?這是我第一次跑nLint的結果,似乎是過的:
04/16 04:50, 8F

04/16 04:51, , 9F

04/16 05:02, , 10F
這個也過了:
04/16 05:02, 10F

04/16 05:02, , 11F

04/16 13:11, , 12F
那牌的linter說 a<=a+1; 是error的? 真是太超過
04/16 13:11, 12F

04/16 13:14, , 13F
而且... linter會出error喔? nLint 好像只有warning
04/16 13:14, 13F

04/16 21:09, , 14F
nLint有error,不過是compile還是lint有error我沒注意。
04/16 21:09, 14F

04/16 23:29, , 15F
linting rule 由 rule specification (setting) 決定
04/16 23:29, 15F

04/16 23:30, , 16F
和tools 有何關係? nLint 怎麼沒有error setting?
04/16 23:30, 16F

04/16 23:31, , 17F
k兄少見多怪了, 另外我在工作前均使用 IPQ 定義 rule
04/16 23:31, 17F

04/16 23:32, , 18F
setting, 由IPQ聯盟制定, 為IP競賽基本rule setting fil
04/16 23:32, 18F

04/16 23:38, , 19F
所以,以SIP deliverable,此類coding style是被IPQ禁止
04/16 23:38, 19F

04/16 23:40, , 20F
當然以a<=a+1'b1而言, 不考量IP設計, 當然不必特別限制
04/16 23:40, 20F

04/17 01:35, , 21F
linter都有 pre-defined rules吧, 這些rule也是每家
04/17 01:35, 21F

04/17 01:36, , 22F
linter都一樣? 剛特地翻了nLint的文件, pre-defined
04/17 01:36, 22F

04/17 01:38, , 23F
rules都是warning沒錯啊 會出error可能是user-defined
04/17 01:38, 23F

04/17 01:38, , 24F
rules吧
04/17 01:38, 24F

04/17 01:51, , 25F
nLint的warning/error跟severity設定有關 是我搞錯了
04/17 01:51, 25F

04/17 08:06, , 26F
剛才測試nLint也有IPQ rules。但我用該rule,lint的結果仍沒
04/17 08:06, 26F

04/17 08:07, , 27F
沒有要分離出combinational circuits的警告或錯誤。(或許是
04/17 08:07, 27F

04/17 08:08, , 28F
nLint的IPQ rules不完整!?)
04/17 08:08, 28F

04/17 08:09, , 29F
(我已經把severity調成最高的level 10)
04/17 08:09, 29F

04/17 08:15, , 30F
我想不是每家公司都在做IP,沒有必要都用這麼嚴格的rules吧。
04/17 08:15, 30F

04/17 08:16, , 31F
像IPQ rules中,註解沒寫也算errors。
04/17 08:16, 31F

04/17 08:18, , 32F
那請問一般業界都用哪個rules?nLint、RMM、IPQ?
04/17 08:18, 32F

04/17 11:58, , 33F
col應該是指 IPQ 的 SIM.2 那條
04/17 11:58, 33F

04/17 12:02, , 34F
你們之前把com定為a+1,seq定會a<=1,所以討論起來很亂
04/17 12:02, 34F

04/17 12:03, , 35F
不自覺的一直鑽牛角尖下去
04/17 12:03, 35F

04/17 12:09, , 36F
com always-> block? seq always-> nonblocking?
04/17 12:09, 36F

04/17 12:13, , 37F
感覺像是表達上的失準
04/17 12:13, 37F

04/17 12:14, , 38F
大家都有經驗,應該不會卡在這種基本問題上才是
04/17 12:14, 38F

04/17 17:35, , 39F
我覺得我應該沒有誤解co、Acme大的意思。
04/17 17:35, 39F

04/17 17:35, , 40F
我們現在討論的問題不是哪裡該用blocking、non-blocking,
04/17 17:35, 40F

04/17 17:36, , 41F
而是寫sequential circuits要不要把combinational circuits
04/17 17:36, 41F

04/17 17:36, , 42F
分離出來。
04/17 17:36, 42F

04/17 17:39, , 43F
我是覺得討論這麼detail的問題感覺有點"鑽牛角尖",但從討論
04/17 17:39, 43F

04/17 17:40, , 44F
的過程我覺得學到不少東西。
04/17 17:40, 44F

04/17 20:50, , 45F
其實,我的重點是:d是DFF,不是combinational ckt...
04/17 20:50, 45F

04/17 20:51, , 46F
我也說了,分開不一定會比較好閱讀.....
04/17 20:51, 46F

04/17 20:52, , 47F
而且,tst<=tst+1; 其實不是分開...而是test<=test_pre才是
04/17 20:52, 47F

04/17 20:58, , 48F
我說對新人很好,是只對完全空白的新人,還沒有seq. com.的概念
04/17 20:58, 48F

04/17 21:01, , 49F
當然...各位早就遠遠超過了新人許久了...
04/17 21:01, 49F

11/11 15:04, , 50F
col應該是指 IPQ https://noxiv.com
11/11 15:04, 50F

01/04 21:55, 7年前 , 51F
nLint的IPQ r https://muxiv.com
01/04 21:55, 51F
文章代碼(AID): #19vUrUhY (Electronics)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 9 之 10 篇):
文章代碼(AID): #19vUrUhY (Electronics)