6. 使用者定義的型別
verilog不允許使用者定義新的資料型別。systemverilog通過使用typedef提供了一種方法來定義新的資料型別,這一點與c語言類似。使用者定義的型別可以與其它資料型別一樣地使用在宣告當中。例如:
typedef unsigned int uint;
uint a, b;
乙個使用者定義的資料型別可以在它的定義之前使用,只要它首先在空的typedef中說明,例如
typedef int48; // 空的typedef,在其他地方進行完整定義
int 48 c;
7. 列舉型別
在verilog語言中不存在列舉型別。識別符號必須被顯式地宣告成乙個線網、變數或引數並被賦值。systemverilog允許使用類似於c的語法產生列舉型別。乙個列舉型別具有一組被命名的值。預設情況下,值從初始值0開始遞增,但是我們可以顯式地指定初始值。列舉型別的例子如下:
enum rgb;
enum states;
我們還可以使用typedef為列舉型別指定乙個名字,從而允許這個列舉型別可以在許多地方使用。例如:
typedef enum boolean;
boolean ready;
boolean test_complete;
8. 結構體和聯合體
在verilog語言中不存在結構體或聯合體,而結構體或聯合體在將幾個宣告組合在一起的時候非常有用。systemverilog增加了結構體和聯合體,它們的宣告語法類似於c。
struct ir;
union n;
結構體或聯合體中的域可以通過在變數名和域名字之間插入句點(.)來引用:
ir.opcode = 1; // 設定ir變數中的opcode域
n.f = 0.0; // 將n設定成浮點數的值
我們可以使用typedef為結構體或聯合體的定義指定乙個名字。
typedef struct instruction; // 命名的結構體
instruction ir; // 結構體例項
乙個結構體可以使用值的級聯來完整地賦值,例如:
instruction = ;
結構體可以作為乙個整體傳遞到函式或任務,也可以從函式或任務傳遞過來,也可以作為模組埠進行傳遞。
9. 陣列 在
verilog
中可以宣告乙個陣列型別,
reg和線網型別還可以具有乙個向量寬度。在乙個物件名前面宣告的尺寸表示向量的寬度,在乙個物件名後面宣告的尺寸表示陣列的深度。例如:
reg[7:0] r1 [1:256]; // 256個8
位的變數
在systemverilog
中我們使用不同的術語表示陣列:使用「壓縮陣列(
packed array
)」這一術語表示在物件名前宣告尺寸的陣列;使用「非壓縮陣列(
unpacked array
)」這一術語表示在物件名後面宣告尺寸的陣列。壓縮陣列可以由下面的資料型別組成:
bit、
logic
、reg
、wire
以及其它的線網型別。無論是壓縮陣列還是非壓縮陣列都可以宣告成多維的尺寸。
bit[7:0] a; //
乙個一維的壓縮陣列
bitb [7:0]; //
乙個一維的非壓縮陣列
bit[0:11] [7:0] c; //
乙個二維的壓縮陣列
bit[3:0] [7:0] d [1:10]; //
乙個包含
10個具有4個
8位位元組的壓縮陣列的非壓縮陣列
非壓縮尺寸在壓縮尺寸之前引用,這就允許將整個壓縮陣列作為乙個單一的元素進行引用。在上面的例子中,
d[1]
引用非壓縮陣列的乙個單一元素,這個元素是乙個包含
4個位元組的陣列。
10.
在為命名的塊中宣告
verilog
允許變數在乙個命名的
begin-end
或fork-join
語句組中宣告。相對於語句組來說,這些變數是本地的,但它們可以被層次化地引用。在
systemverilog
中,既可以在命名的塊中也可以在未命名的塊中宣告。在未命名的塊中,不能夠使用層次名來訪問變數。所有的變數型別,包括使用者定義的型別、列舉型別、結構體和聯合體都可以在
begin-end
或fork-join
語句組中宣告。
11. 常量
在verilog
中有三種特性型別的常量:
parameter
、specparam
和localparam
。而在systemverilog
中,允許使用
const
關鍵字宣告常量。例如:
const char
colon = 「:」;
12.
可重定義的資料型別
systemverilog
擴充套件了verilog
的parameter
,使其可以包含型別。這個強大的功能使得乙個模組中的資料型別在模組的每乙個例項中重新定義。例如:
module
foo;
# (parameter type var_type = shortint;)
(input logic [7:0] i, output logic [7:0] o);
var_type j = 0; //
如果不重新定義,
j的資料型別為
shortint …
endmodule
module
bar;
logic [3:0] i, o;
foo #(.var_type(int)) u1 (i, o); //
重新將var_type
定義成int型別
endmodule
13.
模組埠連線 在
verilog
中,可以連線到模組埠的資料型別被限制為線網型別以及變數型別中的
reg、
integer
和time
。而在systemverilog
中則去除了這種限制,任何資料型別都可以通過埠傳遞,包括實數、陣列和結構體。
14.
字母值
在verilog
中,當指定或賦值字母值的時候存在一些限制。而
systemverilog
則為字母值如何指定作了下面的增強: l
乙個字母值的所有位均可以使用`0、
`1、`z或
`x作相同的填充。這就允許填充乙個任意寬度的向量,而無需顯式地指定向量的寬度,例如:
bit
[63:0] data;
data = `1; //
將data
的所有位設定成1
l乙個字串可以賦值成乙個字元陣列,象
c語言一樣加入乙個空結束符。如果尺寸不同,它象
c閱讀全文(112)
SystemVerilog語言簡介 四
23.動態過程 verilog 通過使用 fork jion 提供了一種靜態的併發過程。每乙個分支都是乙個分離的 並行的過程。fork jion 中任何語句的執行必須在組內的每乙個過程完成後才會執行。例如 initial begin fork send packet task 1,255,0 sen...
(35)SystemVerilog語言編寫呼吸燈
1 章節目錄 2 fpga簡介 3 systemverilog簡介 4 systemverilog語言編寫呼吸燈 5 本節結束 fpga field programmable gate array 是在pal gal等可程式設計器件的基礎上進一步發展的產物。它是作為專用積體電路 asic 領域中的一...
9 SystemVerilog語言編寫SPI接收
1 章節目錄 2 fpga簡介 3 systemverilog簡介 4 systemverilog語言編寫spi接收 5 本節結束 fpga field programmable gate array 是在pal gal等可程式設計器件的基礎上進一步發展的產物。它是作為專用積體電路 asic 領域中...