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 原始碼
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 / time | 8 / 8000ps |
每欄對應下方輸入檔的一個項目。預期組合輸出 y 為 0,0,0,1,1,0,1,1。此圖依輸入順序預測功能,未包含 sampled_y 的更新時間。
查看波形資料
| 訊號 | 波形 | 匯流排值 |
|---|---|---|
| a | 0...1... | |
| b | 0.1.0.1. | |
| sel | 01010101 | |
| y 預期值 | 0..1.01. |
輸入激勵
[
{
"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 測試平台。學習完成標示是學習紀錄,不代表實際模擬結果。
先寫下預期結果
執行模擬器前,先自行計算上述輸入順序的組合輸出 。預期序列為 。這涵蓋全部八組輸入,比只對上最後一個值更有說服力。
暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容輸出在上升緣更新,不是在輸入激勵改變的瞬間更新。分別記錄邊緣前的組合輸出與邊緣後的暫存器輸出。
此處用第 個邊緣取樣的輸入定義邊緣後狀態 ,sampled_y 就對應這個狀態。即使顯示在相同時間座標,也要確認輸入施加與暫存器更新的事件順序。
三項檢查,分辨不同缺陷
- 選擇反相:改成
sel ? a : b前,先預測哪個向量最先失敗。 的向量無法發現這項錯誤。 - 觀察點混淆:若把
sampled_y當成y,立即與組合正解比較,請解釋為何正常電路也會看似失敗。 - 輸出保持檢查:只改變未選定輸入,確認 不變;選定輸入變化時, 則應跟隨。
錯誤報告逐筆記下輸入、觀察時點、預期值與實際值。只寫「波形怪怪的」,無法區分選擇邏輯錯誤與一週期延遲。
延伸作業
資料寬度擴展為 4 位元後,組合輸入空間為 組。仍可窮舉,但先使用 0、最大值、0101、1010 與 walking-one 樣式,快速找出位元位置錯誤。電路改寬時,也需同步更新設定與輸入檔。
自己試試看
在上升緣儲存 的結果後,於下一邊緣前只把 改成 1。求邏輯延遲後的 ,以及下一上升緣前後的 sampled_y。
查看解說
組合輸出 。sampled_y 在下一上升緣前保持 0,於該邊緣儲存 1。此比較假設輸入在取樣所需時間內穩定。