本節關鍵字:class,methods,數據及其對數據的操作封裝起來,繼承(inheritance),多態(polymorphism)等等
一:OOP的概念
將數據及其對數據的操作封裝在一個獨立的對象中。在面向對象編程中, 對象的使用者無須知道對象內部的實現細節, 使用者只要知道如何通過對象的方法和對象進行交互即可。 這使得對象內部實現細節的變動不會影響使用者。 在編寫驗證平台中, 這對於共享代碼很有幫助。
在驗證的過程中, 采用對象可以提高驗證平台的抽象層次, 這使得開發者可以專注在證平台和被測設計的交互過程。在計算過程中, 提高抽象層次可以讓使用者更加容易的處理信息。 在驗證平台中, 抽象可以將復雜的情況映射到一個簡單的高層次的概念。 例如, 一個數字邏輯電路, 其抽象層次可以從邏輯門電路到比較器到乘法器到算術運算單元或者 CPU。
1:關鍵字
class:封裝數據及其操作,對構建object提供模板
object:對象,類似於instance
handle:句柄(地址),相當於指針
properties:數據變量
method:對數據的操作
二:類的基本概念
包含數據成員與函數成員,句柄(也就是指向對象的指針),即該對象的地址入口
1:定義類
class BusTran
bit[31:0] addr,crc,data[8];
function calc_crc;
.......
endfunction
endclass
2:聲明對象與句柄
BusTran b1,b2; //聲明兩個對象b1,b2;b1,b2為句柄
對象的聲明並不意味着對象的創建,聲明沒有實際分配空間。它只是簡單創建了一個標識符。在聲明時,對象句柄為空。
3:初始化對象
b1 = new();//初始化時,若class數據為4-state,則缺省初始化為x,2-state時,則缺省初始化為0。
聲明與初始化可以用一句表達:BusTran b = new();
4:釋放內存
sv能夠自動釋放內存;
再次new對象b時,第一個內存會被自動回收,b=null是手動釋放。
5:在類的定義中聲明對象
一個類也可在其定義中引用自身
6:使用對象
使用“ . ”操作符來訪問對象中的成員,如下:
三:靜態屬性與方法
每個類的靜態對象都擁有其自身的變量,自身的成員是不和其他對象共享的。假如有兩個ether_packet的對象,它們有各自的目標地址,源地址和負荷等。當需要在兩個對象之間建立一種練習,可以讓該類的所有對象建立一種聯系,可以讓所有的對象都可以共享,例如,我們在激勵產生器中會不斷地產生一系列地以太包,在非面向對象的環境中(比如verilog),我們可能會創建一個全局的變量來統計包的個數,而在sv中,我們可以采用靜態的方式來聲明屬性和方法。
靜態屬性:每個類的例化(也就是每個對象)都擁有它自身每個變量的復制。當要求所有的對象共享一個變量時,我們可以使用static關鍵字來聲明數據成員。
1:靜態變量例子
2:解析代碼
上述代碼中,靜態變量count用來統計所有對象的個數,在聲明的時候初始化為0,每當有新的對象產生時,count會自增。
靜態變量存放在堆里,在run時不會被其它東西破壞掉。
可以這樣理解靜態變量:static變量與class有關,與object無關,用來存儲變化的數據;無論有多少個object,只有一個static變量占用內存。
3:靜態方法及其例子
方法也可以被聲明為靜態的。靜態方法對於類的所有對象都可以訪問,它就像一個常規的方法一樣,可以在類的外部被調用,即使沒有該類的初始化。靜態方法不能訪問非靜態的成員,可以訪問靜態變量或者調用同一個類的靜態方法。不能被聲明成虛方法(virtual)
四:this
當使用一個變量時, sv會在當前程序范圍內查找, 接着回到上一層范圍查找, 直至該變量被找到。 假如在一個類的內部而且要求明確的指定引用的就是該類的成員,那該如何處理呢? sv 提供了this這個操作符 (關鍵字)。關鍵字this被用來明確地引用當前類的屬性或方法。 關鍵字this對應着一個預定義的對象句柄, 這個句柄可以在該對象內部使用, 並可訪問內部成員。 關鍵字 this只能在非靜態方法中使用, 否則會出現錯誤。
五:類的函數成員
使用function/task
六:對象的賦值與復制
1:packet p1; p1 = new; packet p2; p2 = p1;
聲明一個類的變量僅僅定義了它的名字,並沒有為其分配空間,所以上述代碼實際上只有一個對象。兩個句柄,這兩個句柄指向同一個對象
2:shallow copy(淺拷貝):值拷貝
pcaket p1,p2;
p1 = new;
p2 = new p1;
產生一個p1的復制
最后一個語句是構造函數new的第二次執行,因此創建了一個新的對象p2,它內部的屬性全部復制p1的內容:這種方式的復制叫做淺復制。淺復制只復制變量,包含的對象不會被復制。
3:深復制(deep copy)
完整復制,其中的每個數據成員(包括嵌套的對象)都要被復制
例子:
七:inheritance(繼承)
繼承 = 原類 + 增加新的properties + 增加methods + 改變原methods函數功能
繼承形成派生類;增加可重用性
1:繼承使用關鍵字 extends
2:覆蓋父類
子類與父類相同的函數名,會覆蓋父類相應的函數,可使用關鍵字super去除覆蓋。
子類calc_crc函數名與父類calc_crc函數名相同,為了繼續能夠使用父類此函數,可使用super關鍵字。
八:虛類與虛函數
抽象類與函數;在虛類/虛函數里簡單定義成員(即抽象)
虛函數里,只有名字,沒有具體實現方式。
九:polymorphism(多態)
由virtual實現
通過父類句柄操作子類的東西,使用父類變量存儲子類變量。