ProtoModule 與契約:設計先於實作#
從 trait 說起#
軟體界早就解決了「只定介面、不定實作」的問題:Java 的 interface(1995)、Rust 的 trait、Haskell 的 type class,都是「契約與實作分離」的機制。契約的好處是雙向的——使用者可以針對契約寫程式而不依賴特定實作;提供者可以有多個實作,只要滿足契約就能替換。
硬體設計長期缺乏這個機制。Verilog 沒有任何介面契約概念:一個模組的「介面」就是它的 port 清單,但 port 清單不是一等公民——你無法宣告「我需要一個具有這組 port 的模組」,也無法驗證某個模組「符合」某組 port 規格。頂層連接錯了,錯誤要到 elaborate 甚至模擬才浮現。
Veryl 引入 proto(prototype)機制補上這一塊:
proto module FifoIF (
param WIDTH: u32,
param DEPTH: u32,
port clk: input clock,
port rst: input reset,
port w_vld: input logic,
port w_rdy: output logic,
port w_data: input logic<WIDTH>,
port r_vld: output logic,
port r_rdy: input logic,
port r_data: output logic<WIDTH>,
);
proto module 只宣告 param 與 port,沒有函式體——它是一份「模組長什麼樣」的契約。實作時用 for 關聯:
module FifoRtl for FifoIF (
param WIDTH: u32,
param DEPTH: u32,
port clk: input clock,
port rst: input reset,
port w_vld: input logic,
port w_rdy: output logic,
port w_data: input logic<WIDTH>,
port r_vld: output logic,
port r_rdy: input logic,
port r_data: output logic<WIDTH>,
) {
// RTL 實作
}
module FifoModel for FifoIF (
// 與上相同的 param/port 清單
) {
// 行為模型實作:不含底層細節,模擬速度快
}
module FifoRtl for FifoIF { ... }表示這個模組聲明滿足FifoIF契約,編譯器會逐項比對 param 與 port,不符即編譯錯誤。- 同一個 proto 可以有多個實作:
FifoRtl(可合成 RTL)、FifoModel(行為模型)。 - 使用端宣告 port 型別為 proto module,就表示「我接受任何 FifoIF 的實作」;頂層用參數選擇要綁定哪個實作,即可在行為模擬與合成之間切換,測試台不需要重寫。
同樣的機制覆蓋三種宣告:proto module(模組契約)、proto interface(介面契約)、proto package(package 契約),讓契約思想貫穿所有層級的抽象。
可替換實作的實際場景#
契約最直接的受益者是驗證流程。典型 SoC 開發中:
- 架構探索階段先用行為模型(C 參考模型或高階模擬版本)跑演算法驗證。
- RTL 實作完成後,兩者需要在同一個測試環境中逐模組對照( equivalence / scoreboard)。
- 若模組介面是 proto,測試環境只需依賴 proto;切換實作不必改測試環境。
另一個場景是第三方 IP 整合:供應商交付的模組只要聲明 for 某個 proto,整合方就能在編譯期確認介面相容,而不必人工比對 port 清單。
對照 SystemVerilog#
SV 沒有 proto module 概念。最接近的替代品是 bind、parameter override 搭配 generate,或用虛擬 interface(virtual interface,OVM/UVM 驗證方法學的基礎)在驗證層做間接引用——但這些都是驗證語意或工具慣例,不是設計語言的契約機制。SV 也沒有「模組符合某介面規格」的編譯期檢查,介面一致性始終靠人工或 lint。
歷史脈絡:VSIA 與 IP 標準化#
硬體契約思想的產業源頭可以精確定位到 1996 年。Virtual Socket Interface Alliance(VSIA)於該年成立,匯集了 IBM、Motorola、TI、Cadence、Synopsys 等超過一百家公司,目標是為「virtual socket」(虛擬元件,即 IP block)定義統一介面標準,讓任意供應商的 IP 能像插座上的晶片一樣即插即用。VSIA 制定了介面文件、測試方法、品質指標(QIP,Quality Intellectual Property Metric,2001 年起)等文件,並推動了 IP 目錄與授權流程的標準化。VSIA 於 2008 年完成使命後解散,部分文件移交給 SPIRIT Consortium(其 IP-XACT 標準後併入 Accellera),但「IP 是可替換元件、介面是契約」的思想已成為 SoC 產業的常識。
配套的制度還包括:ARM 的 AMBA 規範(介面契約的 de facto 標準)、Accellera 的 SystemVerilog 標準化、以及 IP 驗證的成熟度評級。這整場運動的經濟邏輯很簡單:晶片設計成本(mask、EDA、人力)在 1990 年代末突破千萬美元,自研所有模組不再可行,「買 IP 組晶片」是唯一出路;而 IP 交易的前提是介面契約足夠精確、可機器驗證。VSIA 用文件與流程做到了「契約的人類可讀版」,proto 則把它升級為「契約的機器可讀版」——編譯器成為契約的公證人。
flowchart LR
A[Java interface 1995<br/>/ Rust trait] --> D[契約與實作分離]
B[VSIA 1996<br/>virtual socket 標準] --> C[IP 即插即用<br/>介面即契約]
C --> D
D --> E[Veryl proto module/interface/package<br/>編譯期契約檢查]
E --> F[同一 proto 多實作<br/>行為模型 ↔ RTL 可替換]小結#
proto module 讓「模組的介面規格」第一次成為語言中的一等公民:契約可宣告、實作可聲明 for 契約、符合性由編譯器驗證。搭配 proto interface 與 proto package,契約思想覆蓋了硬體抽象的所有層級。從 VSIA 到 IP-XACT,產業用二十年建立了 IP 交易的制度基礎;Veryl 用一組關鍵字把這個制度寫進語言,讓「設計先於實作、契約先於連接」從方法學口號變成編譯期事實。