Altifigence Academy

40 / 63 · 實作

實作:序列資料移動與位元順序驗證

同時使用位元序列與整數參考模型,驗證方向、遺失位元與重設後延遲。

實驗對象與觀察條件

每個上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容,舊 q 的低兩位向左移,din 進入 bit 0。依序輸入 1、0、1、1,比較移動過程。

開始之前

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

SystemVerilog 原始碼

SystemVerilog
module top (
    input logic clk,
    input logic rst,
    input logic din,
    output logic [2:0] q
);
    // Old q[1:0] and din are captured together at each rising edge.
    always_ff @(posedge clk)
        if (rst) q <= 3'b000;
        else q <= {q[1:0], din};
endmodule

執行方式

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

設定值
暫存器初值,從 LSB 起[false,false,false]
Reset portrst · Active high · 1 cycle
Maximum cycles / time5 / 5000ps

輸入激勵

json
[
  {
    "inputs": {
      "din": [
        false
      ]
    }
  },
  {
    "inputs": {
      "din": [
        true
      ]
    }
  },
  {
    "inputs": {
      "din": [
        false
      ]
    }
  },
  {
    "inputs": {
      "din": [
        true
      ]
    }
  },
  {
    "inputs": {
      "din": [
        true
      ]
    }
  }
]

每欄是一次上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容的觀察紀錄。輸入為邊緣前值,名稱含「後」的狀態為更新後值。欄位對齊表示取樣順序,並未繪出實體傳播延遲傳播延遲是輸入改變後,輸出穩定至正確值所需的時間。邏輯式是否等價與時間特性是兩個不同問題。 詳細內容。
第一欄為重設重設將狀態回復至規格指定的初始值。必須一併定義它是同步或非同步,以及是否優先於其他控制訊號。 詳細內容邊緣,din=0 不計為已儲存資料。請將後續四次輸入與 JSON 順序比較。

輸入激勵與三個位元的狀態移動
查看波形資料
波形資料:每個字元表示一個區間;句點保持先前狀態;p 表示一個時脈週期。
訊號波形匯流排值
邊緣23452E0 → E1 → E2 → E3 → E4
reset10...
din0101.
q 後23452000 → 001 → 010 → 101 → 011

結果比較

5 cycles · q=011。每個上升緣依序為 000 → 001 → 010 → 101 → 011。

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

用獨立算式檢查串接運算

把 RTL 中的串接運算串接運算將位元序列相鄰接合。結果位寬等於各運算元位寬的總和,與數值加法不同。 詳細內容直接複製成測試答案,可能把同一錯誤放進兩處。試用解讀為 unsigned無符號(unsigned)將位元序列解讀為非負整數。n 位元範圍為 0 至 2^n−1;相同位元序列的帶符號解讀可能得到不同數值。 詳細內容 整數的參考模型。

Qk+1=(2Qk+dk) mod 8Q_{k+1}=(2Q_k+d_k)\bmod 8

重設後輸入 1、0、1、1,計算為 0→1→2→5→30\to1\to2\to5\to3。寫成 3 位元二進位後,應與練習波形相同。最後一步 2⋅5+1=112\cdot5+1=11,只留低三位,所以變成 3。

已接收位元數輸入邊緣後 q整數值
0重設0000
110011
200102
311015
410113

reset=0、enable=1 時依序選 din=1,0,1,1,每次按時脈,q 會成為 001,010,101,011。先以步進練習預測,再與實際 RTL 結果比較。enable 控制也用於下方延伸作業的暫停測試。

執行 RTL 前,先自行預測位元順序

同步 reset 優先於 enable。enable=0 時,保持已儲存的值。 q=000; q_next = (2q + din) mod 8

追蹤單一位元驗證方向

重設後送入一次 1,再送三次 0。狀態為 001 → 010 → 100 → 000。第一個 1 應依序經過 bit 0、bit 1、bit 2 後消失。若只用全 0 或全 1 樣式,可能漏掉錯誤方向。

三階暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容中,輸入首次儲存的邊緣為 kk,則在 k+2k+2 邊緣後到達最高位 bit 2。若從外部傳送暫存器送出資料的邊緣計算,基準便不同,因此報告須明列起點與終點。

延伸作業:只移動有效輸入

假設加入 valid。valid=0 時保持 q 的設計,與每週期移動且另傳 valid 位元的管線不同。前者按已接收位元數移動,後者按實際時脈週期移動,不能用同一預期狀態序列驗證兩者。

自己試試看

重設後 valid=1 的位元依序為 1、0、1。第二位之前與之後各有一個 valid=0 週期,invalid 時保持 q。說明最後 q 與第一個 1 到達 bit 2 的時點。

查看解說

只有三次有效輸入改變狀態,最後 q=101。第一個 1 在第三個有效輸入儲存的邊緣到達 bit 2。第一次擷取後還需兩次移動,中間兩個 invalid 週期則增加實際經過時間。

Lesson files

shift-top.sv ↓shift-inputs.json ↓

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