# Verilog 運算子與變數型態 ## 1. 變數型態 ### (1) Net 類型 - 表示電路中導線的連接 - 只能透過 `assign` 賦值,不能於 `always` 或 `initial` 區塊中改變 | 類型 | 說明 | |:--------------------- |:--------------------------------------- | | `wire` | 導線,需由驅動源驅動 (ex: assign) | | `tri` | 三態導線,可多驅動 | | `tri0` / `tri1` | 預設為 0 或 1 的三態導線 | | `wand` | 有線與 (wired-AND),多驅動源以 AND 輸出 | | `wor` | 有線或 (wired-OR),多驅動源以 OR 輸出 | | `supply0` / `supply1` | 強制為 0 或 1 的供電線 | ### (2) Reg 類型 - 用於 `always` 或 `initial` 區塊中 - 表示暫存資料或循序邏輯 ==暫存器== | 類型 | 說明 | |:--------- |:-------------------------- | | `reg` | 暫存器,用於組合或循序邏輯 | | `integer` | 32 位元整數 (模擬用) | | `real` | 浮點數 (模擬用) | | `time` | 64 位元無號時間 (模擬用) | ### (3) 常數宣告 - `parameter name = value`:模組內常數 - `` `define name value``:全域巨集,不可覆寫 --- ## 2. 賦值運算子 ### (1) Net 類型 - ==**`assign <net> = <expression>;`**== - 將等式右側的電路輸出連接至 **`<net>`** :::info #### ex: ```verilog= wire a, b, y; assign y = a & b; ``` ::: ### (2) Reg 類型 1. **阻塞賦值 (blocking assignment):==`<reg> = <expression>`==** - **適合==組合邏輯電路==** - **按照程式碼順序==由上至下執行==** - **電路意義:將電路輸出直接連接 `reg`** :::info #### ex: ```verilog= reg a, b, y; always @(*) begin b = a; y = b; end ``` ```mermaid flowchart LR A["<BR><BR>reg<BR>a<BR><BR><BR>"] B["<BR><BR>reg<BR>b<BR><BR><BR>"] C["<BR><BR>reg<BR>c<BR><BR><BR>"] null([" "]):::empty A -->|"a"| B B -->|"b"| C C -->|"c"| null classDef empty fill:#fff, stroke:#fff; ``` 1. `a` 先把值丟給 `b` 2. `b` 再把值丟給 `y` 3. 最後,**`b = a`**、**`y = a`** ::: 2. **非阻塞賦值 (non-blocking assignment):==`<reg> <= <expression>`==** - **適合==循序邏輯電路==** - **在程式碼中會==同步執行==** - **電路意義:** - 將電路輸出連接到 **D型正反器**,再連接到 **`reg`** - 當 D 型正反器的資料準備好,非阻塞賦值會 **==同時賦值==** :::info #### ex: ```verilog= reg a, b, y; always @(*) begin b <= a; y <= b; end ``` ```mermaid flowchart LR subgraph AA[" "] A["<BR><BR>reg<BR>a"]:::reg D1["<BR><BR>DFF1"]:::DFF A --"a"--> D1 end subgraph BB[" "] B["<BR><BR>reg<BR>b"]:::reg D2["<BR><BR>DFF2"]:::DFF B --"b"--> D2 end C["<BR><BR>reg<BR>c"]:::reg D1 --"prev_a"--> B D2 --"prev_b"--> C classDef reg height:180; classDef DFF height:160px; ``` 1. 兩行程式會同時進行 1. `b = a`、`y = b` 會一起運作 2. 最後,**`b = a`**、**`y = 原本的 b`** ::: ### ● 賦值運算子比較 | 類型 | 語法 | 電路對應 | 備註 | |:------------ |:---------- |:----------------------- |:---------------------------- | | **`assign`** | 連接 net | **組合邏輯** | 立即反映輸入變化 | | **`=`** | 阻塞賦值 | **組合邏輯 (模擬順序)** | 適用 `always @(*)` | | **`<=`** | 非阻塞賦值 | **循序邏輯 (DFF)** | 適用 `always @(posedge clk)` | ### ● 複合運算子 :::success | 加減乘除 | 功能 | | 邏輯運算 | 功能 | |:------------:|:---------------:|:---:|:-------------:|:----------------:| | **`a += b`** | **`a = a + b`** | | **`a &= b`** | **`a = a & b`** | | **`a -= b`** | **`a = a - b`** | | **`a \|= b`** | **`a = a \| b`** | | **`a *= b`** | **`a = a * b`** | | **`a ^= b`** | **`a = a ^ b`** | | **`a /= b`** | **`a = a / b`** | | | | | **`a %= b`** | **`a = a % b`** | | | | ::: ## 3. 邏輯運算子 ### ● 邏輯 vs 位元運算子 :::success | 邏輯運算子 | 功能 (回傳 **`True`**/**`False`**) | 位元運算子 | 功能 (回傳 **運算結果**) | |:--------------:|:-------------------------------------------------:|:------------:|:-------------------------------------:| | **`a && b`** | **當 `a` 和 `b` 有數值 → `True`** | **`a & b`** | **`a`, `b` 每個位元做 AND 運算** | | **`a \|\| b`** | **當 `a` 或 `b` 有數值 → `True`** | **`a \| b`** | **`a`, `b` 每個位元做 OR 運算** | | **`!a`** | **當 `a` 有數值 → `False`** | **`~a`** | **`a` 每個位元做 NOT 運算** | ::: ### ● 邏輯條件運算子 :::success | 運算子 | 功能 | |:---------:|:------------------------------------------------------:| | **`==`** | **判斷是否相等,不考慮狀態 `x`、`z`** | | **`!=`** | **判斷是否不相等,不考慮狀態 `x`、`z`** | | **`===`** | **(嚴格) 判斷是否相等,考慮狀態 `x`、`z`** | | **`!==`** | **(嚴格) 判斷是否不相等,考慮狀態 `x`、`z`** | ::: ## 4. 其他指令 ### ● 延遲 :::success | 功能|範例|說明| | :-: | :-: | :-: | | **延遲** | **`#10;`** | **延遲 10 time units (模擬用,不可合成)** | ::: ### ● 巨集 (Macro) :::success |指令| 功能| |:-: | :-: | | **`` `define``** | **定義巨集** | | **`` `ifdef``** | **條件編譯:若定義了某巨集則編譯** | | **`` `ifndef``** | **條件編譯:若未定義某巨集則編譯** | | **`` `include``** | **匯入其他 Verilog 檔案** | ::: ### ● 系統指令 (System Tasks/Functions) :::success | 指令 | 功能 | |:----------------------------------- |:------------------------------------------------- | | **`$bits(<signal>)`** | **回傳輸入訊號的位元寬度** | | **`$display(...)`** | **類似 C 語言的 `printf`** | | **`$finish;`** | **結束模擬,立即停止並退出** | | **`$stop;`** | **暫停模擬 (進入互動除錯模式,若模擬器支援)** | | **`$time`** | **回傳目前模擬時間** | | **`$random`** | **產生一個隨機整數 (模擬用,不可合成)** | | **`$fsdbDumpfile("xxx.fsdb")`** | **設定波形儲存檔案名稱 (通常搭配 Verdi 使用)** | | **`$fsdbDumpvars;`** | **開始將變數變化記錄至 `.fsdb` 檔案** | ::: ---
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up