首批能夠在 RTL 層級進行建模的 HDL於 1980 年代問世,並逐步演進為完整的設計系統,使工程師能夠對電子電路中的資料流進行建模。
隨著設計規模日益擴大且日益複雜,加上製造技術開創了執行邏輯與數學運算的新方法,RTL 設計方法也與時俱進。隨著時間推移,RTL 設計已成為數位設計流程中不可或缺的一環,在系統規格與電路設計階段之間架起橋樑。
RTL 描述的抽象特性允許快速研究和進行設計迭代,以在進入設計流程中更複雜且耗時的階段之前,獲得可接受且優化的設計。
RTL 設計是「積體電路設計 」週期中的關鍵環節,它讓工程師能在開始考慮實體元件及其連接方式之前,先在寄存器、運算元和資料流等階段優化設計。本文將探討一些基礎概念,說明 RTL 設計在數位電路設計中的定位,並闡述 RTL 設計流程。 接著,我們將展示 RTL 設計如何融入現場可程式閘陣列(FPGA )與專用積體電路(ASIC)晶片設計中,並揭示 RTL 設計的未來發展趨勢。
「寄存器傳輸」(register-transfer)一詞,指的是該語言如何描述寄存器之間的資料流,以及如何對資料進行邏輯運算與數學運算。 工程師利用 RTL 設計來描述功能模組,藉此定義用於執行特定功能的離散元件之行為。每個功能模組皆包含對模組內寄存器的描述(稱為順序電路),以及包含該功能模組邏輯運算的組合電路。他們亦利用 HDL 來描述功能模組的連接方式,以定義資料在電路中的流動路徑。
RTL 設計的優勢在於,它能將複雜的系統分解為由 HDL 程式碼所代表的相對簡單的模組。以下是幾項理解 RTL 設計應用方式時至關重要的基礎概念。
在 RTL 設計中,能夠儲存固定量資料的硬體元件稱為寄存器。它們通常以D 型觸發器來實現。寄存器的值既可作為邏輯運算的輸入讀取,也可作為運算的輸出設定。闡明資料在寄存器間的流動方式,以及資料如何因運算而改變,正是 RTL 設計的基本目的。
RTL 設計中最重要的一部分,是描述電路行為的程式碼。HDL 是一種規格語言,其結構與程式語言非常相似,包含變數、函式呼叫、類似 if-then-else 和 CASE 的邏輯陳述式、布林陳述式以及數學運算。然而,HDL 是專門設計來描述電子電路(通常是積體電路)的行為與結構。 HDL 與程式設計語言的一大區別在於,該語言內建了時間概念,使得操作可由電路中的時脈觸發。
這是透過使用一個變數定義電路中數位時鐘值來實現,例如在這個 VHDL 簡單的逆變器範例中,時鐘值 (clk) 從低狀態轉變為高狀態 (上升邊緣) 時,輸出 (Q) 被設定為輸入值 (D):
D <= not Q;
process(clk)
begin
if rising_edge(clk) then
Q <= D;
end if;
end process;
最常用的 HDL——超高速積體電路硬體描述語言(VHDL)——是一種冗長且強類型化的語言,其語法與 C 語言截然不同。它是描述較複雜系統設計時首選的 HDL。
另一種常見的 HDL 是 Verilog 或其超集SystemVerilog 。它更為簡潔、採用弱類型且靈活,其語法與 C 程式碼相似。由於它易於學習且便於編寫描述,工程師在剛入門或電路不那麼複雜時,往往更傾向於使用它。IEEE 將 Verilog 和 VHDL 均定義為產業標準。
以下是兩種語言中「與」閘的簡單範例。「與」閘有兩個輸入端和一個輸出端。若兩個輸入端皆為 1,則輸出為 1;若兩者不相同,或皆設為 0,則輸出為 0。
VHDL 描述「及」閘為:
實體 my_and 如下:-- 首先,定義實體
port (
inp1: in std_logic; -- 第一個埠
inp2: in std_logic; -- 第二個埠
rst: out std_logic -- 輸出埠
);
end my_and;
architecture blk of my_and is -- Next, define the architecture
begin
process(inp1, inp2) -- With the inputs, do the following
Begin
-- Use a simple if-then-else statement
if((inp1=’1’) and inp1=’1’))then
rst <= ’1’;
else
rst <= ’0’;
End if;
end process
end blk;
「及」閘的 Verilog 如下所示:
module my_and(inp1,inp2,rst); // 定義模組 call
input inp1, inp2; // 定義輸入與輸出
output rst;
assign rst = inp1 & inp2; // 使用 &(與)運算子
endmodule
該邏輯會取兩個輸入端口的值,若兩個端口的值皆為 1,則將輸出設為 1。這雖是個簡單的例子,但此類程式碼可代表系統中的每個實體,並可進一步組合以定義整個數位電路。典型的基本構件包括加法器、乘法器、計數器、記憶體及狀態機。 一旦設計工程師定義好系統,程式碼就會被傳送至編譯器。若編譯過程未出現錯誤,工程師便可利用編譯結果來測試其系統。
RTL 設計中有兩種類型的運算。第一種是邏輯運算,用於對寄存器中儲存的資料進行位元級的評估與修改。諸如 AND、OR、NOT、XOR 以及位移等邏輯運算,是透過在 HDL 中定義邏輯行為來實現的。上方的範例展示了如何在 VHDL 和 Verilog 中表示 AND 運算。邏輯運算在硬體中對應於邏輯閘。
RTL 設計中的第二類運算屬於算術運算。這些運算會取用寄存器中的資料,並進行加、減、乘、除等運算。在 HDL 中,這些運算以標準的數學運算子來表示。舉例來說,在 VHDL 中要將兩個數相加,會使用以下這行程式碼:
rst <= inp1 + inp2;
— 其中 inp1 和 inp2 是兩個輸入寄存器,而 rst 被賦值給輸出寄存器。RTL 中的算術運算代表專用的物理元件,例如加法器、減法器、乘法器和除法器。
RTL 設計可以以同步或非同步的方式表示資料流。在同步模式下,例程是由傳入該函式的系統時鐘輸入所執行或觸發;在非同步模式下,則是在一個或多個輸入埠的值以特定方式改變時,例程才會被執行。這透過檢查時鐘輸入或非時鐘輸入的輸入值,並使用 if 語句來判斷其是否已改變來實現。
現代的積體電路 (IC) 設計流程,是根據裝置所需功能規格,將其轉化為封裝好的半導體晶片。RTL設計所提供的抽象層級,使工程師能夠專注於系統的高階功能,而無需考慮如何實際實現該設計的具體細節。
積體電路設計 (RTL)流程。RTL 設計在系統規格與電路設計階段之間架起橋樑。
積體電路(IC)設計流程的第一步,是定義系統規格與架構設計。這些資訊會被轉換為 HDL 程式碼。工程師接著利用該程式碼來定義功能與邏輯設計。完成後,設計會被轉換為網表,進而用於建立電路設計,隨後進行其餘的設計流程。
採用 RTL 設計進行的抽象建模,應盡可能在設計流程的早期階段完成——也就是在投入時間與金錢進行實體設計 、實體設計 的驗證,或是實際製造硬體之前。要將 RTL 設計步驟融入流程中,需要初期系統規格的良好整合,以及在 RTL 設計完成時,能將寄存器、運算與資料流轉換為實際電路的強大工具。
RTL 設計流程的目標在於定義並優化積體電路(通常為FPGA 或 ASIC 裝置)的功能。設計工程師會利用 RTL 設計流程,首先定義裝置的邏輯與運作流程,藉此測試並優化系統,隨後將 RTL 定義轉換為網表。以下五個步驟闡述了典型的 RTL 設計方法論。
此流程中的首要任務,是將裝置的規格轉化為 HDL 程式碼,並盡可能減少編輯次數。在大多數情況下,工程師會使用 C 或 C++ 等標準程式語言來描述裝置的預期行為。接著,軟體工具會將軟體模型中的演算法分解為所選的規格語言。對於較簡單的設計,此步驟可以省略;但對於較複雜的設計,此步驟可節省相當大的工作量。
隨後,工程師會編寫或優化程式碼。設計人員則會深入探討特定寄存器的細節、所需的運算操作,以及資料的流動方式。此步驟中的一項重要環節,是運用模組來描述常見的運算操作及系統的特定部分。一旦建立模組,便可在適用的情況下重複使用,這能大幅簡化整體設計的複雜性。
程式碼編寫完成後,便會進入優化階段。此步驟的目標在於提升效能、將功耗降至最低,並縮小設計的實體尺寸。
時序與邏輯模擬:模擬工具用於進行時序分析,並追蹤整個系統中的寄存器值。設計會在寄存器傳輸層級進行驗證,以確保電路中不存在時序問題,且運算結果能產生預期的輸出。設計團隊會在此階段盡早於設計流程中,針對系統中的任何問題(包括電源突變)進行除錯。
功耗估算:系統中的每台裝置都會消耗一定量的電力,設計工程師需要了解實際功耗,並透過反覆調整設計來掌握功耗分布,進而將功耗降至最低。
面積最小化:積體電路中的每個元件都會佔用實體空間,元件之間的佈線亦然。雖然 RTL 設計流程不會考量元件的實體尺寸,但它確實會記錄元件的數量以及元件間連接的複雜程度。
設計優化完成後,必須進行驗證,以確保所有規格均已符合。這是設計流程中至關重要的一環,在設計進入下一階段之前,必須先檢查所有設計需求是否符合。此步驟可透過 RTL 模擬或形式驗證來完成。
RTL 模擬:使用各種軟體工具來動態驗證設計。施加輸入向量後,將產生的輸出向量與預期結果進行比對。輸入與輸出通常以波形呈現,以便設計工程師能直觀地檢視系統的行為。
形式驗證:這是一種靜態驗證流程,透過自動化將一組行為預期轉換為數學演算法,藉此探索 系統的整個運作空間。隨後對結果進行數學評估,以驗證其正確性。
一旦系統設計經過全面驗證,便會透過 RTL 合成,將 RTL 設計的 HDL 程式碼表示形式轉換為閘級網表。這是電子設計自動化(EDA)工具中,負責將生成的原理圖轉換為實體佈局的前端工具。
積體電路可分為兩大類。特定用途積體電路(ASIC)是針對特定應用或任務所量身設計的。一旦製造完成,晶片內的邏輯便無法更改。ASIC 晶片的例子包括記憶體模組、數位語音錄音機、最佳化訊號處理器、微處理器、中央處理器(CPU),甚至像「單晶片系統」這樣複雜的裝置——該系統包含輸入/輸出(I/O)、CPU、記憶體等元件。
現場可程式閘陣列(FPGA )晶片是一種在製造完成後仍可重新編程的半導體晶片。與其將邏輯迴路直接嵌入晶片的結構中,FPGA 採用由邏輯區塊陣列組成,並透過同樣可編程的連接網格相互連接。
在兩種設計流程的第一階段,RTL 設計都扮演著相同的角色。一旦 RTL 合成完成,ASIC 設計 流程便要求工程師規劃並佈局實體電路,此步驟稱為「佈局規劃 」。在FPGA 設計中,RTL 程式碼會直接轉換為網表,該網表清楚掌握可用的邏輯模組,並在「佈局與繞線 」步驟中對這些模組進行配置。
自 1970 年代和 1980 年代起,人們便開始使用硬體描述語言來表示數位系統的預期行為。隨著超大規模積體電路(VLSI)日益普及,此方法廣受青睞,並持續與積體電路設計的進一步發展同步演進。隨著積體電路的特徵尺寸持續縮小、時脈速度不斷提升,以及越來越多的功能被整合到單一晶片中,設計工程師面臨的挑戰也日益增加。
設計複雜度持續攀升,而 RTL 工具也持續迎戰這些挑戰。那些開發設計人員將用於定義下一代積體電路之工具套件的公司,將聚焦於幾個關鍵領域,以提升 RTL 設計流程的易用性、效能與功能。部分重點領域包括: