SystemVerilog中的型別向下轉換

2021-10-06 16:19:49 字數 1998 閱讀 7750

寫在前面:

1、一直以來對這塊理解都不是那麼清楚,只知道個大概,比如只知道$cast做型別向下轉換。今天好好看了下相關的內容,發現自己之前的理解確實有很大的偏差,今天就好好總結下了。

2、難得的六一兒童節,祝各位大齡兒童節日快樂。

//***********************************=start***********************************=//

1、物件:物件是類的乙個例項。

2、控制代碼:指向物件的指標。

要理解後面的內容,我們一開始就要明白物件和控制代碼的區別。物件是真實存在的實體,就像你的女朋友一樣(沒有的話可以new乙個出來),而控制代碼就是你女朋友的**號碼,通過**號碼,你可以找到你的女朋友,而不是別人的女朋友。

規則1:指向基類的控制代碼可以用來指向派生類的物件。

控制代碼tr指向的是transaction物件,控制代碼btr指向的是badtr物件。而類badtr繼承自類transaction,因此可以直接用控制代碼tr指向badtr物件。那麼問題來了,當控制代碼tr指向badtr物件後:

q1:通過tr我們可以訪問crc變數嗎?

a1:不能,由於tr控制代碼是transaction型別的,所以看不見crc變數。如果你確實這麼做了,編譯階段就會報錯。

q2:呼叫display函式時,呼叫的是父類還是派生類的display函式?

a2:呼叫時,首先通過控制代碼型別找到該函式,檢視有無virtual修飾符,有virtual修飾符,那麼就呼叫實際物件型別的display函式,無virtual修飾符,就呼叫控制代碼型別的display函式。

由規則1我們可以將指向基類的控制代碼用來指向派生類的物件。所以下面的場景是經常存在的:

也就是說,為了使驗證平台重用性更好,經常會使在各個元件間傳遞的是資料的基類,而在真正使用的地方再轉換為派生類。

那麼必然就涉及將基類控制代碼的物件傳遞給派生類控制代碼(上圖中的$cast部分)這樣乙個過程,而顯然這個過程是靜態轉換所不支援的,因為靜態轉換只檢查控制代碼型別,不看實際的物件型別。因此我們需要用到$cast來做動態轉換,$cast轉換會檢查物件型別,一旦源物件(source_exp)和目的控制代碼(dest_var)是同一型別或者是目的控制代碼型別的派生類,轉換就是合法的。

$cast既可以當成任務來使用,也可以當成函式來使用。作為任務來使用時,不匹配就會輸出錯誤資訊,使**中斷(如下圖)。而作為函式使用時,不匹配僅返回乙個 非零值,需要驗證人員自己去做處理。

2020/10/07補充:

最近在看cpp的書,cpp裡面也有類似的東西,補充或者強調一點就是:靜態檢查是在編譯階段完成的,而動態檢查是在**階段完成的。

SystemVerilog中的Virtual總結

virtual inte ce 隔離抽象模型 class 和實際訊號 port wire reg 可在 過程中動態控制連線訊號。在class內使用,這樣class的不同例項可連外部不同的inte ce例項。inte ce sbus a bus inte ce logic req,grant logi...

Systemverilog中物件的複製

class transaciton static count 0 int id statics status function new status new id count endfunction endclass transaction src,dst initial begin src new...

systemverilog中關於事件的那些事

說道systemverilog中的執行緒間通訊,不得不說一下事件 event 事件也就兩種 邊沿阻塞 e 和電平阻塞 wait e.triggered 1.事件通過 操作符來觸發事件,通過 或者wait等待事件的觸發。2.相當於verilog中的邊沿觸發,一定要先於 只在觸發的那一瞬間有效 而tri...