关于数组的内容
關于數組的內容
Verilog數組聲明的基本語法
<data_type><vector_size><array_name><array_dimension> 例如: reg[15:0] RAM [0:4095];//儲存器數組SystemVerilog允許任何數據類型的非壓縮數組
SystemVerilog將非壓縮數組的聲明進行了擴展,可以使用Verilog的event數據類型,以及所有SystemVerilog數據類型,包括logic、bit、int、shortreal和real,以及使用typedef可以聲明用戶自定義類型非壓縮數組,包括使用struct和enum類型。
SystemVerilog可以引入整個數組或其中一段
SystemVerilog也加入引用整個非壓縮數組以及一段元素的功能。一段就是在數組同一維內一個或多個鄰近的元素。這樣可以將整個數組或者數組待定維的內容復制到另一個數組。
注意:復制非壓縮數組時,等號的左邊和右邊必須有同樣的構架和類型。
SystemVerilog數組也可以指定尺寸
SystemVerilog允許非壓縮數組只指定維度大小,而不用指定開始和結束地址
2、壓縮數組
SystemVerilog將向量聲明看作是壓縮數組,一個Verilog向量就是一個一維壓縮數組。
壓縮數組沒有間隙
SystemVerilog對壓縮數組中的元素如何儲存進行了規定。整個數組的儲存必須是位連續的,和向量的儲存一樣,壓縮的每一維都是向量的字段。
壓縮數組的數據類型
注意:只有位形式的數據類型才可以被壓縮
壓縮數組只可能由位形式的數據類型組成,包括logic、bit和reg、其他壓縮數組、壓縮結構體及壓縮聯合體。壓縮數組還可以由任何Verilog線網類型(wire、wand、tri、triand、trior、tri0、tri1或trireg)組成。
引用壓縮數組
壓縮數組可以作為整體、位選擇或部分選擇引用。多維壓縮數組也可以引用其中的一段。一段就是數組中一個或是多個鄰近的維度。
壓縮數組的操作
任何向量操作都可以用于壓縮數組
由于壓縮數組像向量一樣儲存,所以對于Verilog向量的任何合法操作都可以用于壓縮數組,包括選取壓縮數組中的一位和一部分、拼接操作、算術操作、關系操作、位操作以及邏輯操作、
3、使用壓縮和非壓縮數組
使用非壓縮數組模擬儲存器,以及抽象數據類型
非壓縮數組用于建模
- 下列數據類型的數組:byte、int、integer、real、非壓縮結構體、非壓縮聯合體以及其他非位形式的數據類型。
- 通常每次只訪問一個元素的數組,例如RAM和ROM
壓縮數組用于建模
- 由只有1位的數據類型組成的向量
- 需要子段訪問的向量
4、聲明對數組進行初始化
壓縮數組初始化
壓縮數組的初始化同向量一樣
賦值可以是一個常數、常數的拼接或常數的復制
非壓縮數組初始化
非壓縮數組使用一個值序列初始化
對于非壓縮數組,在聲明時可以使用’{}內的值序列進行初始化。
SystemVerilog為值序列的聲明提供了一種便捷方式。使用方式類似于Verilog的復制符,一個維度內的值序列可以重復任意次,復制操作符前面不用加撇號
int d1[0:1][0:3] = '{2{7,3,0,5},}; //d1[0][0] = 7; //d2[0][1] = 3; //d1[0][2] = 0; //d1[0][3] = 5;//d1[1][0] = 7; //d1[1][1] = 3; //d1[1][2] = 0; //d1[1][3] = 5;注意’{}列表操作符和’{n{}}復制操作符不同于Verilog的拼接操作符{},以及復制操作符{n{}}。
{}的使用有兩種方式
當對非壓縮數組進行初始化時,大括號’{}表示一個值序列。作為一個值序列,每個都按照Verilog復制語句規則賦給相應的元素,也就是說,無位數的文本值也可以在序列中指定,與實數值相同。
為非壓縮數組指定默認值
數組可以被初始化有一個默認值
默認值在’{}中使用關鍵字default指定,指定的值與關鍵字用冒號隔開。指定的值必須與數組的數據類型匹配。如果指定的值可以轉換成數組的數據類型,也算是匹配的。
5、數組賦值
非壓縮數組賦值
Verilog語言支持兩種方式的非壓縮數組賦值
- 給一個元素賦值
- 給一個元素的1位或者部分賦值
SystemVerilog擴展了兩種新的非壓縮數組賦值方法
- 用一個值序列給整個數組賦值
- 用一個值序列給數組的一段賦值
值序列是在大括號’{}中指定的。
byte a[0:3][0:3]; a[1][0] = 8'h5;//賦值給一個元素 a = '{'{0,1,2,3}, '{4,5,6,7}, '{7,6,5,4}, '{3,2,1,0}};//將一個值序列賦給整個數組 a[3] = '{'hF,'hA,'hC,'hE};//將一個值序列賦給數組的一段使用關鍵字default也可以給非壓縮數組指定一個默認值。和過程賦值一樣,數組的不同部分也可以置成不同的默認值。
always@(posedge clock,negedge resetN)if(!resetN)begina = '{default:0};//初始整個數組a[0] = '{default:4};//初始數組的一段endelse begin...end壓縮數組賦值
多維壓縮數組是有子域的向量
壓縮數組是向量(可能有子域)。
- 數組的一個元素
- 整個數組(向量)
- 數組的一部分
- 數組的一段(多個相鄰的子域)
非壓縮數組帶非壓縮數組
允許非壓縮數組到非壓縮數組的賦值
只要兩個非壓縮數組具有相同的維數和元素位數以及相同的類型,才可以直接賦值。通過將一個數組的每個元素復制到目標數組的相應元素,就實現了賦值。兩個數組中的元素編號不必相同。但數組的結構和類型必須完全匹配。
不同尺寸的非壓縮數組間的賦值需要轉換
非壓縮數組到壓縮數組的賦值需要轉換。在非壓縮數組中,每一個元素都單獨儲存而不能看做是一個向量。然而非壓縮數組可以通過位流轉換對壓縮數組賦值。
壓縮數組到非壓縮數組的賦值需要轉換。壓縮數組被看做一個向量,而向量無法直接賦給非壓縮數組,因為壓縮數組中的元素是獨立儲存的。但是通過位流轉換操作可以實現賦值。
7、使用位流轉換復制數組和結構體
位流轉換將數組換成一個臨時位向量。
位流轉換將非壓縮數組臨時地轉換成向量形式位流。數組中元素的分離特性丟失了–臨時向量只是簡單的位流。然后臨時向量可以賦值給其他數組。源數組和目標數組的位數必須相同,但兩個數組中每個元素的寬度可以不同。
位流轉換機制主要用于一下情況:
- 把非壓縮數組賦值給不同結構的非壓縮數組
- 把非壓縮數組賦值給壓縮數組
- 把壓縮數組賦值給非壓縮數組
- 把結構體賦值給壓縮或非壓縮數組
- 把定位或動態寬度的數組賦值給動態寬度數組
- 把結構體賦值給另一個不同結構的結構體
位流轉換使用Systemverilog靜態轉換操作符。轉換需要至少目標數組是用typedef表示的自定義類型。
typedef int data_t [3:0][7:0];//非壓縮類型 data_t a;//非壓縮數組 int b[1:0][3:0][3:0];//非壓縮數組 a = data_t'(b);//將非壓縮數組賦給不同結構的非壓縮數組轉換操作通過將源數組(或結構體)轉換為臨時向量表達式(位流),然后將位數組賦給目標數組的各個元素實現。賦值是從左到右進行的。例如源位流最左邊的幾位賦給目標數組的第一個元素,接下來的幾位賦給第二個元素,以此類推。
8、由數組構成的數組
數組可以是壓縮和非壓縮的混合維度
由數組構成的數組的索引
非壓縮維度的索引先于壓縮維度
當對由數組組成的數組進行索引時,先引用的是非壓縮的維度,從左到右。其次引用壓縮的(向量部分)維度,從左到右。
9、數組中使用用戶自定義類型
數組可以包含用戶自定義類型
用戶自定義類型可以作為數組的元素。
用于數組元素類型聲明的用戶自定義類型也可以是數組,這樣可以創建復合數組。
typedef logic [3:0] nibble;//壓縮數組 nibble [31:0] big_word;//壓縮數組//等同于 logic [31:0][3:0] big_word; //由用戶自定義類型建立的復合數組的例子 typedef logic [3:0] nibble;//壓縮數組 typedef nibble nib_array[0:3];//非壓縮 nib_array compound_array[0:7];//非壓縮//等同于 logic [3:0] compound_array[0:7][0:3];10、數組通過端口及任務和函數的傳送
Systemverilog允許非壓縮數組作為端口和自變量
通過端口,或作為任務和函數的自變量傳送數組時,端口或任務/函數的形式自變量必須聲明為數組。數組通過端口傳送的規則和約束與數組賦值給其他數組的規則相同。
11、結構體和聯合體構成的數組
數組可以包含結構體或者聯合體
壓縮和非壓縮數組的元素可以是結構體和聯合體。在壓縮數組中,結構體和聯合體也必須是壓縮的。
12、結構體和聯合體中的數組
結構體和聯合體可以包含數組
結構體和聯合體可以包含壓縮或非壓縮數組。壓縮的結構體和聯合體只可以包含壓縮數組。
總結
- 上一篇: 逆天!疑似魅族20 Pro外观设计曝光
- 下一篇: 三电机真恐怖!特斯拉Model S Pl