---
# System prepended metadata

title: 01. Verilog 基本架構
tags: [語法教學, Verilog]

---

# Verilog 基本架構

## ● 介紹

> [!Note] **module(模組)：是電路設計的最高層功能單元**
> - 一個 **module** 可視為 ==**解決特定功能的 IC**==  
> - 每個 module 可以有多個 **==輸入(input)==** 與 **==輸出(output)==**  
> - **電路設計的核心概念**：
>   - **以多個 module 透過 ==`assign`(連接訊號)== 組合成完整電路**  
>

> [!Note] **block(區塊)：是實作 module 功能的基本單位**
> - 把 **module** 再細分就是 **==block(區塊)==**  
> - module 解決的大問題通常可 ==拆成多個小問題==, 由不同 block 處理  
> - block 定義了 **==輸入與輸出之間的邏輯關係==**  
> - block 分為兩類:  
>   1. **==Combinational logic(組合邏輯)==**  
>   2. **==Sequential logic(循序邏輯)==**  


> [!Note] **input(輸入) 與 output(輸出)：輸出必須唯一, 輸入可共用**
> - 相同的 **輸入** 可以 ==**提供給多個 block 使用**==  
> - 相同的 **輸出** ==**只能由一個 block 定義**==  
> 

> [!Tip] **良好的撰寫風格：模組化思維能提升電路可讀性與可維護性**
> - 先分析 module 的功能  
> - 再將其拆解成多個 **解決特定子問題的 block**  
> - 最後用 `assign` 或 `always` 敘述把各 block 連接起來  

---

## ● module 宣告方式1
- **先定義 ==接腳順序==，後定義 ==接腳輸入/輸出==：**
```verilog=
module module_name(net1, net2, /*...*/);
    // 輸入/輸出 敘述
    // 變數設定  敘述
    // 電路設計  敘述
endmodule
```

## ● module 宣告方式2
- **一併定義==接腳順序==、==接腳輸入/輸出==：**
```verilog=
module module_name( // 輸入/輸出 敘述
    //<輸入/輸出> <net1>,
    //<輸入/輸出> <net2>,
    //...
    //<輸入/輸出> <net>
);
    // 變數設定  敘述
    // 電路設計  敘述
endmodule
```

---
