Verilog 入門:基礎、語法、設計範例與初學者學習資源

目次

1. 什麼是 Verilog?概觀與應用案例

Verilog 的基本定義

Verilog 是用於設計數位電路的硬體描述語言(HDL)之一。軟體程式語言用來描述電腦程式,而 Verilog 用來描述數位電路與系統的行為。透過此語言,你可以簡化複雜電路的設計,並有效執行模擬與綜合(轉換成可製造的電路)。 Verilog 於 1984 年開發,並於 1995 年由 IEEE(電機電子工程師學會)標準化。此後持續演進,現在已廣泛應用於 FPGA(現場可程式化門陣列)與 ASIC(特定應用積體電路)設計。

Verilog 在數位電路設計中的角色

數位電路設計是利用電訊號處理資訊的系統建構過程。例子包括智慧手機與電腦內的處理器與記憶體。Verilog 是設計此類數位系統的高效工具。 具體而言,它常用於以下情境:

  • FPGA 設計:FPGA 為高度彈性的裝置。Verilog 讓工程師能自由定義 FPGA 功能,並依需求重新編程。
  • ASIC 設計:ASIC 為特定應用的專用積體電路。Verilog 使客製化 IC 設計成為可能。
  • 模擬:以 Verilog 描述的電路可在軟體中模擬,提前驗證行為,從而及早發現並修正設計錯誤。

本文將教你什麼

本篇文章提供給第一次學習 Verilog 的初學者或複習基礎概念的讀者一步步的說明。主題包括:

  1. Verilog 的基本語法與基礎概念
  2. 實作設計範例與除錯技巧
  3. 有用的資源與工具推薦

適合的讀者族群:

  • 想學習 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

此程式碼對兩個輸入 (ab) 執行 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 的優勢

  1. 語法簡潔
  • Verilog 類似 C,讓程式設計師容易上手。
  • 其基礎元素──模組、資料型別、運算子──直觀易懂。
  1. 支援廣泛
  • 在 Vivado、ModelSim 等 FPGA/ASIC 工具中為標準。
  • 擁有龐大的學習社群與資源。
  1. 彈性的設計方法
  • 支援 RTL 設計等多種方法。

Verilog、VHDL 與 SystemVerilog 的比較

LanguageFeaturesUse Cases
VerilogSimplified syntax, low learning cost. Widely used for FPGA/ASIC.Rapid prototyping, FPGA design
VHDLStrict grammar, supports robust and precise designs.Mission-critical systems
SystemVerilogEnhanced 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 使得高效設計複雜數位邏輯成為可能。主要角色包括:

  1. 原型設計
  • 用於在產品開發早期驗證電路行為。
  • 快速原型,且能輕鬆因應規格變更。
  1. 行為驗證
  • 使用 Verilog 進行模擬,可提前發現設計問題。
  • 如 ModelSim 等工具讓工程師能建立測試平台並觀察系統行為。

電路模擬的基本流程

Verilog 模擬的一般步驟如下:

  1. 描述電路
  • 使用 Verilog 實作目標電路。
  1. 建立測試平台
  • 測試平台定義驗證電路行為的環境。
  • 範例:
    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
    
  1. 執行模擬
  • 在模擬器中執行測試平台,驗證預期行為。
  1. 分析結果
  • 檢視波形輸出並找出設計問題。

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

說明:

  1. clk 控制時序。
  2. rst 初始化計數器。
  3. 計數器同步於時脈,從 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

說明:

  1. 使用 localparam 定義狀態。
  2. case 依據 in 處理狀態轉換。
  3. 此結構可套用於控制器或訊號產生電路。

簡易加法器設計(適合初學者)

一個基本的 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

說明:

  1. 使用 assign 進行組合邏輯。
  2. 3 位元輸出考慮進位(carry‑out)。
  3. 這是算術邏輯的基礎構件。

常見問題與解決方案

常見錯誤(模擬與綜合)

  1. 模擬錯誤
  • 症狀: 訊號變成未定義(x)。
  • 原因: 缺少初始化或模組連接錯誤。
  • 解決方法: 定義初始值或透過測試平台(testbench)進行初始化。
  1. 綜合錯誤
  • 症狀: 使用不可綜合的語法(例如 initial)。
  • 原因: 包含僅供模擬使用的程式碼。
  • 解決方法: 使用可綜合的結構(如 always)。

有效使用除錯工具

Verilog 設計需要強大的除錯。常見工具包括:

  1. 模擬器(例如 ModelSim)
  • 觀察訊號行為並透過波形顯示驗證時序。
  1. 波形檢視器
  • 以視覺方式分析輸入/輸出訊號,找出設計問題。
  1. 除錯訊息
  • 使用 $display 在模擬期間印出值:
    initial begin
        $display("Initial state: %b", state);
    end
    

5. Verilog 學習資源與工具

推薦學習資源

書籍與新手教學

對於新手而言,可靠的學習教材相當重要。以下為推薦選項:

  1. 書籍
  • 《Introduction to Digital Design with HDL》
    • 解說 Verilog 與 VHDL 的基本概念。
  • 《Verilog HDL: A Guide to Digital Design and Synthesis》
    • 一本完整的英文書籍,涵蓋從基礎到進階設計。
  • 《Digital Design and Verilog HDL Fundamentals》
    • 適合初學者至中階學習者,著重於 Verilog 為基礎的設計。
  1. 線上教學
  • YouTube
    • 提供英文與日文的免費教學。
    • 讓學習者能跟隨實際程式碼學習。
  • 網站
    • EDA Playground:一個可在瀏覽器執行 Verilog 的環境。
    • ASIC World:提供從語法到實務設計範例的教學。

影片課程與實作學習

  1. Udemy
    * 如「Verilog for Beginners」與「Learn FPGA Design」等課程,提供結構化內容。

  2. Coursera
    * 以硬體設計為主的大學級課程。

支援開發的工具

建模工具(ModelSim、Vivado)

  1. ModelSim
    領先的 Verilog 模擬工具。
    功能:

    • 介面友善。
    • 直觀的波形檢視器,方便除錯。
  2. Vivado
    Xilinx 的 FPGA 設計套件。
    功能:

    • 從 RTL 到實作的整合支援。
    • 與 Xilinx FPGA 開發板的無縫連接。

選擇與安裝綜合工具

  1. Quartus Prime
  • Intel 的 FPGA 開發套件,提供免費版。
  1. ISE Design Suite
  • 用於較舊的 Xilinx FPGA 裝置。

6. 學習 Verilog 常見問答

初學者該如何開始學習 Verilog?

Question: 我剛開始學習 Verilog。最好的入門方式是什麼?

Answer:

  1. 從基礎開始
  • 先設計簡單的電路,例如 AND/OR 閘。了解基本語法與模組結構是必備的。
  1. 使用模擬工具
  • 像 ModelSim 或 Vivado 之類的工具可協助驗證程式碼。執行模擬能加深理解。
  1. 使用可靠的資源
  • 參考書籍與線上教學以建立堅實基礎(請參考第 5 節的推薦)。
  1. 嘗試小型專案
  • 學完基礎後,嘗試製作 4 位元計數器或簡易 FSM 等小型專案。

我該選擇 VHDL 還是 Verilog?

Question: 我應該學哪種語言—VHDL 還是 Verilog?何時使用各自的語言?

Answer:

  1. 何時選擇 Verilog
  • Verilog 簡潔的語法對初學者友好,特別是有 C 語言背景者。
  • 廣泛用於原型設計與 FPGA 開發。
  1. 何時選擇 VHDL
  • 適用於需要嚴格設計驗證的關鍵任務系統。
  • 強型別檢查降低設計錯誤的機會。
  1. 選擇標準
  • 學習難易度:Verilog 通常較易上手。
  • 專案需求:依設計環境使用的語言而定。
  • 工具支援:大多數工具皆支援兩者,但選擇取決於目標 FPGA/ASIC。

初學者常見錯誤與避免方法

Question: 初學者在學習 Verilog 時常犯哪些錯誤,該如何避免?

Answer:

  1. 缺乏初始化
  • 模擬時訊號可能顯示為 x(未定義)。
  • 解決方法:務必在測試平台中初始化訊號或設定值。
    initial begin
        signal = 0; // initialize signal
    end
    
  1. 混淆阻塞與非阻塞指派
  • 誤用 =(阻塞)與 <=(非阻塞)會導致意外行為。
  • 解決方法:在時脈觸發的 always 區塊中使用非阻塞指派。
  1. 混合可綜合與僅模擬的程式碼
  • 在可綜合邏輯中加入僅模擬的構造(例如 initial)會產生錯誤。
  • 解決方法:將可綜合邏輯與僅模擬區塊分開。
  1. 誤解平行執行
  • Verilog 描述的是平行硬體行為,而非順序軟體邏輯。
  • 解決方法:了解每個 always 區塊是獨立執行的。

7. Verilog 的下一步

檢視 Verilog 學習進度

Review Checklist

  • 基礎語法理解:確保能描述模組、資料型別與控制結構。
  • 實作設計經驗:計數器、FSM 等設計應能得心應手。
  • 工具使用:能以 ModelSim 或 Vivado 進行模擬與除錯。

為下一步做準備

  • 若已掌握基礎,即可進入更進階的主題。
  • 使用以下步驟擴展技術能力。

進階至 FPGA 設計

學習 FPGA 基礎

FPGA(現場可程式化門陣列)是應用 Verilog 技能最實用的平台之一。

  1. 準備 FPGA 開發板
  • 建議入門板:Basys 3、Nexys A7(Digilent)
  • 原因:社群支援度高,且易於與 Vivado 整合。
  1. 從簡單專案開始
  • 先從 LED 閃爍或開關控制電路開始。
  • 學習時脈分頻與基本控制邏輯。
  1. 進一步開發更複雜系統
  • 設計多狀態機(FSM)控制器、記憶體介面與整合系統。

轉向 SystemVerilog

為何學習 SystemVerilog?

  • SystemVerilog 在 Verilog 基礎上擴充了先進的驗證與物件導向功能。
  • 有助於構建複雜的測試平台與大型系統。

學習重點主題

  1. 基於類別的測試平台
    * 支援隨機測試與覆蓋率分析。

  2. 使用介面
    * 簡化模組之間的通訊。

  3. 擴充的控制結構
    * 學習 uniquepriority 等特性,以提升設計安全性。

於實務專案中實作

加入開源專案

  • RISC-V 處理器設計
  • 簡易 DSP(數位訊號處理)模組

自行發起專案

  • 依個人興趣創作原創設計。
  • 例子:數位時鐘、音訊處理器、訊號濾波電路。

推薦的後續學習步驟

掌握進階設計技巧

  1. 流水線設計
    * 了解高效能處理器所使用的基礎概念。

  2. 時脈領域的理解
    * 精通跨多時脈領域處理訊號的技巧。

  3. 低功耗設計
    * 在實務應用中套用節能的設計方法。