在驗證工作中經常使用"virtual"關鍵字,下面列舉該關鍵字應用場景。
- 主要應用場景在virtual class,virtual interface 以及 virtual task/function。
- OOP三大特性(封裝,繼承,多態)中的 多態 在SystemVerilog中一般通過 “virtual” 關鍵字實現。
通過virtual聲明的類,接口,任務與函數,其本身自帶一些方法或者函數。后續的例化或者擴展可以對原有的內容進行增加或者修改,從而實現同一函數不同方法的多種形態。
1. virtual interface
- 在interface定義時,如果不使用關鍵字 “virtual” 那么在多次調用該接口時,在其中的一個實例中對接口中某一信號的修改會影響其他實例接口;如果使用了 “virtual” 關鍵字,那么每個實例是獨立的。
- 習慣上在聲明interface時均添加 "virtual"關鍵字。
2. virtual task/function
- 用於OOP思想的繼承使用。當定義了virtual時,在子類中調用某task/function時,會先查找在子類中是否定義了該 task/function,如果子類沒有定義,則在父類中查找。未定義virtual時,只在子類中查找,沒有定義就是編譯器報錯。
- 如果某一class會被繼承,則用戶定義的task/function(除new(),randomized(),per_randomize(),pose_randomize()外),都應該加上virtual關鍵字,以備后續擴展。
3. virtual class
-
虛類一般用來定義類的格式,、類的成員、類的參數等,虛類不能被實例化,只能被擴展(重載)后實例化,用於在項目中定義一些標准的類。
-
虛類中的方法通常使用關鍵字 " pure virtual " 純虛方法。同時OOP規定,只要class中存在一個沒有被實現的pure function,就不允許例化這個class。
virtual class (抽象類):可以被擴展但是不能被直接例化,由抽象類擴展而來的類,只有在所以的虛擬方法都有實體的時候才能被例化。
pure virtual function(純虛方法):沒有實體的方法原型,相當於一個聲明,只能在抽象類中定義。
UVM中一個顯著虛類是uvm_void:里面不包含任何成員變量以及函數,是所有其他UVM類的基類。
virtual class uvm_void;
endclass
- 1
- 2
PS:有關其他細節可參考UVM Class Reference Manual 1.2以及SystemVerilog的IEEE標准。