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

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

System verilog基礎-數(shù)據(jù)類型總結

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

? ? ? ? verilog中將寄存器(register)類型reg和線網(wǎng)(net)類型wire區(qū)分的較為清楚,SV則在此基礎上引入了一個新的數(shù)據(jù)類型logic。

????????SV作為側重于驗證的語言,并不十分關切l(wèi)ogic對應的邏輯應該被綜合為寄存器還是線網(wǎng),因為logic被使用的場景如果是驗證環(huán)境,那么它只會作為單純的變量進行賦值操作,而這些變量也只屬于軟件環(huán)境構建。

數(shù)據(jù)類型?

????????與logic相對應的類型是bit類型,它們均可以構建矢量類型(vector)而它們的區(qū)別在于logic為四值邏輯,即可以表示0、1、x、z;bit為二值邏輯,只可以表示0和1。

四值邏輯類型:integer、logic、reg、net-type(例如wire、tri)

二值邏輯類型:byte、shortint、int、longint、bit

如果按照有符號和無符號的類型進行劃分,那么可以將常見的變量類型劃分為:

有符號類型:byte、shortint、int、longint、integer

無符號類型:bit、logic、reg、net-type(例如wire、tri)

????????在遇到這些變量類型時,應該注意他們的邏輯類型和符號類型,因為在變量運算中,應該盡量避免兩種不一致的變量進行操作,而導致以外的錯誤。比如有符號數(shù)和無符號數(shù)的混用導致結果錯誤:

如上題,byte類型是有符號的,把8位的有符號數(shù)賦值給9位的無符號數(shù),第一步它會先把自己擴展成9位,因為signed_vec的符號位為1,所以擴展位第9位也會為1,即signed_vec會將自己擴展成:9‘h180,然后再賦值給result_vec,最后這句賦值的輸出結果為:result_vec = 'h180。

第二次賦值時,先把有符號數(shù),通過unsigned 轉換成無符號數(shù)再賦值,轉換成無符號數(shù)后變?yōu)?’h80,然后再擴展為9位,高位補0,最后result_vec = unsigned(signed_vec)的結果為:result_vec = 'h080。

questasim仿真結果

????????上面展示的轉換數(shù)據(jù)類型的方式稱為---靜態(tài)轉換,即需要在轉換的表達式前面加上單引號。該方式不會對轉換值做檢查,如果轉換失敗我們也不會知道。所以與之對應的動態(tài)轉換$cast(tgt,src) 也被經(jīng)常運用到轉換操作中,會在仿真的時候告訴你轉換成功還是失敗,靜態(tài)轉換是在編譯的過程中進行的。

????????靜態(tài)轉換和動態(tài)轉換均需要操作符號或者系統(tǒng)函數(shù)介入,我們統(tǒng)稱為顯示轉換。而不需要進行轉換的一些操作,我們稱之為隱式轉換

對于上面這種,4位的四值邏輯,賦值給3位的二值邏輯,結果是什么樣呢?高位賦值給低位,那么溢出的位就會被截掉,所以只剩下11x,這里要注意,四值邏輯中的x賦值給二值邏輯的時候,就是0。所以上面的賦值結果為b_vec = 110

questasim仿真結果

綜上,在對不同數(shù)據(jù)類型進行操作的時候,應當注意:

1.數(shù)據(jù)類型是四值邏輯還是兩值邏輯?

2.數(shù)據(jù)是有符號還是無符號的?

3.數(shù)據(jù)的位寬是多少,是否會出現(xiàn)上溢情況?


數(shù)組

數(shù)組的聲明

這兩種聲明都是可以聲明出一個一維數(shù)組,數(shù)組的大小都是16。

多維度數(shù)組聲明:

????????實際在敲代碼的時候,只在module里敲上面三行會報錯,賦值只能在聲明的時候直接賦值,或者在過程塊里面賦值,不能直接賦值。所以如果在聲明后對變量賦值,需要在initial過程語句塊中賦值。

初始化和賦值

這里要聲明一點,變量的賦值必須在聲明之后,哪怕是聲明a→賦值a→聲明b→賦值b,這樣寫也會報錯?。。∫驗橘x值a操作在聲明b操作之前也是違法的。

執(zhí)行報錯。試了一下,無論是questasim還是vcs,編譯都會報錯。所以任何賦值都不能在變量聲明之前!

合并數(shù)組與非合并數(shù)組:

合并數(shù)組聲明:bit [3] [7:0] b_pack;

非合并數(shù)組聲明:bit [7:0] b_unpack [3]; //表示的都是24bit數(shù)據(jù)容量,但是實際的硬件容量來說,哪個存儲容量更小呢?

合并數(shù)組它所占的空間是連續(xù)存儲的,在存儲空間里連續(xù)存儲三個8bit。即連續(xù)占用24bit存儲空間,對硬件來說就是一個WORD(32位操作系統(tǒng)一個WORD是4byte,64位就是8byte),而非合并數(shù)組,則會開三個WORD,分別存放b_unpack的三個8bit,占用三個WORD。

結果:b_pack占用實際存儲1WORD,b_unpack占用實際存儲3WORD。

問:如果把上面這題的bit類型,換成logic類型呢?結果有什么變化?

logic類型是四值邏輯,每1位需要2bit的實際存儲空間,所以對合并數(shù)組來說,連續(xù)存儲24位的 logic 變量需要48bit實際存儲空間,如果是32位的操作系統(tǒng),就需要2WORD來存儲,而對于非合并數(shù)組來說,存儲8位的logic變量,需要16bit實際存儲空間,分配的1WORD也夠用,所以非合并數(shù)組仍然占用3WORD實際存儲空間。


基本數(shù)組操作: for 和 foreach

$size()函數(shù)可以取到變量的維度,src是位寬為32位,深度為5的二維數(shù)組。$size(src) = 5,取的是src的深度,而不是位寬。所以循環(huán)就是從0~4給src賦值,而foreach會把dst中所有元素遍歷一次,我們會發(fā)現(xiàn)變量j沒有聲明但是可以使用,這就是foreach的特點,在foreach后面括號中寫了什么變量,在foreach的循環(huán)里就得用該變量。

對多維數(shù)組使用foreach語法和我們想的不太一樣,使用時并不想[ i ][ j ]這樣把每個下標分別列在不同的方括號里,而是用逗號隔開后放在同一個方括號里:[ i ,?j ]。

????????要補充的是,foreach循環(huán)會遍歷原始聲明中的數(shù)組范圍。數(shù)組f[5]等同于f[0:4],而foreach(f[i])等同于for (int i=0;i<=4;i++)。對于數(shù)組rev[6:2]來說,foreach(rev[i])語句等同于for(int i=6;i>=2;i--)。

數(shù)組的復制和比較

運行結果

數(shù)組的復制,可以直接用一個等號復制。

動態(tài)數(shù)組

????????剛才提到的數(shù)組是定長數(shù)組,數(shù)組的長度在編譯的時候就已經(jīng)確定了。如果在程序運行時再確定數(shù)組的寬度就需要使用“動態(tài)數(shù)組”了。動態(tài)數(shù)組的最大特點就是可以在仿真時靈活調(diào)節(jié)數(shù)組的大小,類似C中的malloc函數(shù)。

????????動態(tài)數(shù)組在一開始聲明時,需要利用‘[ ]’來聲明,而數(shù)組此時是空的,即0容量。其后,需要使用‘new [ ] ’來分配空間,在方括號中傳遞數(shù)組的寬度。此外,也可以在調(diào)用new[ ] 時將數(shù)組名一并傳遞,將已有的數(shù)組的值復制到新數(shù)組中。

動態(tài)數(shù)組分配空間,及復制。d2 = dyn,這條語句,d2在賦值之前還是0個元素,賦值之后就是5個元素了,這就是動態(tài)數(shù)組。

dyn = new[20] (dyn)這條語句把dyn分配20個新值,并且低5五位是dyn的原始值,高15位是新值,都是0。然后緊接著下一條語句,dyn = new [100]分配100個新值,dyn全都變成0,舊的值全沒了。

dyn.delete();可以刪除動態(tài)數(shù)組中的所有元素,同樣的還可以使用dyn = new [0];?以及dyn = ‘{ };都可以刪除動態(tài)數(shù)組中的所有元素。

????????當你把一個定寬數(shù)組復制給一個動態(tài)數(shù)組時,System verilog 會調(diào)用構造函數(shù)new[ ] 來分配空間并復制數(shù)值。


隊列

????????隊列結合了鏈表和數(shù)組的優(yōu)點,可以在它的任何地方添加或刪除元素,并且通過索引實現(xiàn)對任一元素的訪問。隊列的聲明是使用帶美元符號的下標:[ $ ],隊列元素的標號從0到$。隊列不需要new[ ] 去創(chuàng)建空間,你只需要使用隊列的方法為其增減元素,一開始其空間為0。

????????隊列的一個簡單使用就是通過其自帶方法push_back()和pop_front()結合來實現(xiàn)FIFO的用法。

????????如圖使用了多個自帶的隊列函數(shù)。但是并不是所有的Systemverilog 仿真器都支持使用insert()一個隊列,比如q.insert(3,q2);即在q的第三個位置之后插入隊列q2,這個我使用questasim編譯報錯。

????????這里要說一點,在對數(shù)組賦值的時候無論是定長數(shù)組還是動態(tài)數(shù)組,我們都要加一個單引號來表示賦值,而在隊列的賦值中,我們沒有使用單引號,這點注意。

????????如果把$放在一個范圍表達式的左邊,那么$將代表最小值,例如[$:2]就代表[0:2]。如果$放在表達式的右邊,則代表最大值。


關聯(lián)數(shù)組

????????假設我們需要對幾個G字節(jié)尋址范圍的處理器進行建模,在測試中發(fā)現(xiàn),這個處理器可能只訪問了用來存放可執(zhí)行代碼和數(shù)據(jù)的幾百或幾千個字節(jié),其余的幾G字節(jié)的存儲空間都浪費了。針對這種情況,System Verilog提供了關聯(lián)數(shù)組類型,用來保存稀疏矩陣的元素。

關聯(lián)數(shù)組采用在方括號中放置數(shù)據(jù)類型的形式來進行聲明,例如[int] 或 [Packet]

看過一個面經(jīng),面試官問怎么用非遍歷的方式對稀疏矩陣結果順序輸出?

foreach會找到稀疏分布的元素1,2,4,8,16等,但輸出的時候未必按照順序輸出,如果想要按照順序輸出,則可以先把標號放到一個數(shù)組里,然后利用數(shù)組的排序函數(shù)sort()來對下標進行排序,接著再按照下標對結果進行輸出。

數(shù)組縮減方法

最常用的縮減方法是sum,它對數(shù)組中的所有元素求和。但是必須對System verilog的操作位寬規(guī)則小心,缺省情況下,如果把一個單比特數(shù)組的所有元素相加,其和也是單比特的。

綠皮書中說第二條和第三條display出來的結果都會是5,但經(jīng)過實際測試,結果均為1,在這里給綠皮書糾錯。

用戶自定義結構

typedef語句可以用來創(chuàng)建新的類型,可以把parameter和typedef語句放到一個程序包(package)里,以使它們能被整個設計和測試平臺所共用,用戶自定義的最有用的類型是雙狀態(tài)的32比特的無符號整數(shù),在測試平臺中,很多數(shù)值都是正整數(shù),例如字段長度或事務次數(shù),所以把對uint的定義放到通用定義程序包中,這樣就可以在仿真程序的任何地方使用它。

用戶自定義變量:

用戶自定義數(shù)組:

用戶自定義結構體:

由于結構體struct 只是一個數(shù)據(jù)的集合,所以它是可綜合的。如果想在設計代碼中對一個復雜的數(shù)據(jù)類型進行建模,例如像素,可以把它放到struct里。

仿真結果:

字符串變量

System Verilog 中的string類型可以用來保存長度可變的字符串。單個字符是byte類型。長度為N的字符串中,元素編號從0到N-1。注意跟C語言不一樣的是,字符串的結尾并不帶標識符null,所有嘗試使用字符“\0”的操作都會被忽略。

substr(start,end)函數(shù)能提取出從位置start到end之間的所有字符。

仿真結果:

SV重要的數(shù)據(jù)類型基本就這么多。

參考資料:綠皮書20~50頁










System verilog基礎-數(shù)據(jù)類型總結的評論 (共 條)

分享到微博請遵守國家法律
尼勒克县| 沿河| 从化市| 沁水县| 杭锦后旗| 高淳县| 磐安县| 平原县| 如东县| 和平区| 石河子市| 阿拉善盟| 苗栗县| 沅陵县| 晴隆县| 泌阳县| 扶风县| 福安市| 基隆市| 肥城市| 静海县| 石嘴山市| 桐城市| 札达县| 邳州市| 吉木乃县| 综艺| 婺源县| 榕江县| 巴彦县| 岑溪市| 连南| 康平县| 衡南县| 玛纳斯县| 新源县| 昌平区| 东丰县| 东兰县| 石屏县| 台湾省|