1 / 37 · 概念
RTL:描述併發工作的電路
區分軟體執行順序與硬體並行結構,明確當前狀態、下一狀態和觀察時刻。
單元可免費閱讀,註冊課程即可儲存學習進度。
電路持續工作
RTL 描述數值如何經過組合邏輯在暫存器之間移動。模組是硬體邊界,兩個例項是相互連線的結構,不是先呼叫一個函式再呼叫另一個。輸入改變時電路仍在工作。把數位邏輯電路中的門、儲存和狀態機轉成明確的 SystemVerilog 介面與可重現驗證。實現前應說明每個訊號的位元寬度、驅動來源、有效時刻和重置行為。
分開當前狀態與下一狀態
這個完整模組將無號 4 位 sample 累加到 8 位暫存器。重置同步、高有效,優先於 enable。有致能的時脈邊緣執行加法,其餘時脈邊緣保持 sum,算術按模 256 迴繞。
module accumulator (
input logic clk, rst, enable,
input logic [3:0] sample,
output logic [7:0] sum
);
logic [7:0] next_sum;
assign next_sum = sum + {4'b0000, sample};
always_ff @(posedge clk) begin
if (rst) sum <= 8'b0;
else if (enable) sum <= next_sum;
end
endmodulenext_sum 是組合結果,即使沒有時脈時脈邊緣,sum 或 sample 改變也會改變它。sum 儲存狀態,在上升緣更新。同樣宣告為 logic 不代表相同硬體作用。時脈塊省略最後的 else 表示保持暫存器;組合塊漏賦值則可能要求鎖存器。先看清塊的型別。
模擬前計算時脈邊緣表
每行使用時脈邊緣前的狀態和輸入,在非阻塞更新後觀察結果。
| 時脈邊緣 | rst | enable | sample | 更新前 sum | 更新後 sum |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 未知 | 0 |
| E1 | 0 | 1 | 3 | 0 | 3 |
| E2 | 0 | 0 | 7 | 3 | 3 |
| E3 | 0 | 1 | 5 | 3 | 8 |
| E4 | 1 | 1 | 15 | 8 | 0 |
E4 重置優先,不做加法。舊 sum=250、接受的 sample=10 時,8 位結果是 4。保留第九位意味著改變介面和算術契約。
賦值順序屬於區域,併發屬於結構
組合過程內阻塞賦值 = 按過程順序執行。不同過程及連續賦值作為併發程序排程。時脈過程的非阻塞賦值 <= 用過程執行時可見的值計算右側,再安排更新。原始碼順序不能替代延遲契約。不要在累加器中用 #10 表示等待一個時脈;延遲和時脈發生器屬於後面的通用模擬測試平台。可合成狀態轉移透過時脈邊緣和狀態表達,不是軟體 sleep。
練習:改變一項要求
將循環改為在 255 飽和。顯式擴展兩個運算元後計算 9 位和,位 8 為 1 則存 255,否則存 7:0。保持 reset 與 enable 優先順序。測試 0+0、250+5、250+6、禁用時脈邊緣、同時 reset/enable;期望依次是 0、255、255、保持舊狀態、0。只測 250+5 不能暴露進位丟失,必須包含 250+6。
一起儲存原始碼、時脈邊緣表和期望值。課程完成標記是學習記錄,與模擬執行不同。