2 / 37 · 概念
訊號與連接埠:寬度、方向與時間的契約
閱讀介面,分開定義組合輸出與狀態輸出的驗證基準。
單元可免費閱讀,註冊課程即可儲存學習進度。
把連接埠列表當成電路契約閱讀
input logic [7:0] data 表示同時傳送 8 位元的連接埠,不是依序到達八個值。logic 型別本身也不會產生儲存元件。由組合指定驅動,還是由邊緣觸發的循序區塊驅動,才決定硬體行為。
閱讀訊號時,除了寬度與方向,也應確認何時有效、由誰驅動、重設後是什麼值。缺少這些資訊,即使各模組單獨正確,連接後的系統也可能錯誤。
同一個 MUX 也有兩種輸出
本課程的練習同時觀察選擇結果 y,以及儲存它的 sampled_y。
第一式是組合功能,第二式是儲存邊緣前穩定 y 的理想同步模型。若無條件將兩個輸出與同一瞬間的輸入比較,就會把正常暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容誤判為錯誤。
assign y = sel ? b : a;
always_ff @(posedge clk) sampled_y <= y;模擬器在同一個時間值內仍有事件處理順序。實際元件則有 setup建立時間(setup)是輸入資料在時脈擷取邊緣之前,必須保持穩定的最短時間。若違反此條件,便無法保證儲存結果。 詳細內容/hold 與 clock-to-Q 延遲。這兩式不是消除差異,而是功能驗證中明確指定觀察時間的起點。
箭頭表示資料相依性。a、b、sel 改變後,組合輸出 y 先改變,但 sampled_y 只在上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容儲存新值。
- a · b · sel: 同時給定的輸入
- MUX → y: 依目前選擇線計算
- DFF → sampled_y: 在上升緣儲存 y
審查時應確認的問題
- sel 是確定為 0/1 的輸入,還是外部非同步訊號?
- y 改變後,是否在下一個有效邊緣之後才與 sampled_y 比較?
- sampled_y 的初值由重設重設將狀態回復至規格指定的初始值。必須一併定義它是同步或非同步,以及是否優先於其他控制訊號。 詳細內容決定,還是採用工具的初始化設定?
本練習的明確初值是為了建立可重現的 0/1 模型,不能解讀成保證實際晶片的上電行為。
自己試試看
在兩個時脈邊緣之間,a 從 0 變成 1,sel 保持 0。y 與 sampled_y 分別何時改變?
查看解說
組合輸出 y 在對應組合路徑求值或傳播後改變。sampled_y 在下一個擷取該值的上升緣更新。邊緣附近的輸入變化在實際電路涉及 setup/hold,不能僅憑這個簡化模型斷定安全。