數(shù)值類型
簡單的區(qū)分,相比于Verilog秃踩,SV引入了一個(gè)數(shù)據(jù)類型logic用來概括寄存器類型reg和線網(wǎng)類型wire衬鱼。
bit為二值邏輯,只可以表示0憔杨、1鸟赫,且bit為 無符號(hào)數(shù)。
logic為四值邏輯消别,可以表示0抛蚤、1、X妖啥、Z霉颠,且logic也為 無符號(hào)數(shù);X代表不確定高低態(tài)荆虱,Z代表高阻態(tài)蒿偎。
四值邏輯類型:integer、logic(常用)怀读、reg(常用)诉位、net-type(wire、tri)? 偏硬件菜枷;
二值邏輯類型:byte苍糠、shortint、int(常用)啤誊、longint岳瞭、bit(常用)? ?偏軟件拥娄;
有符號(hào)類型(最高位表征符號(hào)):byte、shortint瞳筏、int稚瘾、longint、interger姚炕;
無符號(hào)類型:bit摊欠、logic、reg柱宦、net-type(wire些椒、tri);(常用)
簡單理解:無符號(hào)類型掸刊,直接二進(jìn)制讀免糕,有符號(hào)類型,最高位取反+1痒给。
有符號(hào)數(shù)轉(zhuǎn)化無符號(hào)數(shù):
? ? 例:byte a = 8`b1000_0000; (有符號(hào)數(shù))
? ? ? ? ? ? bit [8:0] b;? (無符號(hào)數(shù))
? ? ? ? ? ? b=a; // 8位賦給9位说墨,8位高位擴(kuò)展一位,9`b11000_0000 = `h180?
動(dòng)態(tài)轉(zhuǎn)換:$cast(target, source); 將source轉(zhuǎn)換位target類型
四值邏輯轉(zhuǎn)化二值邏輯:
? ? 例:logic [3:0] a = `b111x;
? ? ? ? ? ? bit [2:0] b ;
? ? ? ? ? ? b=a; // 4位無符號(hào)賦給3位無符號(hào)苍柏,高位截?cái)唷?1x→110尼斧,x轉(zhuǎn)化二值邏輯為0。
定寬數(shù)組
一維:int array[16]; int array[15:0];
二維:int array[8] [2]; int array [7:0] [1:0]; //8為高維试吁,2為低維
組合型數(shù)組/非組合型數(shù)組:
? ? 1.?在內(nèi)存中的存儲(chǔ)方式不一樣:組合數(shù)組:在內(nèi)存中連續(xù)存儲(chǔ)棺棵,非組合數(shù)組:在內(nèi)存中非連續(xù)存儲(chǔ)。
????? ??2. 賦值方式不一樣:組合數(shù)組:因?yàn)榻M合數(shù)組可以看成矢量币喧,因此只要總的位寬相同,就可以進(jìn)行互相賦值操作袱耽。例如八行九列的數(shù)據(jù)可以賦值給九行八列的數(shù)組杀餐,他們的數(shù)據(jù)總數(shù)都是72個(gè)。非組合數(shù)組則必須維數(shù)對(duì)齊朱巨。
? ??????3. 初始化方式不一樣:組合數(shù)組:因?yàn)榻M合數(shù)組可以看成矢量史翘,可以直接初始化。非組合數(shù)組:對(duì)每一維以數(shù)組的方式進(jìn)行初始化,使用verilog單引號(hào)與大括號(hào)的結(jié)合:`{2`{1,2,3}}
動(dòng)態(tài)數(shù)組
? ? 1. 內(nèi)建方法主要有:delete()和size()兩個(gè)琼讽。
? ? 2. 動(dòng)態(tài)數(shù)組的聲明:int a[ ] ;? // 僅僅聲明必峰,不占空間大小,類似于只有句柄钻蹬,沒有分配空間
? ? 3. 動(dòng)態(tài)數(shù)組的創(chuàng)建:a = new[1] ; // 給a創(chuàng)建一個(gè)int空間
? ? 4. 調(diào)用new[ ]時(shí)將數(shù)組名也一并傳遞自点,可以將已有數(shù)組的值復(fù)制到新數(shù)組中:b=new[20](a);? // new了一個(gè)20空間的b脉让,將a的1個(gè)值復(fù)制給了b,a不變功炮。?
聯(lián)想到之前學(xué)習(xí)java時(shí)溅潜,有深拷貝和淺拷貝這個(gè)概念,簡單理解薪伏,引用數(shù)據(jù)類型在拷貝時(shí)滚澜,就涉及到這個(gè)問題,核心是拷貝的是句柄還是嫁怀,對(duì)象本身设捐。此處拷貝a的值之后,對(duì)b的操作不會(huì)影響原來a的值塘淑,就應(yīng)該是深拷貝萝招。?
深拷貝和淺拷貝的區(qū)別就是:拷貝的是對(duì)象,還是對(duì)象的引用存捺,淺拷貝相當(dāng)于對(duì)象的指針被你拷貝過來了槐沼,而新指針指向的還是舊對(duì)象。
關(guān)聯(lián)數(shù)組
特點(diǎn):
????1. 關(guān)聯(lián)數(shù)組可以用來保存稀疏矩陣的元素捌治。當(dāng)你對(duì)一個(gè)非常大的地址空間尋址時(shí)岗钩,該數(shù)組只為實(shí)際寫入的元素分配空間,這種實(shí)現(xiàn)方法所需要的空間要小得多肖油。
????2. 其它軟件語言也有類似的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)兼吓,被稱為哈希(Hash)或者詞典(Dictionary),可以靈活賦予鍵值(key)和數(shù)值(value)森枪。簡單理解就像圖書館上的書视搏,根據(jù)地址尋找內(nèi)容。
關(guān)聯(lián)數(shù)組采用在方括號(hào)中放置數(shù)據(jù)類型的方式來進(jìn)行聲明疲恢,如:
????bit [63:0] assoc[ bit[63:0] ] ;? // 以64bit數(shù)據(jù)為索引凶朗,查找關(guān)聯(lián)數(shù)組中的64 bit的數(shù)據(jù)
????int age[string]; // 以字符串為索引,查找關(guān)聯(lián)數(shù)組中的int類型數(shù)據(jù)
????integer i_array[*];? // 未規(guī)定索引類型显拳,通配
????關(guān)聯(lián)數(shù)組初始化時(shí)使用 : '{ };? 在大括號(hào)內(nèi)填入 鍵值對(duì) 的信息棚愤,鍵值對(duì)用冒號(hào)“:”連接;
????????data = '{1:20, 2:21, 3:22};
關(guān)聯(lián)數(shù)組使用foreach遍歷:
????foreach(data[i])? begin
????????$display(“data[%0h] is %0h”,index, data[index]);
????end
隊(duì)列
????1. 隊(duì)列的聲明:q[$] = {1, 2, 3},隊(duì)列元素的標(biāo)號(hào)從0到$.
? ? 2. 隊(duì)列不需要new [ ] 去創(chuàng)建空間宛畦,一開始其空間為0瘸洛。
????3. 隊(duì)列的方法:
????????push_back() // 在隊(duì)列的末尾推入新元素;
? ? ? ? pop_front() // 在隊(duì)列的開頭推入新元素次和;
? ? ? ? insert(value, position) // 在某位置前插入元素value反肋;
? ? ? ? delete() // 刪除整個(gè)隊(duì)列。