UVM(通用驗證方法學)
假設你設計好了一個複雜的晶片模組,現在要證明它確實能運作。你可以為它手寫一個一次性的測試程式——可問題是,下一個工程師在做下一個模組時又得從頭來過,誰的測試都長得不一樣,彼此之間也無法對話。UVM 就是業界對這團亂麻的回應:一個龐大的、預先搭好的 SystemVerilog 類別庫,把現成的零件——驅動器(driver)、監視器(monitor)、計分板(scoreboard)、序列產生器(sequencer)——直接交到你手上,讓所有人都用同一套積木、以同樣的方式搭建測試平台,並在一個個專案之間反覆重用。
更準確地說,UVM(通用驗證方法學)是一套標準化的框架——先是 Accellera 標準,後被採納為 IEEE 1800.2——用來構建大型、分層的驗證環境。它真正的威力在於結構加激勵。結構是一棵由可重用元件構成的樹:一個代理(agent)封裝了驅動器(負責撥動受測設計的接腳)、監視器(負責觀察這些接腳)和序列產生器(負責餵入激勵);再往上,計分板檢查輸出是否與預期相符。激勵這一側則建立在約束隨機序列之上——你不必再一個個手寫測試向量,UVM 會產生海量合法但不可預測的交易,並透過功能覆蓋率追蹤設計的哪些角落已經被真正觸及。
讓 UVM 之所以「通用」的,是這些部件在設計上彼此解耦。交易級建模(TLM)透過抽象的連接埠連接各元件,於是監視器並不在意誰在收聽;工廠(factory)讓你能在執行時換入另一個驅動器或序列,而無需改動環境;組態資料庫(configuration database)則把設定沿層級往下傳遞。回報是一塊驗證 IP——比如一個 UART 或 PCIe 代理——團隊幾乎只需重新接好它的介面,就能把它放進一顆完全不同的晶片裡。代價則是陡峭的學習曲線:UVM 很重,連一個「hello world」級別的測試平台都得寫上意外地多的樣板程式碼。
class bus_txn extends uvm_sequence_item;
rand bit [31:0] addr;
rand bit [31:0] data;
rand bit write;
`uvm_object_utils(bus_txn)
function new(string name = "bus_txn");
super.new(name);
endfunction
// keep generated addresses word-aligned
constraint c_align { addr[1:0] == 2'b00; }
endclass最小的可重用單元是一個交易(transaction)——它是描述一項激勵的普通物件,而非訊號本身。一次匯流排寫入操作可以這樣建模,其中帶約束的隨機欄位供序列產生器稍後隨機化。
「通用」二字帶著幾分願景色彩。UVM 直接脫胎於 OVM(開放驗證方法學,由 Cadence 與 Mentor Graphics 聯合開發),Accellera 在 2011 年前後將其採納並擴展為 UVM;Synopsys 也加入了進來——而 UVM 本意正是要取代它那套對手方法學 VMM。最終的成果,是把一片互不相容、被各家廠商鎖定的測試平台框架整合成了一套統一的標準。