轉一篇Systemverilog的一個牛人總結:
http://blog.sina.com.cn/s/blog_5e9b181a010188re.html
1、合并數組和非合并數組
1)合并數組:
存儲方式是連續的,中間沒有閑置空間。
例如,32bit的寄存器,可以看成是4個8bit的數據,或者也可以看成是1個32bit的數據。
表示方法:
數組大小和位,必須在變量名前指定,數組大小必須是【msb:lsb】
Bit[3:0] [7:0] bytes???;
2)非合并數組:
Bit [7:0] bytes?[0:3]???;或者 Bit [7:0] bytes?[4]???;
?
2、二維數組和合并數組識別:
合并數組:??bit [3:0] [7:0] arrys;???大小在變量名前面放得,且降序
二維數組:??int arrays[0:7] [0:3] ;??大小在變量名后面放得,可降序可升序
位寬在變量名前面,用于識別合并和非合并數組,位寬在后面,用于識別數組中元素個數。
?
3、非合并數組:
一般仿真器存放數組元素時使用32bit的字邊界,byte、shortint、int都放在一個字中。
非合并數組:字的地位存放變量,高位不用。
表示方法:
?Bit???[7:0] bytes;?
?
4、合并數組和非合并數組的選擇
(1)當需要以字節或字為單位對存儲單元操作。
(2)當需要等待數組中變化的,則必須使用合并數組。例如測試平臺需要通過存儲器數據的變化來喚醒,需要用到@,@只能用于標量或者合并數組。
? ? ? ? ?Bit[3:0] [7:0] barray[3]??; 表示合并數組,合并數組中有3個元素,每個元素時8bit,4個元素可以組成合并數組
? ? ? ? ?可以使用barry[0]作敏感信號。
?
5、動態數組
隨機事物不確定大小。
使用方法:數組在開始是空的,同時使用new[]來分配空間,在new[n]指定元素的個數。
int dyn[];
???Dyn = new[5];?????//分配5個元素空間
? ?Dyn.delete() ;?????//釋放空間
?
6、隊列
在隊列中增加或刪除元素比較方便。
?
7、關聯數組
當你需要建立一個超大容量的數組。關聯數組,存放稀疏矩陣中的值。
表示方法:
采用在方括號中放置數據類型的形式聲明:
Bit[63:0] assoc[bit[63:0]];
?
8、常量:
1)Verilog 推薦使用文本宏。
好處:全局作用范圍,且可以用于位段或類型定義
缺點:當需要局部常量時,可能引起沖突。
2)Parameter
???作用范圍僅限于單個module
3)Systemverilog:
???參數可以在多個模塊里共同使用,可以用typedef 代替單調乏味的宏。
?
9、可以在for循環中定義變量,作用范圍僅在循環內部
for(int i=0;i<10;i++)
array[i] =i;
?
10、任務、函數及void函數
1) 區別:
Verilog中task 和function最重要的區別是:task可以消耗時間而函數不能。函數中不能使用#100的延時或@的阻塞語句,也不能調用任務;
Systemverilog中函數可以調用任務,但只能在fork??joinnone生成的線程中。
2)使用:
???如果有一個不消耗時間的systemverilog任務,應該把它定義成void函數;這樣它可以被任何函數或任務調用。
??從最大靈活性角度考慮,所有用于調用的子程序都應該被定義成函數而非任務,以便被任何其它任務或函數調用。(因為定義成任務,函數調用任務很有限制)
?
11、 類靜態變量
作用:
1)類的靜態變量,可以被這個類的對象實例所共享。
當你想使用全局變量的時候,應該先想到創建一個類的靜態變量
靜態變量在聲明的時候初始化。
2)
類的每一個實例都需要從同一個對象獲取信息。
?
12、靜態方法
作用:
當靜態變量很多的時候,操作它們的代碼是一個很大的程序,可以用在類中創建一個靜態方法讀寫靜態變量,但是靜態方法不能讀寫非靜態變量。
l???????ref高級的參數類型
Ref 參數傳遞為引用而不是復制。Ref比 input 、output、inout更好用。
Function void print_checksum(const ref bit [31:0] a[ ]);
1)???????也可以不用ref進行數組參數傳遞,這時數組會被復制到堆棧區,代價很高。
2)???????用帶ref 進行數組參數傳遞,僅僅是引用,不需要復制;向子程序傳遞數組時,應盡量使用ref以獲得最佳性能,如果不希望子程序改變數組的值,可以使用const ref。
3)???????Ref參數,用ref 傳遞變量;可以在任務里修改變量而且,修改結果對調用它的函數可見,相對于指針的功能。
?