Interface 與 Modport:把匯流排變成型別#
為什麼需要 interface#
現代匯流排協定的訊號數量驚人:一個簡化的握手通道有 valid/ready 兩條,一個 AXI4-Lite 的寫通道就有 awvalid/awready/awaddr/awprot/awwvalid/awwready/awwdata/awwstrb 等十餘條,完整的 AXI4 超過五十條。在 Verilog 中,這些訊號在每個模組的 port 清單、每個頂層連線處都要攤平重寫一次;改一個協定欄位,所有相關檔案同步修改,漏一處就是 bug。
interface 的解法是把「一組邏輯上相關的訊號」打包成一個型別:
interface Bus {
var vld: logic;
var rdy: logic;
var data: logic<32>;
modport m {
vld: output,
rdy: input,
data: output,
}
modport s {
vld: input,
rdy: output,
data: input,
}
}
interface Bus { ... }宣告一個介面型別,內含訊號(var vld: logic等)與視角定義(modport)。- 實例化介面用
inst:inst b: Bus;,訊號以b.vld、b.rdy存取。 - modport 定義「從某個角色看到的介面」:
modport m中vld是 output、rdy是 input;modport s正好相反。模組宣告 port 時指定 modport,編譯器就會檢查方向是否符合該角色的視角。
module Master (
port bus: modport Bus::m,
) {
// bus.vld 是 output、bus.rdy 是 input,方向由 modport 決定
}
module Slave (
port bus: modport Bus::s,
) {
// bus.vld 是 input、bus.rdy 是 output
}
module Top {
inst b: Bus;
inst u_m: Master;
inst u_s: Slave;
// u_m.bus 與 u_s.bus 都接到 b
}
modport 的價值是把「同一組訊號在不同角色的不同方向」這個資訊集中寫一次,而不是散落在每個模組的 port 宣告中。master 寫錯方向(把 vld 當 input)會在編譯期被攔截。
對照 SystemVerilog interface#
interface 並非 Veryl 首創。SystemVerilog 的 interface 來自 1990 年代末的語言設計工作:Co-Design Automation 的 Superlog 語言(其設計者包括 Peter Flake 等來自 HILO 與 Verilog-XL 世代的工程師)率先提出 interface 概念,Co-Design 於 2002 年被 Synopsys 收購後,這些特性隨 Superlog 進入 SystemVerilog 標準,於 IEEE 1800-2005 正式標準化。驅動力正是匯流排協定的複雜化:1990 年代末,PCI(1992)之後的協定層級暴增,ARM 的 AMBA(1996 年首版 ASB/APB,1999 年 AHB,2003 年 AXI)把「協定即產品」變成現實,攤平式訊號清單再也無法維護。
Veryl 的 interface/modport 與 SV 同源,但語法更緊湊:SV 的 interface ... endinterface、modport m(input vld, output rdy) 與 endmodport 等冗詞較多,且 interface 內可以塞大量過於彈性的內容(函式、always block),語意複雜;Veryl 的 interface 專注於「訊號 + 方向視角」,保持簡單。
AXI/AHB 與 interface 的誕生#
回顧這段歷史有助於理解 interface 的本質。1990 年代,ASIC 設計從「全客製電路」轉向「整合第三方 IP」,匯流排從點對點演進到多 master 架構。AMBA 的出現有明確的商業動機:ARM 靠 IP 授權模式生存,其 CPU 核心要能與任何廠商的周邊 IP 即插即用,就必須定義標準互連。協定標準化之後,每個 IP 的介面訊號變成穩定的公共契約——而契約重複出現的次數越多,就越應該成為語言型別。interface 正是這個經濟邏輯的語言回應:一次定義、處處引用。
flowchart LR
A[AMBA 1996-2003<br/>匯流排協定標準化] --> B[介面訊號群龐大<br/>攤平維護不可行]
B --> C[Superlog/Co-Design<br/>1990s 末]
C --> D[SystemVerilog interface<br/>IEEE 1800-2005]
D --> E[Veryl interface + modport<br/>語意收緊]小結#
interface 把匯流排訊號群打包成型別,modport 把每個角色的方向視角寫一次、編譯器檢查處處。從 Superlog 到 SystemVerilog 再到 Veryl,這個特性的演進史就是匯流排協定複雜化的歷史:PCI、AMBA、AXI 的訊號數量成長,逼出了「介面即型別」的語言設計。Veryl 保留 SV 的核心語意,同時以更緊湊的語法與更少的彈性換取更好的可讀性與可檢查性。