Altifigence Academy

25 / 63 · 實作

實作:MUX 窮舉檢查與暫存輸出分析

將相同輸入套用到組合路徑與暫存器路徑,以真值表與取樣時點驗證結果。

實驗對象與觀察條件

sel=0 時,a 輸出到 y;sel=1 時則輸出 b。sampled_y 儲存時脈上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容的 y。即使輸入改變,sampled_y 仍保持至下一上升緣。

開始之前

請準備 Digital Design Studio Desktop 專案與有效的執行權限。每個範例存於獨立資料夾的 rtl/top.sv。

先讓 a 與 b 不同。確認 sel=0 選 a、sel=1 選 b,再與輸入檔每列對照。

親自切換選擇路徑

y = sel ? b : a

SystemVerilog 原始碼

SystemVerilog
module top (
    input logic clk,
    input logic a,
    input logic b,
    input logic sel,
    output logic y,
    output logic sampled_y
);
    assign y = sel ? b : a;
    // Explicit observation register: y remains purely combinational.
    // The register makes this design eligible for logic-netlist-1 simulation.
    always_ff @(posedge clk) sampled_y <= y;
endmodule

執行方式

在 New analysis 選擇 Two-state single-clock v1。Clock port 設為 clk,週期為 1000ps。以下列設定完成 Preflight,再執行 Run RTL simulation 並比較結果。

設定值
暫存器初值,從 LSB 起[false]
Reset port留空
Maximum cycles / time8 / 8000ps

每欄對應下方輸入檔的一個項目。預期組合輸出 y 為 0,0,0,1,1,0,1,1。此圖依輸入順序預測功能,未包含 sampled_y 的更新時間。

一次查看輸入 JSON 的八種組合
查看波形資料
波形資料:每個字元表示一個區間;句點保持先前狀態;p 表示一個時脈週期。
訊號波形匯流排值
a0...1...
b0.1.0.1.
sel01010101
y 預期值0..1.01.

輸入激勵

json
[
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  }
]

結果比較

8 cycles · y=1 · sampled_y=1。請確認 3000ps 時 y=1、sampled_y=0。

本練習使用 0/1 單一時脈 RTL,不含 #delay、initial、X/Z 測試平台。學習完成標示是學習紀錄,不代表實際模擬結果。

先寫下預期結果

執行模擬器前,先自行計算上述輸入順序的組合輸出 yy。預期序列為 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1。這涵蓋全部八組輸入,比只對上最後一個值更有說服力。

暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容輸出在上升緣更新,不是在輸入激勵改變的瞬間更新。分別記錄邊緣前的組合輸出與邊緣後的暫存器輸出。

qk+1=sk‾ak+skbkq_{k+1}=\overline{s_k}a_k+s_kb_k

此處用第 kk 個邊緣取樣的輸入定義邊緣後狀態 qk+1q_{k+1},sampled_y 就對應這個狀態。即使顯示在相同時間座標,也要確認輸入施加與暫存器更新的事件順序。

三項檢查,分辨不同缺陷

  1. 選擇反相:改成 sel ? a : b 前,先預測哪個向量最先失敗。a=ba=b 的向量無法發現這項錯誤。
  2. 觀察點混淆:若把 sampled_y 當成 y,立即與組合正解比較,請解釋為何正常電路也會看似失敗。
  3. 輸出保持檢查:只改變未選定輸入,確認 yy 不變;選定輸入變化時,yy 則應跟隨。

錯誤報告逐筆記下輸入、觀察時點、預期值與實際值。只寫「波形怪怪的」,無法區分選擇邏輯錯誤與一週期延遲。

延伸作業

資料寬度擴展為 4 位元後,組合輸入空間為 24+4+1=5122^{4+4+1}=512 組。仍可窮舉,但先使用 0、最大值、0101、1010 與 walking-one 樣式,快速找出位元位置錯誤。電路改寬時,也需同步更新設定與輸入檔。

自己試試看

在上升緣儲存 a=0,b=1,s=0a=0,b=1,s=0 的結果後,於下一邊緣前只把 ss 改成 1。求邏輯延遲後的 yy,以及下一上升緣前後的 sampled_y。

查看解說

組合輸出 y=1y=1。sampled_y 在下一上升緣前保持 0,於該邊緣儲存 1。此比較假設輸入在取樣所需時間內穩定。

Lesson files

mux-top.sv ↓mux-inputs.json ↓

此選擇適用於本瀏覽器,隨時可從頁尾變更。