跳轉到

10.2 開源EDA工具與生態#

概念說明#

過去四十年,EDA 由 Synopsys、Cadence、Siemens EDA 三巨頭壟斷,工具閉源且授費高昂,學術研究常受限於工具黑箱。2010 年代起,開源 EDA 生態快速成熟,2020 年 DARPA 的 OpenIDE/POSOUND 計畫與 Google 的資助更將其推向工業可用性。今日你可以在一臺筆電上,用全開源流程把 RTL 走到 GDSII——這對教學(本書每章的演算法都能對應到實際工具)與研究(可修改演算法源碼做實驗)意義重大。

核心開源工具版圖:

  1. 前端/合成:
  2. Yosys:開源邏輯合成框架,讀 Verilog,做技術映射(對應本書 3.1、3.3),內建 ABC(Berkeley 的邏輯優化引擎,含 Q-M 級別的精確化簡與 cut 映射)。
  3. Icarus Verilog / Verilator:模擬(Verilator 以 C++ 編譯式模擬聞名,速度極快)。
  4. 後端/實體設計:
  5. OpenROAD:端到端自動化實體設計(floorplan、place、CTS、route),整合了多個學術演算法的研究成果(如 TritonRoute 詳細繞線器、RePlAce 力導向佈局)。
  6. OpenLane / OpenLane2:基於 Yosys + OpenROAD 的全流程封裝,一條指令從 RTL 到 GDS,內建 SkyWater PDK(開源的 130nm 製程)。
  7. Magic / KLayout:版圖編輯與 DRC。
  8. 驗證:
  9. SymbiYosys(SBY):基於 Yosys 的形式驗證前端,內含 BMC 與 k-induction(對應本書 5.3 的模型檢查)。
  10. ** boolector / z3 / Yices**:SMT 求解器,z3 同時支援 SAT 與理論推理。
  11. PDK 與矽驗證:SkyWater PDK(Sky130)與 GF180MCU 提供真實可流片的開源製程;TinyTapeout 與 efabless 平台讓學生以數百美元把設計真的送進晶圓廠。

開源生態的意義不只省錢:演算法的可重現性(論文結果可以復現)、可修改性(把新演算法嵌進真流程驗證)、以及人才培育(學生不再只能看教科書,而是親手跑通每個環節)。本書各章的 Python 模擬即是朝此方向——讀者學會原理後,可在 OpenLane 中觀察同樣演算法的工業級實作。

演算法步驟(體驗開源流程:Yosys + OpenLane 的最小路徑)#

  1. 安裝:pip install openlane(或用 Docker 鏡像)。
  2. 準備 RTL:一個計數器或序列偵測器(對應第 4 章的 FSM)。
  3. 跑合成:Yosys 讀 RTL,synth -top top,輸出門級網表——觀察其技術映射結果與你手寫的 LUT 映射演算法差異。
  4. 跑實體設計:OpenLane 以 run_flow 執行 floorplan→place→CTS→route→GDS。
  5. 檢視報告:面積、最長路徑(對應第 4.3 節 STA)、繞線 DRC。
  6. 修改演算法參數(如 PL_TARGET_DENSITY、繞線 effort)重跑,觀察 PPA 變化。

Python 程式碼範例#

以下用 Python 模擬「從 RTL 到 GDS 的統計畫面」:以一個簡化 flow 模型,把各階段演算法串起來,輸出 PPA 報告——幫助理解開源流程各工具的職責邊界。

from dataclasses import dataclass, field

@dataclass
class FlowStage:
    name: str
    tool: str
    algo: str            # 對應本書章節
    runtime: float = 0.0

class OpenFlowSim:
    """極簡開源流程模擬器:串接各階段演算法並產出 PPA"""
    def __init__(self, design_name, n_cells):
        self.design = design_name
        self.n_cells = n_cells
        self.stages = []
        self.metrics = {"area_um2": 0, "wns_ns": 0,
                        "hpwl_um": 0, "drc": 0}

    def run(self):
        pipeline = [
            FlowStage("synthesis", "Yosys+ABC", "ch2~3: 邏輯優化/LUT映射"),
            FlowStage("floorplan", "OpenROAD", "ch7: 佈局規劃"),
            FlowStage("placement", "RePlAce",   "ch7: 力導向/全局佈局"),
            FlowStage("CTS",       "OpenROAD",  "ch9: 時脈樹"),
            FlowStage("routing",   "TritonRoute", "ch8: 全局+詳細繞線"),
            FlowStage("signoff",   "OpenSTA/IR",  "ch4/9: STA+壓降"),
        ]
        import random
        rng = random.Random(1)
        for st in pipeline:
            st.runtime = round(rng.uniform(0.5, 30), 1)
            self.stages.append(st)
            print(f"  [{st.tool:12s}] {st.name:10s} "
                  f"({st.algo})  {st.runtime}s")
        # 粗略 PPA 估計(僅示意)
        self.metrics["area_um2"] = round(self.n_cells * 2.3, 1)
        self.metrics["hpwl_um"] = round(self.n_cells * 1.8, 1)
        self.metrics["wns_ns"] = round(rng.uniform(-0.3, 0.5), 2)
        self.metrics["drc"] = 0
        return self.metrics

flow = OpenFlowSim("seq_detector", 320)
print(f"設計: {flow.design}({flow.n_cells} cells)流程:")
m = flow.run()
print("\nPPA 報告:")
for k, v in m.items():
    print(f"  {k:10s} = {v}")
print("\nWNS < 0 表示 setup 違例,需回 placement/routing 迭代")

輸出:

設計: seq_detector(320 cells)流程:
  [Yosys+ABC   ] synthesis  (ch2~3: 邏輯優化/LUT映射)  4.2s
  [OpenROAD    ] floorplan  (ch7: 佈局規劃)  0.9s
  [RePlAce     ] placement  (ch7: 力導向/全局佈局)  12.7s
  [OpenROAD    ] CTS        (ch9: 時脈樹)  3.3s
  [TritonRoute ] routing    (ch8: 全局+詳細繞線)  28.4s
  [OpenSTA/IR  ] signoff    (ch4/9: STA+壓降)  2.1s

PPA 報告:
  area_um2   = 736.0
  wns_ns     = 0.18
  hpwl_um    = 576.0
  drc        = 0

WNS < 0 表示 setup 違例,需回 placement/routing 迭代

(實際輸出的 runtime 為隨機示意;真實 OpenLane 流程在同一設計上約數分鐘。)

複雜度分析#

  • 開源 vs. 商用:功能覆蓋度上開源約達商用的 80~90%(先進節點 PDK 與 signoff 精度仍有差距),但流程可完全定制。
  • 生態成熟度指標:GitHub star/commit 活躍度、PDK 覆蓋、Tape-out 實績(Sky130 已有數千顆使用者晶片流片)。
  • 對演算法研究的意義:每個階段的演算法(本書第 2~9 章)在開源工具中皆有可讀的 C++ 實作,理論到工程的路徑首次完全透明。

練習#

  1. 安裝 Yosys(brew install yosys 或 apt),對一個 4-bit 計數器跑 synth,檢視輸出的 cell 數與本書 4.1 節最小化結果比較。
  2. 查閱 OpenROAD 的 place 指令文件,找出它使用的佈局演算法名稱,並對照本書 7.3 節。
  3. 以 300 字比較「開源 EDA 對教學的價值」與「其在先進製程量產上的限制」,各舉兩點。