40 / 63 · 實作
實作:序列資料移動與位元順序驗證
同時使用位元序列與整數參考模型,驗證方向、遺失位元與重設後延遲。
單元可免費閱讀,註冊課程即可儲存學習進度。
實驗對象與觀察條件
每個上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容,舊 q 的低兩位向左移,din 進入 bit 0。依序輸入 1、0、1、1,比較移動過程。
開始之前
請準備 Digital Design Studio Desktop 專案與有效執行權限。各範例存於獨立資料夾的 rtl/top.sv。
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 port | rst · Active high · 1 cycle |
| Maximum cycles / time | 5 / 5000ps |
輸入激勵
[
{
"inputs": {
"din": [
false
]
}
},
{
"inputs": {
"din": [
true
]
}
},
{
"inputs": {
"din": [
false
]
}
},
{
"inputs": {
"din": [
true
]
}
},
{
"inputs": {
"din": [
true
]
}
}
]每欄是一次上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容的觀察紀錄。輸入為邊緣前值,名稱含「後」的狀態為更新後值。欄位對齊表示取樣順序,並未繪出實體傳播延遲傳播延遲是輸入改變後,輸出穩定至正確值所需的時間。邏輯式是否等價與時間特性是兩個不同問題。 詳細內容。
第一欄為重設重設將狀態回復至規格指定的初始值。必須一併定義它是同步或非同步,以及是否優先於其他控制訊號。 詳細內容邊緣,din=0 不計為已儲存資料。請將後續四次輸入與 JSON 順序比較。
查看波形資料
| 訊號 | 波形 | 匯流排值 |
|---|---|---|
| 邊緣 | 23452 | E0 → E1 → E2 → E3 → E4 |
| reset | 10... | |
| din | 0101. | |
| q 後 | 23452 | 000 → 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;相同位元序列的帶符號解讀可能得到不同數值。 詳細內容 整數的參考模型。
重設後輸入 1、0、1、1,計算為 。寫成 3 位元二進位後,應與練習波形相同。最後一步 ,只留低三位,所以變成 3。
| 已接收位元數 | 輸入 | 邊緣後 q | 整數值 |
|---|---|---|---|
| 0 | 重設 | 000 | 0 |
| 1 | 1 | 001 | 1 |
| 2 | 0 | 010 | 2 |
| 3 | 1 | 101 | 5 |
| 4 | 1 | 011 | 3 |
reset=0、enable=1 時依序選 din=1,0,1,1,每次按時脈,q 會成為 001,010,101,011。先以步進練習預測,再與實際 RTL 結果比較。enable 控制也用於下方延伸作業的暫停測試。
同步 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 樣式,可能漏掉錯誤方向。
三階暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容中,輸入首次儲存的邊緣為 ,則在 邊緣後到達最高位 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 週期則增加實際經過時間。