SystemVerilog語言簡介(二)
6. 用戶定義的類型
Verilog不允許用戶定義新的數據類型。SystemVerilog通過使用typedef提供了一種方法來定義新的數據類型,這一點與C語言類似。用戶定義的類型可以與其它數據類型一樣地使用在聲明當中。例如:
typedef unsigned int uint;
uint a, b;
一個用戶定義的數據類型可以在它的定義之前使用,隻要它首先在空的typedef中說明,例如
typedef int48; // 空的typedef,在其他地方進行完整定義
int48 c;
7. 枚舉類型
在Verilog語言中不存在枚舉類型。標識符必須被顯式地聲明成一個線網、變量或參數並被賦值。SystemVerilog允許使用類似於C的語法產生枚舉類型。一個枚舉類型具有一組被命名的值。缺省情況下,值從初始值0開始遞增,但是我們可以顯式地指定初始值。枚舉類型的例子如下:
enum {red, yellow, green} RGB;
enum {WAIT=2'b01, LOAD, DONE} states;
我們還可以使用typedef為枚舉類型指定一個名字,從而允許這個枚舉類型可以在許多地方使用。例如:
typedef enum {FALSE=1'b0, TRUE} boolean;
boolean ready;
boolean test_complete;
8. 結構體和聯合體
在Verilog語言中不存在結構體或聯合體,而結構體或聯合體在將幾個聲明組合在一起的時候非常有用。SystemVerilog增加了結構體和聯合體,它們的聲明語法類似於C。
struct {
reg [15:0] opcode;
reg [23:0] addr;
} IR;
union {
int I;
shortreal f;
} N;
結構體或聯合體中的域可以通過在變量名和域名字之間插入句點(.)來引用:
IR.opcode = 1; // 設置IR變量中的opcode域
N.f = 0.0; // 將N設置成浮點數的值
我們可以使用typedef為結構體或聯合體的定義指定一個名字。
typedef struct {
reg [7:0] opcode;
reg [23:0] addr;
} instruction; // 命名的結構體
instruction IR; // 結構體實例
一個結構體可以使用值的級聯來完整地賦值,例如:
instruction = {5, 200};
結構體可以作為一個整體傳遞到函數或任務,也可以從函數或任務傳遞過來,也可以作為模塊端口進行傳遞。
9. 數組
在Verilog中可以聲明一個數組類型,reg和線網類型還可以具有一個向量寬度。在一個對象名前麵聲明的尺寸表示向量的寬度,在一個對象名後麵聲明的尺寸表示數組的深度。例如:
reg [7:0] r1 [1:256]; // 256個8位的變量
在SystemVerilog中我們使用不同的術語表示數組:使用“壓縮數組(packed array)”這一術語表示在對象名前聲明尺寸的數組;使用“非壓縮數組(unpacked array)”這一術語表示在對象名後麵聲明尺寸的數組。壓縮數組可以由下麵的數據類型組成:bit、logic、reg、wire以及其它的線網類型。無論是壓縮數組還是非壓縮數組都可以聲明成多維的尺寸。
bit [7:0] a; // 一個一維的壓縮數組
bit b [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)
最後更新:2017-04-03 14:53:40