看板 Electronics 關於我們 聯絡資訊
※ 引述《FTICR (FT-ICR)》之銘言: : 標題: [問題] Verilog 用 data edge 作為訊號輸入 : 時間: Sun Jan 3 00:25:26 2016 : : 各位板友好 : : 想問一個基本的問題 : : 一般verilog 常見的寫法可能是這樣 : : //sequentail part : always@(posedge clock) begin : if (rst) begin //synchronous reset : state <= state_1; : ... : end : else begin : state <= next_state; : ... : end : end : : //combinational part : always@(*) begin : case(state) : state_1: begin : if (a==1) begin : next_state = state_2; : end : end : … : endcase : end : : : 但如果如果想用一個訊號的 edge 來進到下個 state (asynchronous) 不知道怎麼作比較好 : : : 以下寫法我知道不太合理 : : //sequentail part : always@(posedge clock) begin : if (rst) begin : state <= state_1; : ... : end : else begin : state <= next_state; : ... : end : end : : : //combinational part : always@(*) begin : case(state) : state_1: begin : if (posedge a) begin : next_state = state_2; : end : end : … : endcase : end : : : : 請問各位前輩,正確的可以實現上面這個功能寫法應該怎麼作? : : : 謝謝! 看你的想法我大概會有幾個疑問吧 1.你這樣寫或者要實現這樣的function想要得到什麼樣的好處? 一般來說如果真的要對clock動手腳一定會有甚麼原因 不外乎操作速度要更快或者面積要更小, 或者是逼不得已的情況(介面處理) 2.clk與a這兩個訊號的關係? 如果a是源自於clk的訊號,簡單來說就是同步的東西 那就在狀態轉換的時候寫一個條件去判斷就好了 如果是不同步的兩個訊號, 那狀態機為何要用兩個不同的clock去驅動? 而且處理不同步的訊號也不是用這種方式去處理的~ 如果你真的想要把這種做法實現,我大概會用這種方式去寫 always@(posedge clk_a or negedge rst) begin if(!rst) state<=state_1; else begin case(state) state_1: begin state<=state_2; end state_2: begin .. .. endcase end end assign clk_a=(state==state_1) ? a : clk; 只是你在synthesis以及APR的時候對clock下的constraint 還是要去思考我上面問的那些問題 (考慮clk_a, clk, a等訊號之間的關聯性) : : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.77.56 : ※ 文章網址: https://www.ptt.cc/bbs/Electronics/M.1451751928.A.BE0.html : 推 kyo547896321: 照你這寫法,還是得等clk才能換state吧? 01/03 01:51 : 這個寫法連 ncVerilog 都不過 (更不用說合成了) : → kyo547896321: 如果是要和這block本身的clk不同步的話,那把你的a 01/03 01:53 : → kyo547896321: 當作另一個DFF的clk來寫,a的edge一來就能換state 01/03 01:54 : 確實覺得可能需要灌進去 clock,但 Verilog 有辦法合成出這樣的電路嗎? : → kyo547896321: 不知道有沒有誤會你想問的問題就是了 01/03 01:54 : 推 kyo547896321: 畢竟你的code和你描述的作法不是同一件事情 01/03 02:02 : → kyo547896321: 1.用posedge a改next_state 2.用posedge a改state 01/03 02:07 : → kyo547896321: 你的code是1但你的描述看起來像2 01/03 02:09 : 1的功能應該是 synchronous (在state_1時,如果a==1,posedge clock時會到state_2) : → kyo547896321: 要不要先說一下你的"進到下一個state" 01/03 03:56 : → kyo547896321: 是改變state還是next_state 01/03 03:57 : → kyo547896321: 如果是改state,那將a當作另一個DFF的clk是可行的 01/03 04:02 : → kyo547896321: 畢竟不同block本來就可能用到不同的clk 01/03 04:03 : → kyo547896321: 只是你得考慮multiple clk domain面臨的麻煩就是 01/03 04:04 : 當然是改變 state,只是先在 conbinational part 輸出到DFF的D,在sequentail part : posedge clock 時存進去(D → Q) : → Baneling: 建議你先有能力把基本能合成的code直接變成電路的能力 01/03 14:30 : → Baneling: 再來想這些... 不過通常你弄懂電路的概念之後, 大概就知 01/03 14:31 : → Baneling: 到你現在亂寫code的"點"在哪了 01/03 14:31 真心建議你,先把"可合成"的verilog語法弄熟,其實當初教我做數位IC的人講過一句話 你寫的verilog大多是把你想像中的硬體寫出來,硬體我們能用的不外乎就是flip flop latch跟logic gate,因此procedural block中的sensitivity list會寫成這樣 簡單來說就是模擬器執行這些可合成語法的方式會類似真實電路的動作 因此這些語法就會被歸類為"可合成" 是因為合成軟體看到這類型的code會找出相對應的硬體。 如果短時間之內沒辦法做到這種程度就先了解到 "testbench想怎麼寫沒關係,但設計一定要用可合成的語法" : 我想把 Verilog code 畫成電路這我作的到 其實你想像中的情況跟我想表達的情況應該有一段差距 :s : : 想了一段時間,不知道 sequentail part 這樣寫是不是一個方法? : //sequentail part : always@(posedge clock or posedge a) begin : if (rst) begin //synchronous reset : state <= state_1; : ... : end : else if (a && state==state_1) begin : state <= state_2; : end : else begin : state <= next_state; : ... : end : end 可能我用的standard cell比較單純,我幾乎沒寫過這種可以被兩個clock trigger 的procedural block,一般來說沒有DFF可以同時被兩種clock觸發,所以這種寫法 就算能用,在coding style上來說也是很不好 要也是像我上面那樣寫,先把clock處理過後再送到DFF。 (當然constraint要怎麼下又是另外一回事了) 另外建議你,寫FSM就把comb跟sequ寫在一起了,因為大部分寫法都把控制訊號 跟FSM的state寫在一起,當你狀態很多的時候描寫state的procedural block會拖很長 你每個控制訊號獨立寫成單一procedural block,debug的時候你看自己的code 會上上下下拉到很想死。 : ※ 編輯: FTICR (219.70.169.149), 01/03/2016 16:07:20 : 推 ptta: 就是把一個 之 comb signal當成 clock,可以合成,十年前就看 01/03 17:11 : → ptta: 過了 01/03 17:11 其實有經驗,code寫出來有相對應的synthesis以及APR(CTS)的constraint 要怎麼做大概都可以,問題就在於很多人在下constraint的時候其實都沒有弄得很清楚 EDA tool解讀這些constraint的方式還有處理電路的手法,如果是這種情況 我覺得就先別去把設計搞這麼複雜了,single clock domain的設計先弄清楚吧~ 原po寫code的方式感覺就是剛出新手村,就不太建議自己去找麻煩 XD : 推 Leadgen: Comb signal當clock,不怕有glitch嗎? 01/04 00:04 嗯呀,真的要對clock動特別的手腳(除頻以外的功能),也是使用DFF的輸出居多。 不過CTS也要另外處理,通常是吃力不討好 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 182.234.146.229 ※ 文章網址: https://www.ptt.cc/bbs/Electronics/M.1451844137.A.365.html
obov: 把verilog/HDL當C(or其他)寫的人 尤其是以前資工轉硬體的 01/04 02:41
obov: 最常見的觀念錯誤就是 不懂甚麼叫做DFF 01/04 02:42
obov: DFF最重要的一個特性 就是setup/hold time 01/04 02:42
obov: 這是當代絕大多數數位電路設計的核心 01/04 02:43
Baneling: 他們會覺得那是一種變數~ 01/04 03:04
xanter: 原PO寫的CODE真的像新手村出來的 01/04 10:16
tonybin: 竟然需要教主出來教電子學 囧 01/04 18:08
cebelas: 教主安安 01/04 18:35
ptta: 教主安安 有些設計不得不這樣做(以 comb 當 clock) 01/04 20:00
Baneling: 其實clock gating就是一個例子了,用comb當做clock,要 01/04 21:40
Baneling: sequ cell來同步變化過後的clock(CG是用latch),不然有 01/04 21:41
Baneling: glitch,這chip就算掛了... 01/04 21:42
obov: 一般來講現有的digital design flow重視的是clock domain 01/06 01:35
obov: 跟clock沒有直接關係的sig就不能拿去當dff的clk 01/06 01:37
obov: 當然沒有人規定一定要遵循這個flow就是惹 01/06 01:38
Baneling: ob"_"ov 01/06 18:54
obov: 古時候曾經一度有點秋的topic叫做asynchronous design 01/07 00:32
obov: 這idea最大的笑話就是 功耗很低 01/07 00:33
obov: 可是研發時間長到哭爸 bug也多到哭爸 等你能賣的時候 01/07 00:34
obov: 對手光製成就推進兩三代惹 結果功耗還比你低 01/07 00:34
Baneling: asynchronous design現在成熟很多了 只是它並非完全asyn 01/07 13:05
Baneling: 做SoC還是會把clock domain切成好幾塊處理 單一clock是 01/07 13:06
Baneling: syn,不同clock做成asyn 01/07 13:07
obov: 古時候的async好像有一堆handshaking 01/07 15:43
obov: soc不同clk domain有些是會放fifo 01/07 15:43
obov: 這兩個概念不一樣 我說的那個古時候的async是在炒clockless 01/07 15:44
obov: 其實也沒很古 十幾年前而已 01/07 15:44
Baneling: 對呀 你說的那種其實有點類似用circuit的概念來做數位電 01/07 17:14
Baneling: 路, 在設計上不太可能快的了的 XDD 01/07 17:14