日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

硅芯思见:SystemVerilog中的类型转换有哪些

發布時間:2024/1/8 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 硅芯思见:SystemVerilog中的类型转换有哪些 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

硅芯思見

更多內容↑↑↑↑↑↑↑↑↑↑,其中更新更多內容!

本文純屬學習之用,歡迎指正文中不足,封面圖片若有侵權,請及時溝通!

在SystemVerilog中,經常會用到$cast對數據類型進行轉換,其實在實際使用過程中除了這種明擺著的數據類型轉換外,SystemVerilog中還有一些“隱性”的數據類型轉換,本文將通過示例說明SystemVerilog中的數據類型轉換。

在SystemVerilog中,類型按照的兼容性分為5各層級,分別是匹配(matching)、相同類型(equivalent)、賦值兼容(assignment compatible)、轉換兼容(cast compatible)和不相同類型(non-equivalent),其中匹配、相同類型其實也屬于賦值兼容的一部分,所有的賦值兼容和所有的可以使用顯式轉換的不相同類型都屬于可轉換類型。因此,可以知道,其實隱式轉換主要存在于匹配和相同的數據類型之間,而顯式轉換存在于其他不同數據類型或者賦值兼容的數據類型之中。而隱式數據類型轉換,顯式數據類型轉換的主要區別是轉換是否“肉眼可見”,隱式轉換一般會“靜默”完成,而顯式需要用戶使用特殊的語法結構才能實現,下面通過示例具體看看兩種轉換的用法。

1?隱式轉換

隱式轉換一般情況下下表中的數據類型變量相互之間進行賦值時會自動完成類型轉換的,例如四值邏輯變量和二值邏輯邏輯變量之間的相互賦值、不同位寬變量之間的相互賦值等等。?

?【示例】?

?【仿真結果】?

?示例中,將var4賦值為不定態之后在賦值給var3,雖然var4具有四值數據類型,但是因為var3是二值數據類型,當var4賦值給var3時,其中的不定態自動轉換為了0,這個轉換過程是隱式自動完成的。var2是一個byte類型,為有符號數,示例中其最高位為1,因為var4位寬比var2寬,所以再將其賦值給var4時,需要對高位進行補位操作,這時的補位操作將根據var2最高位的特點進行補位,并且這個過程是隱式自動完成的。其實在進行具有上表中數據類型特點的數據進行隱式數據類型轉換時,為了避免這種“悄無聲息”的轉換發生,需要注意進行操作的數據對象的以下幾點:

ü操作數的位寬;

ü操作數的符號特性;

ü操作數的數據類型;

2 顯式轉換

顯示的類型轉換主要有兩種方式,格式分別如下:

?靜態轉換一般發生于編譯階段,在編譯階段完成類型的檢查,而動態轉換一般位于仿真運行階段。下面將分別對兩種轉換進行示例說明。

2.1 static靜態轉換

靜態轉換不會對轉換值做檢查,在編譯階如果發生轉換失敗則會報錯,但是對于一般的“integer data types”之間在轉換是產生的截位等問題則不會有相應的警告信息。

【示例】?

【仿真結果】?

?示例中,企圖將packet通過靜態轉換為int型,此時在代碼編譯階段已經報錯,即不支持將class對象轉換為int型變量,其實在SystemVerilog中class對象不支持這種轉換,基本上所有的不以連續位方式進行存儲的變量在使用靜態轉換是都會報錯。關于具體轉換可查閱IEEE1800相關章節內容。下面我們將分別示例常用的靜態轉換都有哪些。

2.1.1類型轉換

在SystemVerilog中,可以通過靜態轉換完成一些賦值兼容的數據類型之間轉換,如果轉換的數據類型賦值不兼容,將會產生一些不期望的結果,特別是在枚舉類型和數據流中。數據類型轉換的語法格式如下:

casting_type(expression)

【示例】?

?【仿真結果】?

?示例中,給int型變量賦值為十進制64,然后通過”string’(vart)”的方式將整數值64轉換成字符,此時的仿真結果將按照ASCII碼表中整數64對應的字符進行顯示,顯示的結果字符為”@”,在示例中實現了整數類型與字符串類型的轉換,當然也可以進行其他數據類型之間的轉換,但是需要注意轉換數據類型的賦值兼容性以及數據位寬和符號特性等問題,否則轉換后的結果可能與期望不一致,所以,從安全性考慮,進行建模時盡量采用統一的數據類型之間的相互操作,盡量避免不同數據類型之間的相互轉換。

2.1.2位寬轉換

在SystemVerilog中可以將一個表達式結果的位寬轉換為指定的位寬,這里需要注意不要轉換的表達式位于括號中,要轉換為的位寬必須為正數,不能為0或者負數。其語法格式如下:

dst_size’(expression)

【示例】?

?【仿真結果】?

?示例中src_vector是8位寬,通過10’(src_vector)將src_vector位寬轉換為10位寬。當然示例中的src_vector為無符號數,無符號數在位寬擴展時高位補0,如果src_vector為有符號數,那么此時將src_vector轉換成寬位寬的數時,此時需要注意該有符號數的符號位,此時的補位將會按照符號位進行補位,如下例。

【示例】?

【仿真結果】?

?示例中src_vector是8位寬byte有符號數,通過10’(src_vector)將src_vector位寬轉換為10位寬,此時因為src_vector為有符號數,所以此時轉換時高位補位使用了其符號位進行了補位,結果為10’b11_1010_1010。

2.1.3符號轉換

除了示例中通過靜態轉換可以轉換表達式結果位寬外,在SystemVerilog中還可以通過指定符號特性影響表達式結果的符號特性,其使用格式如下:

signed’(expression) 和unsigned’(expression)

【示例】?

?【仿真結果】?

?示例中,value0為有符號數,并且初值為”-8”,首先將該數以二進制和十進制方式分別顯示,然后通過unsigned將value0的符號特性轉換為無符號數,并且通過二進制和十進制方式分別顯示,顯示結果中,因為value0為32位數,所以改變后其二進制顯示將會保留未改變符號特性時數據在內存中的存儲格式,但是此時十進制顯示的結果就是該數轉換為無符號數后對應的結果。其實除了上述使用靜態轉換實現符號特性的轉換外,在SystemVerilog中還可以通過系統函數$signed和$unsigned實現一樣的功能,再次就不再贅述了,大家可以將示例中的代碼進行替換仿真。

2.2 dynamic動態轉換

在SystemVerilog中,與靜態轉換對應的是動態轉換,動態轉換可以通過使用系統方法$cast實現數據類型的轉換,這個動態轉換的過程相較于靜態轉換主要區別在于該轉換和檢查發生在仿真運行階段。同時$cast在SystemVerilog中有兩種存在形式,這兩種形式的格式如下:

function int?$cast(singular dest_var,singular src_exp);

task?$cast(singular dest_var,singular src_exp);

兩種形式實現的功能都是將源表達式src_exp轉換給目標變量dest_var,那么既生瑜何生亮,實現的功能都一樣,在具體使用時仿真工具或者用戶如何知道使用的是$cast的那種形式呢?下面我們通過示例說明兩者使用上的差異。

2.2.1 $cast作為任務task

【示例】?

?【仿真結果】?

?示例中,雖然子類scobj是從父類cobj拓展派生而來的,兩個屬于不同的類型,但是父類句柄是可以直接指向子類對象,子類句柄是不能直接指向父類對象的(關于句柄之間類型轉換可參考《硅心思見:【113】SystemVerilog中不同句柄之間的動態類型轉換》)。本示例中企圖通過$cast將子類句柄sp指向父類句柄指向的對象(此時父類句柄指向對象的類型為cobj),并且代碼的編譯已經通過,但是在程序運行時調用$cast時,檢測類型不匹配,仿真器直接報錯停止,并且給出報錯信息。可以看到,示例中$cast的用法與task相同,都沒有返回值,仿真器會根據該方法使用的上下文確定該方法按照task進行解析。

2.2.2?$cast作為函數function

【示例】?

?【仿真結果】

?示例中,兩次調用$cast,都將$cast賦值給了tmp,即此時$cast有返回值,根據上下文可以此時$cast被作為一個有返回值的方法,此時的$cast被仿真器按照function解析處理。第一次調用$cast時,因為子類句柄sp指向父類句柄p指向的對象(因為此時父類句柄指向對象的類型為cobj),當仿真運行調用$cast時檢測到類型不匹配,函數返回0給tmp,條件判斷語句根據tmp值執行了對應分支的$display語句,同時我們注意到仿真并沒有因為這次不匹配報出任何提示信息和停止仿真;第二次調用$cast時,因為句柄p指向子類句柄sp指向的對象(父類句柄可以直接指向子類對象),當仿真運行調用$cast時檢測到類型匹配兼容,函數返回1給tmp,條件判斷語句根據tmp值執行了對應分支的$display語句。

通過上述示例可以匯總如下幾點:

ü當將$cast作為任務使用時,如果源對象的數據類型與目的對象的數據類型不匹配不兼容仿真時會報錯,并且仿真停止;

ü當將$cast作為函數使用時,如果源對象的數據類型與目的對象的數據類型不匹配不兼容仿真時,該函數僅返回值0,并且仿真不會停止也不會給出任何提示,如果類型兼容匹配,轉換成功,那么函數返回非零值;

ü$cast具體作為函數還是任務,取決于用戶在編碼時按照如何的方式對$cast進行使用,如果期望類型不匹配不兼容時能夠給出信息并且停止仿真,那么用戶應該像任務一樣使用$cast,如果想根據類型轉換的結果進行特定的操作并不自動停止時,那么用戶應該像函數一樣使用$cast。

總結

以上是生活随笔為你收集整理的硅芯思见:SystemVerilog中的类型转换有哪些的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。