国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

驗證基礎-類型轉換、虛方法、回調(diào)函數(shù)、對象拷貝

2022-05-16 22:31 作者:不吃蔥的酸菜魚  | 我要投稿

????????這一章是SV學習和UVM學習的過渡,SV的驗證思想在很多地方和UVM是共通的,本篇就介紹一些SV和UVM中相似的一些概念及應用。

類型轉換

????????類型轉換可以分為靜態(tài)轉換動態(tài)轉換。靜態(tài)轉換即需要在轉換的表達式前加上單引號即可,該方式并不會對轉換值做檢查。如果發(fā)生轉換失敗,我們也無從得知。

????????動態(tài)轉換即需要使用系統(tǒng)函數(shù) $cast(tgt,src)?做轉換。把右側的變量轉換成左側的變量類型。

????????靜態(tài)轉換和動態(tài)轉換均需要操作符號或者系統(tǒng)函數(shù)介入,統(tǒng)稱為顯示轉換

????????不需要進行轉換的一些操作,我們稱之為隱式轉換。例如賦值語句右側是4位的矢量,而左側是5位的矢量,隱式轉換會先做位寬擴展(隱式),然后再做賦值。

????????動態(tài)轉換中,當我們使用類的時候,類句柄的向下轉換,即從父類句柄轉換為子類句柄時,需要使用?$cast( )?函數(shù)進行轉換,否則會出現(xiàn)編譯錯誤,把父類句柄轉換成子類句柄只有這一種方法,一般是在父類句柄指向子類對象的時候,又想要訪問子類的成員變量時,使用cast函數(shù)轉換。如果父類句柄指向的是父類對象,那么不能用cast函數(shù)轉換,哪怕轉換了也會轉換失敗,即函數(shù)返回0.

????????如果將子類的句柄賦值給父類句柄時,編譯器認為賦值是合法的,但分別利用子類句柄父類句柄調(diào)用相同對象的成員時,可能會有不同的表現(xiàn)。(在面向對象編程筆記中詳細解釋到。)

問,下面最后的結果為多少?

????????從代碼中我們可以看到,BadTr繼承了父類的成員變量和方法,子類中也定義了和父類同名的方法“function display”,那么父類句柄tr的語句,tr.display()調(diào)用的是父類的display還是子類的display?答:調(diào)用的父類的display,因為父類的句柄指向子類的對象,只能訪問子類對象中繼承于父類的部分。

虛方法

????????虛方法是驗證面試的時候經(jīng)常會問。

????????當不同的句柄類型指向同一個對象的時候,它們調(diào)用的函數(shù)或者變量可能結果會不一樣。在父類句柄指向子類對象的時候,如果子類和父類都定義了一個同名的方法,那么這個父類句柄只能訪問父類的該方法而不能訪問子類的方法,而事實上我們把它指向一個子類的對象更希望的是調(diào)用函數(shù)的時候它也能調(diào)用子類的方法,要想這樣做,可以用cast函數(shù)把父類的句柄類型轉換成子類的句柄,但是如果每次都這么做會使得代碼很冗余,還容易出錯。

????????虛方法要解決的問題就是一個動態(tài)綁定不管句柄類型如何,只要你指向的是子類對象,那么調(diào)用方法的時候即使有同名方法,也會調(diào)用子類中的方法。虛方法通過virtual聲明,只需聲明一次即可。注意虛方法解決的是方法的同名索引,不能索引成員變量,沒有虛成員的說法。

????????我們將已經(jīng)在編譯階段就可以確定下來調(diào)用方法所處作用域的方式稱之為靜態(tài)綁定(static binding),與之相對的是動態(tài)綁定,動態(tài)綁定指的是,在調(diào)用方法時,會在運行時來確定句柄指向對象的類型,再動態(tài)指向應該調(diào)用的方法,在父類里面的方法前面聲明一個virtual即可。

????????這樣我們就可以通過虛方法的使用來實現(xiàn)類成員方法調(diào)用時的動態(tài)查找,用戶無需擔心使用的是父類句柄還是子類句柄,因為最終都會實現(xiàn)動態(tài)方法查找,執(zhí)行正確的方法。對父類的方法聲明了virtual后,在調(diào)用父類句柄.方法名時,系統(tǒng)會先判斷句柄指向的對象是父類對象還是子類對象,如果是子類對象再判斷,子類對象中有無調(diào)用的同名方法,如果有則使用子類方法,如果沒有則再返回到父類中,調(diào)用父類的方法。

????????虛方法如果要定義,應該盡量定義在底層父類中。這是因為如果virtual是聲明在類集成關系的中間層,那么只有從該中間類層到其子類的調(diào)用鏈中會遵循動態(tài)查找,而最底層到該中間類的方法調(diào)用仍然會遵循靜態(tài)查找。

????????如果子類和父類中的方法,同名不同參,那么它們之間就沒有繼承的關系,更沒有虛方法的關系。虛方法的繼承也需要遵循相同的參數(shù)和返回類型,否則,子類定義的方法須歸為同名不同參的其它方法。

對象拷貝

????????聲明對象和創(chuàng)建對象是兩個過程,也可以一步完成。Packet p1;p1=new;

????????如果將p1賦值給另一個變量p2,那么依然只有一個對象,只是指向這個對象的句柄有p1和p2。

????????p1和p2代表兩個不同的對象,在創(chuàng)建p2對象時,將p1拷貝其成員變量例如integer、string和句柄等,這種拷貝方式稱為淺拷貝(shallow copy)。

????????對象的拷貝無法通過“=”實現(xiàn),因為這一操作是句柄的賦值,而不是對象的拷貝

像上面這種情況,就是典型的句柄的賦值,而不是對象的copy。

????????如果要拷貝對象,指的是首先創(chuàng)建一個新的對象(開辟新的空間),再將目標對象的成員變量值拷貝給新對象的成員,這就使得新對象與目標對象的成員變量數(shù)值保持一致,即完成了對象的拷貝(成員變量的拷貝)。

????????將成員拷貝函數(shù)copy_data()和新對象生成函數(shù)copy()分為兩個方法,這樣使得子類繼承和方法復用比較容易。為了保證父類和子類的成員均可以完成拷貝,將拷貝方法聲明為虛方法,且遵循只拷貝該類的域成員的原則,父類的成員拷貝應該由父類的拷貝方法完成。

????????在實現(xiàn)copy_data()過程中應該注意句柄的類型轉換,保證轉換后的句柄可以訪問類成員變量。

回調(diào)函數(shù)

????????理想的驗證環(huán)境是在被移植做水平復用或者垂直復用時,應當盡可能少地修改模塊驗證本身,只在外部做少量的配置,或者定制化修改就可以嵌入到新的環(huán)境中。要做到這點,我們可以通過頂層環(huán)境的配置對象自頂向下進行配置參數(shù)傳遞,還可以在測試程序不修改原始類的情況下注入新的代碼。

????????當我們需要修改Stimulator的行為時,有兩種選擇,一個是修改父類,但針對父類的會傳播到其它子類;另一個選擇是,在父類定義方法時,預留回調(diào)函數(shù)入口,使得在繼承的子類中填充回調(diào)函數(shù),就可以完成對父類方法的修改。

預留回調(diào)函數(shù)方法

Driver_cbs是一個虛類,虛類不能例化,但是可以繼承

????????提前寫好回調(diào)函數(shù),預留一個坑位,如果后續(xù)需要修改,可以直接填回調(diào)函數(shù)做修改。Driver中定義的cbs為句柄隊列。如果drop返回為0的話,因為continue了,所以不會執(zhí)行transmit(tr),直接跳到forever入口處。

????????使用回調(diào)函數(shù)注意事項:1.預留函數(shù)入口。2.定義回調(diào)函數(shù)和類。?3.例化以及添加回調(diào)類的實例。

????????在UVM中就有專門的回調(diào)函數(shù)的內(nèi)容,和SV的回調(diào)函數(shù)使用過程一致,掌握SV的回調(diào)函數(shù)使用方法后,過渡到UVM就很流暢了。

參數(shù)化的類

????????參數(shù)化的使用是為了提高代碼的復用率。參數(shù)的使用越合理,后期的維護成本就會相應降低。在硬件設計中,參數(shù)往往是整形,例如端口數(shù)目或者位寬。在驗證環(huán)境中,參數(shù)的使用更加靈活,可以使用各種類型來做類定義時的參數(shù)。

????????在SV中,可以為類增加若干個數(shù)據(jù)類型參數(shù),并在聲明類句柄的時候指定類型。

????????在類定義時添加參數(shù)#(type T = int),這表示后期類在聲明變量時如果不指定參數(shù)類型,則默認采用int類型。將源代碼的int用參數(shù)T代替。

要修改變量時,調(diào)用類的時候,直接在后面?#(type)即可修改類中的變量。

驗證基礎-類型轉換、虛方法、回調(diào)函數(shù)、對象拷貝的評論 (共 條)

分享到微博請遵守國家法律
昌黎县| 昌黎县| 枣强县| 城固县| 元谋县| 原平市| 汪清县| 泌阳县| 周口市| 潼关县| 巧家县| 正安县| 巴里| 页游| 梧州市| 滁州市| 宁河县| 乐东| 常宁市| 沭阳县| 万源市| 定边县| 渭源县| 义乌市| 镇康县| 江阴市| 毕节市| 阳高县| 库车县| 石家庄市| 宜黄县| 锦州市| 浮山县| 毕节市| 根河市| 吐鲁番市| 澎湖县| 崇文区| 进贤县| 郎溪县| 湘西|