1. 什麼是 Verilog?概觀與應用案例
Verilog 的基本定義
Verilog 是用於設計數位電路的硬體描述語言(HDL)之一。軟體程式語言用來描述電腦程式,而 Verilog 用來描述數位電路與系統的行為。透過此語言,你可以簡化複雜電路的設計,並有效執行模擬與綜合(轉換成可製造的電路)。 Verilog 於 1984 年開發,並於 1995 年由 IEEE(電機電子工程師學會)標準化。此後持續演進,現在已廣泛應用於 FPGA(現場可程式化門陣列)與 ASIC(特定應用積體電路)設計。
Verilog 在數位電路設計中的角色
數位電路設計是利用電訊號處理資訊的系統建構過程。例子包括智慧手機與電腦內的處理器與記憶體。Verilog 是設計此類數位系統的高效工具。 具體而言,它常用於以下情境:
- FPGA 設計:FPGA 為高度彈性的裝置。Verilog 讓工程師能自由定義 FPGA 功能,並依需求重新編程。
- ASIC 設計:ASIC 為特定應用的專用積體電路。Verilog 使客製化 IC 設計成為可能。
- 模擬:以 Verilog 描述的電路可在軟體中模擬,提前驗證行為,從而及早發現並修正設計錯誤。
本文將教你什麼
本篇文章提供給第一次學習 Verilog 的初學者或複習基礎概念的讀者一步步的說明。主題包括:
- Verilog 的基本語法與基礎概念
- 實作設計範例與除錯技巧
- 有用的資源與工具推薦
適合的讀者族群:
- 想學習 Verilog 或 HDL 的新手
- 正在進行 FPGA 或 ASIC 設計的工程師
- 需要複習基礎知識的設計師或學生

2. Verilog 的基本語法與概念
Verilog 語法與結構
定義與使用模組
在 Verilog 中,最基本的單位是「module」。模組代表電路元件,並包含輸入、輸出與內部結構的描述。以下是一個簡單模組的範例:
module AND_gate (
input wire a, // input a
input wire b, // input b
output wire y // output y
);
assign y = a & b; // AND operation
endmodule
此程式碼對兩個輸入 (a 與 b) 執行 AND 運算,並將結果輸出至 y。模組使用 module 關鍵字定義,最後以 endmodule 結束。
選擇資料型別(wire vs. reg)
Verilog 主要有兩種資料型別:
- wire:代表實體導線,用於連接訊號。
- reg:代表暫存器,用於在時脈事件下儲存值。
範例:
module Example (
input wire clk, // clock input
input wire rst, // reset input
input wire a, // input a
output reg y // output y
);
always @(posedge clk or posedge rst) begin
if (rst)
y <= 0; // output = 0 on reset
else
y <= a; // assign input a to output y on clock edge
end
endmodule
此處 y 必須保留一個值,因此在 always 區塊內使用 reg 型別。
控制結構(if、case)與模擬說明
使用 if 敘述
Verilog 使用 if 進行條件分支:
always @(posedge clk) begin
if (a == 1'b1)
y <= 1'b0; // set y = 0 when a is 1
else
y <= 1'b1; // otherwise set y = 1
end
使用 case 敘述
用於多分支條件:
always @(state) begin
case (state)
2'b00: y = 1'b0;
2'b01: y = 1'b1;
2'b10: y = 1'b0;
2'b11: y = 1'b1;
default: y = 1'bx; // unknown state
endcase
end
初學者必備概念
阻塞與非阻塞指派
Verilog 提供兩種指派類型:
- 阻塞 (
=) :依序執行。 - 非阻塞 (
<=) :同時執行。
範例:
always @(posedge clk) begin
a = b; // blocking
c <= d; // non-blocking
end
平行思考
Verilog 支援平行執行:
always @(posedge clk) begin
a <= b + 1;
end
always @(posedge clk) begin
c <= d - 1;
end
模擬與綜合的差異
- 模擬 :在軟體中驗證行為。
- 綜合 :將設計轉換為硬體。
某些語法如 initial 只能用於模擬。
3. Verilog 的關鍵特性
優勢與其他 HDL 的比較
Verilog 的優勢
- 語法簡潔
- Verilog 類似 C,讓程式設計師容易上手。
- 其基礎元素──模組、資料型別、運算子──直觀易懂。
- 支援廣泛
- 在 Vivado、ModelSim 等 FPGA/ASIC 工具中為標準。
- 擁有龐大的學習社群與資源。
- 彈性的設計方法
- 支援 RTL 設計等多種方法。
Verilog、VHDL 與 SystemVerilog 的比較
| Language | Features | Use Cases |
|---|---|---|
| Verilog | Simplified syntax, low learning cost. Widely used for FPGA/ASIC. | Rapid prototyping, FPGA design |
| VHDL | Strict grammar, supports robust and precise designs. | Mission-critical systems |
| SystemVerilog | Enhanced version of Verilog. Supports advanced testbenches and class-based design. | Advanced verification and system design |
- 與 VHDL 的差異 :VHDL 強調嚴謹語法,而 Verilog 偏好簡潔表達。
- 與 SystemVerilog 的差異 :SystemVerilog 增添了物件導向特性與進階驗證功能。
Verilog 的實務應用案例
Verilog 在 FPGA 設計中的角色
FPGA 為可程式化的積體電路,提供彈性的硬體配置。Verilog 使得高效設計複雜數位邏輯成為可能。主要角色包括:
- 原型設計
- 用於在產品開發早期驗證電路行為。
- 快速原型,且能輕鬆因應規格變更。
- 行為驗證
- 使用 Verilog 進行模擬,可提前發現設計問題。
- 如 ModelSim 等工具讓工程師能建立測試平台並觀察系統行為。
電路模擬的基本流程
Verilog 模擬的一般步驟如下:
- 描述電路
- 使用 Verilog 實作目標電路。
- 建立測試平台
- 測試平台定義驗證電路行為的環境。
- 範例:
module Testbench; reg a, b; wire y; // Instantiate the module under test AND_gate uut ( .a(a), .b(b), .y(y) ); initial begin // Apply test patterns a = 0; b = 0; #10; a = 0; b = 1; #10; a = 1; b = 0; #10; a = 1; b = 1; #10; end endmodule
- 執行模擬
- 在模擬器中執行測試平台,驗證預期行為。
- 分析結果
- 檢視波形輸出並找出設計問題。

4. Verilog 實務設計範例
透過範例 Verilog 程式學習
計數器設計範例(含程式說明)
計數器是數位設計的基本元件。以下是一個根據時脈訊號遞增的簡易計數器:
module Counter (
input wire clk, // clock input
input wire rst, // reset input
output reg [3:0] count // 4-bit counter output
);
always @(posedge clk or posedge rst) begin
if (rst)
count <= 4'b0000; // reset counter to 0
else
count <= count + 1; // increment on rising edge
end
endmodule
說明:
clk控制時序。rst初始化計數器。- 計數器同步於時脈,從 0 增至 15。
FSM(有限狀態機)範例與應用
FSM(有限狀態機)用於設計具有多個狀態的電路。以下是一個包含三個狀態的簡單範例:
module FSM (
input wire clk, // clock input
input wire rst, // reset input
input wire in, // trigger input
output reg [1:0] state // current state
);
// State definitions
localparam STATE0 = 2'b00,
STATE1 = 2'b01,
STATE2 = 2'b10;
always @(posedge clk or posedge rst) begin
if (rst)
state <= STATE0; // initial state
else begin
case (state)
STATE0: state <= (in) ? STATE1 : STATE0;
STATE1: state <= (in) ? STATE2 : STATE0;
STATE2: state <= (in) ? STATE0 : STATE1;
default: state <= STATE0;
endcase
end
end
endmodule
說明:
- 使用
localparam定義狀態。 case依據in處理狀態轉換。- 此結構可套用於控制器或訊號產生電路。
簡易加法器設計(適合初學者)
一個基本的 2 位元加法器:
module Adder (
input wire [1:0] a, // 2-bit input a
input wire [1:0] b, // 2-bit input b
output wire [2:0] sum // 3-bit output to handle carry
);
assign sum = a + b; // addition
endmodule
說明:
- 使用
assign進行組合邏輯。 - 3 位元輸出考慮進位(carry‑out)。
- 這是算術邏輯的基礎構件。
常見問題與解決方案
常見錯誤(模擬與綜合)
- 模擬錯誤
- 症狀: 訊號變成未定義(
x)。 - 原因: 缺少初始化或模組連接錯誤。
- 解決方法: 定義初始值或透過測試平台(testbench)進行初始化。
- 綜合錯誤
- 症狀: 使用不可綜合的語法(例如
initial)。 - 原因: 包含僅供模擬使用的程式碼。
- 解決方法: 使用可綜合的結構(如
always)。
有效使用除錯工具
Verilog 設計需要強大的除錯。常見工具包括:
- 模擬器(例如 ModelSim)
- 觀察訊號行為並透過波形顯示驗證時序。
- 波形檢視器
- 以視覺方式分析輸入/輸出訊號,找出設計問題。
- 除錯訊息
- 使用
$display在模擬期間印出值:initial begin $display("Initial state: %b", state); end

5. Verilog 學習資源與工具
推薦學習資源
書籍與新手教學
對於新手而言,可靠的學習教材相當重要。以下為推薦選項:
- 書籍
- 《Introduction to Digital Design with HDL》
- 解說 Verilog 與 VHDL 的基本概念。
- 《Verilog HDL: A Guide to Digital Design and Synthesis》
- 一本完整的英文書籍,涵蓋從基礎到進階設計。
- 《Digital Design and Verilog HDL Fundamentals》
- 適合初學者至中階學習者,著重於 Verilog 為基礎的設計。
- 線上教學
- YouTube
- 提供英文與日文的免費教學。
- 讓學習者能跟隨實際程式碼學習。
- 網站
- EDA Playground:一個可在瀏覽器執行 Verilog 的環境。
- ASIC World:提供從語法到實務設計範例的教學。
影片課程與實作學習
Udemy
* 如「Verilog for Beginners」與「Learn FPGA Design」等課程,提供結構化內容。Coursera
* 以硬體設計為主的大學級課程。
支援開發的工具
建模工具(ModelSim、Vivado)
ModelSim
領先的 Verilog 模擬工具。
功能:- 介面友善。
- 直觀的波形檢視器,方便除錯。
Vivado
Xilinx 的 FPGA 設計套件。
功能:- 從 RTL 到實作的整合支援。
- 與 Xilinx FPGA 開發板的無縫連接。
選擇與安裝綜合工具
- Quartus Prime
- Intel 的 FPGA 開發套件,提供免費版。
- ISE Design Suite
- 用於較舊的 Xilinx FPGA 裝置。
6. 學習 Verilog 常見問答
初學者該如何開始學習 Verilog?
Question: 我剛開始學習 Verilog。最好的入門方式是什麼?
Answer:
- 從基礎開始
- 先設計簡單的電路,例如 AND/OR 閘。了解基本語法與模組結構是必備的。
- 使用模擬工具
- 像 ModelSim 或 Vivado 之類的工具可協助驗證程式碼。執行模擬能加深理解。
- 使用可靠的資源
- 參考書籍與線上教學以建立堅實基礎(請參考第 5 節的推薦)。
- 嘗試小型專案
- 學完基礎後,嘗試製作 4 位元計數器或簡易 FSM 等小型專案。
我該選擇 VHDL 還是 Verilog?
Question: 我應該學哪種語言—VHDL 還是 Verilog?何時使用各自的語言?
Answer:
- 何時選擇 Verilog
- Verilog 簡潔的語法對初學者友好,特別是有 C 語言背景者。
- 廣泛用於原型設計與 FPGA 開發。
- 何時選擇 VHDL
- 適用於需要嚴格設計驗證的關鍵任務系統。
- 強型別檢查降低設計錯誤的機會。
- 選擇標準
- 學習難易度:Verilog 通常較易上手。
- 專案需求:依設計環境使用的語言而定。
- 工具支援:大多數工具皆支援兩者,但選擇取決於目標 FPGA/ASIC。
初學者常見錯誤與避免方法
Question: 初學者在學習 Verilog 時常犯哪些錯誤,該如何避免?
Answer:
- 缺乏初始化
- 模擬時訊號可能顯示為
x(未定義)。 - 解決方法:務必在測試平台中初始化訊號或設定值。
initial begin signal = 0; // initialize signal end
- 混淆阻塞與非阻塞指派
- 誤用
=(阻塞)與<=(非阻塞)會導致意外行為。 - 解決方法:在時脈觸發的
always區塊中使用非阻塞指派。
- 混合可綜合與僅模擬的程式碼
- 在可綜合邏輯中加入僅模擬的構造(例如
initial)會產生錯誤。 - 解決方法:將可綜合邏輯與僅模擬區塊分開。
- 誤解平行執行
- Verilog 描述的是平行硬體行為,而非順序軟體邏輯。
- 解決方法:了解每個
always區塊是獨立執行的。

7. Verilog 的下一步
檢視 Verilog 學習進度
Review Checklist
- 基礎語法理解:確保能描述模組、資料型別與控制結構。
- 實作設計經驗:計數器、FSM 等設計應能得心應手。
- 工具使用:能以 ModelSim 或 Vivado 進行模擬與除錯。
為下一步做準備
- 若已掌握基礎,即可進入更進階的主題。
- 使用以下步驟擴展技術能力。
進階至 FPGA 設計
學習 FPGA 基礎
FPGA(現場可程式化門陣列)是應用 Verilog 技能最實用的平台之一。
- 準備 FPGA 開發板
- 建議入門板:Basys 3、Nexys A7(Digilent)
- 原因:社群支援度高,且易於與 Vivado 整合。
- 從簡單專案開始
- 先從 LED 閃爍或開關控制電路開始。
- 學習時脈分頻與基本控制邏輯。
- 進一步開發更複雜系統
- 設計多狀態機(FSM)控制器、記憶體介面與整合系統。
轉向 SystemVerilog
為何學習 SystemVerilog?
- SystemVerilog 在 Verilog 基礎上擴充了先進的驗證與物件導向功能。
- 有助於構建複雜的測試平台與大型系統。
學習重點主題
基於類別的測試平台
* 支援隨機測試與覆蓋率分析。使用介面
* 簡化模組之間的通訊。擴充的控制結構
* 學習unique與priority等特性,以提升設計安全性。
於實務專案中實作
加入開源專案
- RISC-V 處理器設計
- 簡易 DSP(數位訊號處理)模組
自行發起專案
- 依個人興趣創作原創設計。
- 例子:數位時鐘、音訊處理器、訊號濾波電路。
推薦的後續學習步驟
掌握進階設計技巧
流水線設計
* 了解高效能處理器所使用的基礎概念。時脈領域的理解
* 精通跨多時脈領域處理訊號的技巧。低功耗設計
* 在實務應用中套用節能的設計方法。


