HOME ABOUT CONTACT

1. 前言top

之前在面試時,曾被問過:「你認為 RTL Synthesis 是扮演什麼樣的角色?」,身為在 EDA/CAD 圈子打滾過的軟體工程師,我想是蠻需要好好地認識什麼是 RTL Synthesis,特別是我之前還在這個基礎之上做過 Tooling 的開發和維護。

雖然我過去負責開發和維護的 Custom Compiler – Cell View Generation 是在 RTL Synthesis 之上,但鮮少聽過這個專有名詞,因為它已經融合在工具的最底層引擎裡了。但基於想要更精進 EDA 領域的知識,我花了一點時間研究和動手做了一些實作,因此想在這篇文章簡單記錄一下我對 RTL Synthesis 的了解,以及簡單的 Parsing 和 Symbol View 實作介紹。

2. 什麼是RTL Synthesis?top

定義:
用一句話來形容的話,我會說它是「硬體設計編譯器」,整個流程有以下幾個重要環節:

每個環節都是一個重大工程,從硬體描述語言開始,經過分析掌握用到的電路元件有哪些,例如邏輯閘、線路等等,再到 Elaboration 分析硬體的階層關係並展開,再透過 Liberty 時序分析做最佳化,以及用 Technology File 來映射到製程中真實用到的元件,最後產出 Schematic 電路圖。

3. Parsing & Symbol View 實作top

選擇Parser工具:
如果打算做一個功能較完整的 Parser,我會建議不要自己寫 Parser,而是直接去引用功能較完善的 ANTLR、Lark 或是 Python + Pyparsing。但如果你像我一樣想練習系統設計,並且做一個簡單的語法分析,例如像下面這個例子:


assign y = a & b;
assign z = y | c;
                    

分析得到一個 AND Gate 並且 Input 分別是 a 和 b,Output 是 y,和一個 OR Gate,Input 分別是 y 和 c,Output 為 z。像這樣的例子還是蠻值得試試自己做一個簡單的系統架構,同時也能理解如果要再做成更複雜的語法分析是多麼龐大的工程。

測試硬體描述語言:
我的主要測試硬體描述語言如下:


module my_logic (
    input wire a,  // 輸入訊號
    input wire b,  // 輸入訊號
    input wire c,  // 輸入訊號
    output wire y, // 輸出訊號 y
    output wire z  // 輸出訊號 z
);

    assign y = a & b;
    assign z = y | c;

endmodule // my_logic
                    

設計思路:
這個內容我簡單分成了兩個段落,分別是 Declaration 和 Body:
Declaration:開頭的 module my_logic ( … ),確認設計者是否以 module 關鍵字作為開頭,並且分析 Input、Output 有哪些。
Body:分析這些 Input、Output 如何與連接邏輯閘。

由於段落都有明確的開頭、結束的關鍵字,例如 "module" 開頭、");" 結束,"endmodule" 結束。因此我認為可以用 Design Pattern – State 來做設計,只要偵測到這些關鍵點,就自動變更下一個分析段落。

UML如下:

Symbol View 實現:
Symbol View 的部分,我沒有用任何圖形化的工具或框架來實現,單純地用文字繪圖來表示。這種方式雖然簡單,但能清楚地展示電路的邏輯關係和連接方式。

至於為什麼只做 Symbol 而不做 Schematic,因為 Schematic 牽涉到了 Place & Route 演算法,這個部分又是一門學問了,應該會是我下一個專案的題目了。

實作結果:
Parser 會產出以下結果:
1. 識別出所有輸入埠
2. 識別出所有輸出埠
3. 識別出所有邏輯閘及其連接
4. Symbol View 展示電路結構

輸入:


輸出:


我的 Github:

Last updated: