從最開始的架構發想、電路設計到 layout 的生成都是一個 IC 設計必備的流程。至於有哪些呢?我們往下說下去。
首先我們要先決定這個 IC 的定位是什麼?可能是用於加速 AI 運算的特殊用途晶片,或是支援高速加解密的晶片。以本系列文來說就是一個 CPU 。再來就是決定更細節的規格,例如,CPU 支援的指令集是哪一個,支援的指令有哪些?當一切準備就緒,我們才開始「設計」。
之所以要訂定系統規格是因為設計 IC 的也許是一個人,但更大的可能是一個團隊。團隊中,每個人的想法一定都有出入。以算數邏輯單元 (ALU) 來說,內部肯定支援多種功能,像是「且」、「或」、「加法」等,那麼我們怎麼判斷當前選定的功能?此時,我們就需要一個規格,訂定選擇線 0, 1, 2, ... 分別為何種功能。這只是一個很小的例子,但是若沒有溝通好就足以讓晶片發生問題了!
設計電路時,我們通常會使用 Verilog 或是 VHDL 這兩種硬體描述語言 (Hardware Description Language, HDL) 。VHDL 多為歐洲國家所使用,因此在這個系列文中,我們會以 Verilog 來實作 RISC-V CPU。
Verilog 設計電路時,大概可以分成 3 個層級。最底層的稱為 Gate Level,此時我們會以描述邏輯閘的相接情況來設計電路。接著是 Dataflow Level,這個層級我們會專注在描述資料的流向,例如,assign a = b & c
代表我們將 b
對 c
做且運算後,將答案流向 a
。最高層級是 Behavioral Level ,此時我們可以透過更抽象的方式來描述電路,例如在設計多工器時,我們可以透過 if
, else
來表達多工器的行為。
設計電路後,我們要先驗證設計是否正確。此時我們會透過撰寫測試檔 (testbench) 來傳遞我們的輸入資料,並將結果透過波形圖輸出。波形圖中,我們可以看到電路的各個元件、各條電線、各個暫存器在不同時間所流過的資料為何。
在這個階段,我們需要將 Verilog Code 都轉換成 Gate Level 的形式。但是這對於我們來說非常的困難,因此我們會借助 EDA 工具來完成電路合成。其中以 Synopsys 推出的 Design Compiler 最為知名。這個工具會根據我們的製程和需求將 Verilog 轉換為最合適的 Gate Level 電路,並作最佳化。
舉例來說,電路中的 Or-Gate 永遠連接高電位,那麼這個邏輯閘基本上是毫無作用的,因為輸出必為高電位。再舉另一個例子,這個敘述 a & b & c
應該用兩個邏輯閘來完成呢?還是一個 3-input 的邏輯閘呢?這些事情都會在電路合成階段為我們完成。
最終,我們會得到 Gate Level Netlist
,前端設計也到此結束。
在此之前的步驟我們都稱之為「前端」,接下來我們要將剛剛取得的 netlist 繪製成 layout。負責後端設計的工具有 Synopsys 的 IC Compiler II, Cadence 的 Innovus 等。
雖然就短短的一句話就可以概括這個階段,但著實不容易啊!這其中包括了佈局、繞線、時脈的合成等。如果佈局的不恰當,在繞線時,可能會導致電線沒有適當的路線可以放。此時,就會發生「繞線塞車」的問題。因此整個後端設計其實非常不簡單,需要包含豐富的經驗和理論知識才有辦法完成。
當取得 layout 後,我們就可以交由台積電或是聯電等公司為我們製造出晶片。layout 就想是晶片的草稿圖、構造圖,製造方會根據上面的敘述完成晶片製造,並交由封裝廠商完善最後的部分。
本系列文會專注在電路設計的部分,也就是 Verilog 的撰寫。