如何才能看到verilog,就知道綜合出來的電路呢?

就是一看到verilog 就知道被綜合成什麼電路,通過什麼方法訓練多久能達到這樣的水平?或者至少一些基本的電路能看出來,各位有資料推薦嗎?


謝邀。初學者容易有這方面的困惑,但是這個問題的層次還不夠深入。儘管VerilogHDL是數字IC入門的基礎和工程師的基本技能,但是還是需要掌握一定的知識後才能精通,注意是「精通」。「精通」應該達到什麼樣的能力呢?

1、看到電路功能需求後知道何種電路結構是最優的。

2、設計出電路結構後,知道如何使用VerilogHDL進行描述。

3、設計電路和使用
VerilogHDL 描述的時候能夠從性能、面積、功耗、可測性等方面去考慮。

4、能夠精確理解「RTL」的含義。VerilogHDL和電路是相通的,看到代碼之後能夠知道電路結構是怎麼樣的?包含多少個寄存器?

5、在第4條的基礎上,看到VerilogHDL代碼後能夠大致推斷出電路的性能、功耗、面積等,包括關鍵路徑在何處、關鍵路徑大約包含多少級邏輯鏈路、那部分對功耗、面積、性能等影響最大(當然,這些在設計電路結構的時候就應該考慮好,從verilog反推也應該能達到這樣的能力)。

(大概是這些吧,想到了其他項再補充。)

先來看Synopsys公司的一個tool:LEDA。LEDA在做coding style審查時,主要包括Synthesis、simulation、DFT、design style等等很多個方面,這些都是對設計人員書寫VerilogHDL的全面約束和指導,從而在項目初始就保證Verilog code在style方面是有一定質量保證的。這些約束和上面說到的5條技能是息息相關和一一對應的。從上面的技能要求可知,達到精通VerilogHDL需要有以下的基礎知識(默認以學過VerilogHDL基本語法):

1、VerilogHDL與電路結構的一一對應:

Synopsys DesignCompiler的workshop和關於HDL Compiler for Verilog User Guide。

2、VerilogHDL與電路性能等一一對應:

這方面涉及到的知識比較多,主要包括Standard Cell Library、STA等,參考書有(1)Static Timing Analysis for
Nanometer Designs: A Practical Approach. J. Bhasker, Rakesh Chadha. Springer
Science Business Media, LLC 2009. (2)DC和PT手冊中關於timing的 User Guide。

同步學習1-2理論基礎的同時,需要學習、熟悉、精通相對應的EDA tool,即:LEDA、DC、PT、Primepower等。

學習以上知識之前,應該具備數字集成電路基本知識,這樣才能對以上的知識有更深入的理解。除了基礎知識外,還需一定項目開發的歷練,即可達到「精通」的目的了。


不看代碼都知道,一定是:組合邏輯+時序邏輯。

例外:沒有電路概念或者基礎的初級ICer偶爾會出現組合邏輯環或者不期望的鎖存器的情況。這些錯誤工具都可以幫你找出來。

你可能要說,這不是屁話么?不是屁話,IC前端工程師絕大多數情況下只關心到這個層次。

例外:全定製設計或者模擬/RF工程師寫的很小電路,可能會需要更深入,組合邏輯內部結構會影響速度。

IC前端工程師需要關注的是面積,速度和功耗這些因素。因為你的老大不會讓你設計一個模塊而無任何約束。一般情況下,代碼寫完了一綜合,哦,速度達不到老闆的要求,回頭重改! 改了之後,哦,面積又不行了,再改!

折騰久了,你在啪啦啪啦敲代碼的同時,內心就會多一雙眼睛。我搞這麼大這麼複雜的一個組合邏輯,會不會速度起不來啊? 我把邏輯拆分這麼細,隨手就定義一個64bit的寄存器,會不會面積超過預算? 這部分邏輯信號是否可以在idle時約束到固定值,節省動態功耗?

==========================================================

菜鳥到碼神的進階之路

==========================================================

心中無電路,代碼無電路

這個估計就是第一天學硬體描述語言的情形。或者是一個軟體專業的工程師轉行來做電路設計時的窘態。

建議:好好上課,認真聽講吧。

心中有電路,代碼無電路

我想設計一個交通燈控制邏輯,邏輯關係圖都畫好了,腦袋裡已經把各個轉換條件都想通透了,但就是不知道代碼怎麼下手哇。這是沒有掌握語言工具的情形。

建議:死磕語言語法。

心中有電路,代碼有電路

剛畢業加入職場,上級分配一些小規模的模塊給你。這怎麼搞哇,腦容量不夠,無法完整地想像出電路的結構。好吧,先在稿紙上研究。三天奮戰後,幾張A4紙上已經是滿滿的電路。藍圖繪就,只待轉碼。這個算是生硬的直譯。

建議:多加班,少玩知乎。

心中無電路,代碼有電路

經過幾年的碼農生活歷練,收穫白髮的同時也成IC編碼老鳥了。拿到設計需求,花半個小時通讀SPEC,就直接開始編碼了。語言工具爛熟於胸,文思如泉湧,一切信手拈來。代碼一看就有美感,assign,always錯落有致,時序層次清晰,組合邏輯大小合適。光看代碼就知道這個電路結構。武林高手就此誕生!

建議:多跑主管辦公室,漲薪水。

心中無電路,代碼無電路

經過多少次將寫好的代碼推倒重構,經過多少次否定之否定的哲學沉思,你從此走上了碼農到碼神的修鍊之路!

一切數字邏輯,小至1bit的寄存器,大至一個CPU內核,難道不可以歸一化為一個FSM?

一個FSM難道不就是一個組合邏輯雲後面加一組寄存器做時序定序?

一個組合邏輯雲不就是一個演算法描述嗎?

一個無時序演算法描述跟C程序不一樣嗎?

FSM本質上就是演算法描述,跟電路結構無關。從FSM代碼去想背後的電路結構毫無意義。

FSM代碼就是直觀的演算法描述,一看就懂,最容易被人懂。

直觀的演算法描述跟功能SPEC最接近。我可以把文字的spec直接翻譯成演算法的代碼描述!

Okay,既然上升到形而上的高度,你已經是碼神了。即便一個帶複位和使能的觸發器設計,你也有慾望把他寫成FSM,而不用always,if-else這種語法結構。這樣才是一代碼神的風範!

建議:你在這一行的路已經走到頭,絕世高手一般都是退隱江湖的。

至此,我們又回到了心中無電路代碼無電路的境界,一個循環結束。回到起點你的感覺如何? 開個小飯館?水吧?或者咖啡店? 反正好歹我是再不幹這個了,大家都這樣想。

人在江湖,豈能輕易上岸?金盆洗手一般都是痴心妄想!電影裡面都是這樣描述的。


可綜合設計是數字電路的基本要求,相當於是入門的門檻。我們可以看一下,為了跨越這個門檻,大學裡面微電子的本科課程是如何設置的。

一般而言,數字電路的基礎課程是數電(這好像是句廢話)。這門課程裡面基本概念一般包括了

- 布爾邏輯入門

- 基本邏輯單元(與或非)

- 卡諾圖(布爾邏輯對應到基本門)

- 組合邏輯和時序邏輯(基本時序單元,latch,ff,DFF,JKFF等)

- 常見組合和時序邏輯電路(狀態機,編碼器,計數器等)

- 常見運算電路

你會發現,這門課的目標在於告訴你電路是什麼,怎麼用電路實現基本的功能。(這裡說的是基本功能,這門課的大作業一般就是紅綠燈、自動售貨機的水平)。上完這門課,你應該基本知道自己做出來的電路(比如自動售貨機)有哪些邏輯單元構成的。上這門課的時候,可以完全不引入verilog/vhdl,純用電路圖來搭都沒問題。

當然,如果這門課引入verilog,最關鍵的是講清楚verilog語句和電路的對應關係,培養基本的coding style,最關鍵的是,別讓新人把自己帶到坑裡去。

數電應該還會設置一到兩門高級課程,講設計透視或者超大規模集成電路設計。這門課的重概念包括

- CMOS基本(包括基本門結構,版圖基礎等)

- 時序概念(setup、hold是最關鍵的)

- 基本流程(綜合、PR、STA)

- 常用電路(基本電路如加法器,FIFO等)

- 其他常見概念,如流水線等

這門課的目的是告訴你功能(verilog)怎樣翻譯為電路,在不同的需求(約束)下,會變成怎樣不同的電路。通過這門課,你應該可以知道那些是你在coding的時候應該預先就想到的,哪些是你可以交給工具完成的。也基本可以做到大概預估自己寫出來的代碼是什麼樣子的,基本的性能如何。

基本上順著這條線走下來,應該可以做到題目中的要求了。


訓練方法一:請按照如下方法寫代碼,只允許使用always和assign,每個塊裡面只有一個被賦值信號,if裡面只允許使用一個單目操作符,禁用for。

訓練方法二:考慮如何僅僅使用mux搭出任意組合電路。

訓練方法三:考慮如何僅僅使用sram搭出任意組合電路。

訓練方法四:嘗試用術語「拍」來描述一個transaction。

很快你就明白了。


always (@posedge clk)

begin

......

end

這是綜合成D觸發器,過程塊內的語句是觸發器輸入端的組合邏輯

always (enable)

begin

......

end

綜合成鎖存器,過程塊內的語句是鎖存器輸入端的組合邏輯

always (a or b or c or d or....)(敏感表完整)

begin

......

end

綜合成組合邏輯塊

assign賦值都是組合邏輯

if和case通常生產MUX

for循環就是把循環內容複製成N個相同的電路

加減乘除生成的具體電路取決於庫和設計約束。

簡單的單元就這些吧,大的把它們組合起來就能看出個大概。


GTECH庫。

GTECH就是synopsys 自己綜合後還沒有map 到具體器件的中間格式。多看看,特別是時序cell,非常有幫助。


我覺得,過幾天你就不會問這種無聊的問題了。相比於電路,看完代碼就能迅速說出它的功能更有意義。將RTL描述迅速轉換成行為級乃至系統級描述要更有實際意義的多。


  1. 使用什麼綜合工具,就看它的 User Guide 和所推薦使用的 Coding Style。因為不同的工具,其推譯(infer )規則不同,相同的代碼在不同的工具中綜合出來的結果是不同的,Synplify 就以其高效、準確的綜合能力著稱。

  2. 工具的文檔中都有詳細介紹常用元件的 coding style,記住並遵循這些風格。
  3. 一般的工具都可以看綜合出來的 RTL schematic 和 Technology schematic,多練習、多對比預期和結果。

===========================跑題分割線=============================

補充點答非所問的內容~

新手學習verilog時,總是被老鳥一遍又一遍地告誡,「你要做到滿眼的代碼,滿腦的電路,才算是入門了「。原因就是我們在設計電路,而不是編寫程序。我們設計電路大概可以分為兩種方式:

  1. 原理圖
  2. 代碼描述

方法1 優點是:簡單粗暴,非常直觀,所得即所想。在早期的中小規模數字電路設計中這種方法很流行,但是一旦電路規模增大,其缺點就暴露出來了:複雜,模塊復用不便,修改設計不便。這在大規模、超大規模數字電路設計中尤其明顯。後來隨著計算機技術的發展,EDA 軟體功能越來越強,就有了方法2。

方法2 的優缺點一大堆,其中一個缺點就是最終結果嚴重依賴於綜合工具。我們最終得到什麼結果,取決於 我們的代碼+綜合工具對其的解釋(推譯)。因為不同的工具的推譯規則不同,所以,我們應該遵循所使用的工具的coding style。

===========================又一個跑題分割線===========================

心中有電路是基本功,很重要。但是隨著電路功能越來越複雜,人們關注的重點逐漸往上層偏移,至少在 RTL level 以上,Behavior level 甚至是 system level,這時候,我們更加關心的是綜合結果是否能完成我們預期的功能,而不是電路是什麼樣子。(比如,設計一個串口收發器,我們關心的是電路能不能按照協議正常工作,而不是底層電路中到底是用哪幾個觸發器保存哪些信息)


多實際綜合幾次就知道了。

另外,養成好的編碼風格是前提。奇葩代碼怕是綜合器自己都不知道綜合成啥了


謝邀。

我想先問你一個問題,你為什麼要知道你所寫出代碼所綜合出來的電路呢?

我的想法是這樣的:不需要知道所綜合出來的電路是一條光明大路。為什麼這麼說呢?在現在的應用場合下,大家都是在建模的基礎上,進行代碼的編寫或是改寫。我們要完成的工作就是實現模型所要求的功能。一個功能可以有許多種電路來實現,這又不是初中一題多解的年代,你無需知道你寫出來的是個什麼電路。但是不知道你寫出來是個什麼電路也不可以安枕無憂的。正如我前面所述,一個功能有許多種寫法,但是電路可能不是同一結構,那麼如果你寫的東西在實際的應用中沒有問題,我們且可以就讓他上崗吧。但是如果你對功耗、面積和工作頻率有一定的要求,在進行綜合的階段,這些問題都會在setup time等時序報告當中得以體現。就算是不出現違例的警告,我們也可以通過不同結構大致清楚是否可以進一步的優化。

還有一種情況我們必須知道綜合的代碼是否與要求電路一致的情況就是,你在用基本的邏輯門搭建的電路,在代碼中的體現就是你不斷的用and or xor等做例化。這種情況說白了就是在搭積木,你搭建的和你設想的有差別,不用想了,就是你寫的問題,靜心滿滿查錯吧。

如果說你想知道你都綜合出來什麼電路,方法有二:第一就是使用Synopsys Design Compiler中的GUI可以很清楚看出來綜合出來的電路,而且這個方法很直觀;第二種方法就是看網表,自己畫出連接關係,我個人更喜歡這個辦法。


過來關注,自己也順便好好學習一下!

我說一說自己的感覺吧,「就是一看到verilog 就知道被綜合成什麼電路」,光是達到這個水平其實就需要漫長時間的積累(電路結構至少上一定規模,別拿個加法器電路),至少我現在還是屬於把功能成功實現的階段。

我知道有一本挺好的書是關於這個方面的,算是入門級別的J.Bhasker《Verilog HDL Synthsis A Practical Primer》。

等待更多大神過來回答,小白學習了!


樓主,如果要看出電路,有三個層次(主要針對FPGA)

1)第一個層次是看出RTL級的電路 這一步非常簡單,首先需要你寫出可綜合風格的verilog語言,這一步非常容易,組合邏輯和時序邏輯,這樣綜合出來的任何電路都是組合邏輯+寄存器的形式。組合邏輯的形式是根據你always@(posedge clk) 中 &<= 右邊的等式的形式。if(條件)一般條件就是mux選擇。基本RTL就這樣,你可以看看RTL圖形網表感受一下。這一步不用什麼參看資料,需要對verilog可綜合代碼用熟了自然就會,基本也一眼能看出來。

2)第二個層次是RTL到與非門級,這一步其實說實話基本上沒什麼一眼看出來的巧妙方法,不然也不會有《數字邏輯設計》中畫卡諾圖等等各種邏輯設計方法了。給你一個複雜邏輯多項式你不畫卡諾圖你能一眼就設計出來邏輯電路么?基本不能。要到這一步,多看看數字邏輯設計,而且真的相對自己的verilog代碼到與非門級,那麼就要好好的分析一下,這一級一般的EDA工具也會有圖形化網表,可以學習一下。

3)第三個層次是到LE(CLB)級,這個是FPGA裡面的結構,ICdesign中是晶體管。這個需要對你綜合成的與非門邏輯電路進行分割,然後裝箱,說白了就是把幾個門放在一個LUT里,具體的演算法有DAG-MAP和FLOWMAP等,反正這是EDA自己做的,你可以學學演算法具體什麼方法,其實不用自己分析的

總結,我認為對於IC前端設計,或者FPGA設計,最多到第二個層次就很不錯,看過幾次RTL試圖就很容易一眼看出第一個層次。長時間的數字邏輯設計積累就會一眼看出第二個層次。第三個層次對於fpga來說基本沒必要。IC前端最多用來估算資源。


有沒有工具啊,將verilog代碼,轉成門電路然後顯示出來


清楚哪個是寄存器,從代碼中讀出輸入寄存器的邏輯,這就非常足夠了。除非這段代碼可能是關鍵時序路徑,否則沒有必要。


綜合工具一家和一家做法都不一樣 ,

你看出來有個啥用 ?

想去做庫嗎?

精雕細琢說不定有用 。

或者直接去做版圖 。


邊看數字集成電路的書,邊玩dc


知道你描述的是電路而不是軟體code。新icer經常犯的錯誤就是以軟體思維來coding。


推薦閱讀:

初學Cadence IC的小白應該在哪些論壇或者社交平台提問?
提高核心數和改善架構,這兩種方案哪種更能提升 CPU 的性能?
多核心處理器設計有哪些特別難的技術門檻?
985碩士一枚,專業方向射頻集成電路、通信數字接收機集成電路、超大規模集成電路。今後發展方向有哪些?
讀研選擇嵌入式還是數字IC?

TAG:晶元集成電路 | 晶元設計 |