跳轉到

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 正是這個經濟邏輯的語言回應:一次定義、處處引用。

小結#

interface 把匯流排訊號群打包成型別,modport 把每個角色的方向視角寫一次、編譯器檢查處處。從 Superlog 到 SystemVerilog 再到 Veryl,這個特性的演進史就是匯流排協定複雜化的歷史:PCI、AMBA、AXI 的訊號數量成長,逼出了「介面即型別」的語言設計。Veryl 保留 SV 的核心語意,同時以更緊湊的語法與更少的彈性換取更好的可讀性與可檢查性。