原文地址;算法
http://blog.csdn.net/gtatcs/article/details/8970489數組
SystemVerilog語言簡介多線程
SystemVerilog是一種硬件描述和驗證語言(HDVL),它基於IEEE1364-2001 Verilog硬件描述語言(HDL),並對其進行了擴展,包括擴充了C語言數據類型、結構、壓縮和非壓縮數組、 接口、斷言等等,這些都使得SystemVerilog在一個更高的抽象層次上提升了設計建模的能力。SystemVerilog由Accellera開發,它主要定位在芯片的實現和驗證流程上,併爲系統級的設計流程提供了強大的鏈接能力。下面咱們從幾個方面對SystemVerilog所做的加強進行簡要的介紹,指望可以經過這個介紹使你們對SystemVerilog有一個歸納性的瞭解。併發
1. 接口(Interface)函數
Verilog模塊之間的鏈接是經過模塊端口進行的。爲了給組成設計的各個模塊定義端口,咱們必須對指望的硬件設計有一個詳細的認識。不幸的是,在設計的早期,咱們很難把握設計的細節。並且,一旦模塊的端口定義完成後,咱們也很難改變端口的配置。另外,一個設計中的許多模塊每每具備相同的端口定義,在Verilog中,咱們必須在每一個模塊中進行相同的定義,這爲咱們增長了無謂的工做量。工具
SystemVerilog提供了一個新的、高層抽象的模塊鏈接,這個鏈接被稱爲接口(Interface)。接口在關鍵字interface和endinterface之間定義,它獨立於模塊。接口在模塊中就像一個單一的端口同樣使用。在最簡單的形式下,一個接口能夠認爲是一組線網。例如,能夠將PCI總線的全部信號綁定在一塊兒組成一個接口。經過使用接口,咱們在進行一個設計的時候能夠不須要首先創建各個模塊間的互連。隨着設計的深刻,各個設計細節也會變得愈來愈清晰,而接口內的信號也會很容易地表示出來。當接口發生變化時,這些變化也會在使用該接口的全部模塊中反映出來,而無需更改每個模塊。下面是一個接口的使用實例:性能
interface chip_bus;// 定義接口 wireread_request, read_grant; wire [7:0]address, data; endinterface: chip_bus module RAM(chip_bus io, // 使用接口 inputclk); //可使用io.read_request引用接口中的一個信號 endmodule module CPU(chip_busio, input clk); ... endmodule module top; reg clk = 0; chip_busa; // 實例接口 //將接口鏈接到模塊實例 RAM mem(a,clk); CPU cpu(a,clk); endmodule
實際上,SystemVerilog的接口不只僅能夠表示信號的綁定和互連。因爲SystemVerilog的接口中能夠包含參數、常量、變量、結構、函數、任務、initial塊、always塊以及連續賦值語句,因此SystemVerilog的接口還能夠包含內建的協議檢查以及被使用該接口的模塊所共用的功能。優化
2. 全局聲明和語句ui
在Verilog中,除了一個模塊能夠做爲模塊實例引用其餘模塊外,並不存在一個全局空間。另外,Verilog容許任意數目的頂層模塊,所以會產生毫無關聯的層次樹。編碼
SystemVeriog增長了一個被稱爲$root的隱含的頂級層次。任何在模塊邊界以外的聲明和語句都存在於$root空間中。全部的模塊,不管它處於哪個設計層次,均可以引用$root中聲明的名字。這樣,若是某些變量、函數或其它信息被設計中的全部模塊共享,那麼咱們就能夠將它們做爲全局聲明和語句。全局聲明和語句的一個使用實例以下:
reg error_flag; // 全局變量 function compare(...); // 全局函數 always@(error_flag) // 全局語句 ... module test; chip1 u1(...) endmodule module chip1(...); FSM u2(...); always@(data) error_flag= compare(data, expected); endmodule module FSM(...); ... always @(state) error_flag= compare(state, expected); endmodule
3. 時間單位和精度
在Verilog中,表示時間的值使用一個數來表示,而不帶有任什麼時候間單位。例如:
forever #5clock= ~clock;
從這一句中咱們沒法判斷5表明的是5ns? 5ps? 仍是其餘。Verilog的時間單位和精度是做爲每個模塊的屬性,並使用編譯器指令`timescale來設置。使用這種方法具備固有的缺陷,由於編譯器指令的執行依賴於源代碼的編譯順序,編譯器老是將它遇到的最後一個`timescale設置的時間單位和精度做爲以後的標準。那麼,假若有些模塊以前沒有使用`timescale設置時間單位和精度,這就有可能出現同一個源代碼的不一樣仿真會出現不一樣結果的狀況。
SystemVerilog爲了控制時間單位加入了兩個重要的加強。首先,時間值能夠顯式地指定一個單位。時間單位能夠是s、ms、ns、ps或fs。時間單位做爲時間值的後綴出現。例如:
forever #5nsclock= ~clock;
其次,SystemVerilog容許使用新的關鍵字(timeunits和timeprecision)來指定時間單位和精度。這些聲明能夠在任何模塊中指定,同時也能夠在$root空間中全局指定。時間單位和精度必須是10的冪,範圍能夠從s到fs。例如:
timeunits 1ns;
timeprecision 10ps;
4. 抽象數據類型
Verilog提供了面向底層硬件的線網、寄存器和變量數據類型。這些類型表明了4態邏輯值,一般用來在底層上對硬件進行建模和驗證。線網數據類型還具備多個強度級別,而且可以爲多驅動源的線網提供解析功能。
SystemVerilog包括了C語言的char和int數據類型,它容許在Verilog模型和驗證程序中直接使用C和C++代碼。VerilogPLI再也不須要集成總線功能模型、算法模型和C函數。SystemVerilog還爲Verilog加入了幾個新的數據類型,以便可以在更抽象的層次上建模硬件。
l char:一個兩態的有符號變量,它與C語言中的char數據類型相同,能夠是一個8位整數(ASCII)或short int(Unicode);
l int:一個兩態的有符號變量,它與C語言中的int數據類型類似,但被精確地定義成32位;
l shortint:一個兩態的有符號變量,被精確地定義成16位;
l longint:一個兩態的有符號變量,它與C語言中的long數據類型類似,但被精確地定義成64位;
l byte:一個兩態的有符號變量,被精確地定義成8位;
l bit:一個兩態的能夠具備任意向量寬度的無符號數據類型,能夠用來替代Verilog的reg數據類型;
l logic:一個四態的能夠具備任意向量寬度的無符號數據類型,能夠用來替代Verilog的線網或reg數據類型,但具備某些限制;
l shortreal:一個兩態的單精度浮點變量,與C語言的float類型相同;
l void:表示沒有值,能夠定義成一個函數的返回值,與C語言中的含義相同。
SystemVerilog的bit和其餘數據類型容許用戶使用兩態邏輯對設計建模,這種方法對仿真性能更有效率。因爲Verilog語言沒有兩態數據類型,所以許多仿真器都經過將這種功能做爲仿真器的一個選項提供。這些選項不可以在全部的仿真器之間移植,並且在須要時用三態或四態邏輯的設計中強制使用兩態邏輯還具備反作用。SystemVerilog的bit數據類型可以極大改進仿真器的性能,同時在須要的時候仍然可使用三態或四態邏輯。經過使用具備肯定行爲的數據類型來代替專有的仿真器選項,兩態模型可以在全部的SystemVerilog仿真器間移植。
SystemVerilog的logic數據類型比Verilog的線網和寄存器數據類型更加靈活,它使得在任何抽象層次上建模硬件都更加容易。logic類型可以如下面的任何一種方法賦值:
l 經過任意數目的過程賦值語句賦值,可以替代Verilog的reg類型;
l 經過單一的連續賦值語句賦值,可以有限制地替代Verilog的wire類型;
l 鏈接到一個單一原語的輸出,可以有限制地替代Verilog的wire類型;
因爲logic數據類型可以被用來替代Verilog的reg或wire(具備限制),這就使得可以在一個更高的抽象層次上建模,而且隨着設計的不斷深刻可以加入一些設計細節而沒必要改變數據類型的聲明。logic數據類型不會表示信號的強度也不具備線邏輯的解析功能,所以logic數據類型比Verilog的wire類型更能有效地仿真和綜合。
5. 有符號和無符號限定符
缺省狀況下,Verilog net和reg數據類型是無符號類型,integer類型是一個有符號類型。Verilog-2001標準容許使用signed關鍵字將無符號類型顯式地聲明成有符號類型。SystemVerilog加入了類似的能力,它能夠經過unsigned關鍵字將有符號數據類型顯式地聲明成有無符號數據類型。例如:
intunsigned j;
值得注意的是unsigned在Verilog中是一個保留字,但並無被Verilog標準使用。
6. 用戶定義的類型
Verilog不容許用戶定義新的數據類型。SystemVerilog經過使用typedef提供了一種方法來定義新的數據類型,這一點與C語言相似。用戶定義的類型能夠與其它數據類型同樣地使用在聲明當中。例如:
typedefunsigned 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爲枚舉類型指定一個名字,從而容許這個枚舉類型能夠在許多地方使用。例如:
typedefenum {FALSE=1’b0, TRUE} boolean;
boolean ready;
booleantest_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爲結構體或聯合體的定義指定一個名字。
typedefstruct{
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 charcolon= 「:」;
12. 可重定義的數據類型
SystemVerilog擴展了Verilog的parameter,使其能夠包含類型。這個強大的功能使得一個模塊中的數據類型在模塊的每個實例中從新定義。例如:
module foo; # (parameter typeVAR_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、`一、`z或`x做相同的填充。這就容許填充一個任意寬度的向量,而無需顯式地指定向量的寬度,例如:
bit [63:0] data;
data = `1; //將data的全部位設置成1
l 一個字符串能夠賦值成一個字符數組,象C語言同樣加入一個空結束符。若是尺寸不一樣,它象C中同樣進行左調整,例如:
char foo[0:12] = 「hello worldn」;
l 加入了幾個特殊的串字符:
v:垂直TAB
f:換頁
a:響鈴
x02:用十六進制數來表示一個ASCII字符
l 數組可使用相似於C初始化的語法賦值成字符值,但它還容許複製操做符。括號的嵌套必須精確地匹配數組的維數(這一點與C不一樣),例如:
int n[1: 2] [1:3] = {{0, 1, 2}, {3{4}}};
15. 強制類型轉換
Verilog不能將一個值強制轉換成不一樣的數據類型。SystemVerilog經過使用<type>’操做符提供了數據類型的強制轉換功能。這種強制轉換能夠轉換成任意類型,包括用戶定義的類型。例如:
int’ (2.0 *3.0) // 將結果轉換爲int類型
mytype’ (foo) // 將foo轉換爲mytype類型
一個值還能夠經過在強制轉換操做符前指定一個10進制數來轉換成不一樣的向量寬度,例如:
17’(x- 2) // 將結果轉換爲17位寬度
也能夠將結果轉換成有符號值,例如:
signed’(x) // 將x轉換爲有符號值
16. 操做符
Verilog沒有C語言的遞增(++)和遞減(--)操做符。而SystemVerilog加入了幾個新的操做符:
l ++和--:遞增和遞減操做符;
l +=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=、<<<=和>>>=賦值操做符;
17. 惟一性和優先級決定語句
在Verilog中,若是沒有遵循嚴格的編碼風格,它的if-else和case語句會在RTL仿真和RTL綜合間具備不一致的結果。若是沒有正確使用full_case和parallel_case綜合指令還會引發一些其它的錯誤。
SystemVerilog可以顯式地指明何時一條決定語句的分支是惟一的,或者何時須要計算優先級。咱們能夠在if或case關鍵字以前使用unique或requires關鍵字。這些關鍵字能夠向仿真器、綜合編譯器、以及其它工具指示咱們指望的硬件類型。工具使用這些信息來檢查if或case語句是否正確建模了指望的邏輯。例如,若是使用unique限定了一個決定語句,那麼在不但願的case值出現的時候仿真器就可以發佈一個警告信息。
bit [2:0]a; unique if((a==0) || (a==1)) y= in1; else if (a==2) y=in2; else if (a==4) y=in3; // 值三、五、六、7會引發一個警告 priorityif (a[2:1]==0) y = in1; // a是0或1 else if (a[2]==0) y = in2; // a是2或3 else y = in3; // 若是a爲其餘的值 unique case (a) 0, 1: y = in1; 2: y = in2; 4: y = in3; endcase // 值三、五、六、7會引發一個警告 prioritycasez(a) 2’b00?: y = in1; // a是0或1 2’b0?? : y = in2; // a是2或3 default : y = in3; //若是a爲其餘的值 endcase
18. 底部檢測的循環
Verilog包含for、while和repeat循環,這幾個循環都是在循環的起始處檢測循環條件。SystemVerilog加入了一個do-while循環,這種循環在執行語句的結尾處檢測循環條件。
19. 跳轉語句
在語句的執行過程當中,C語言提供了幾種方式來跳轉到新的語句,包括:return、break、continue和goto。在Verilog中除了經過使用disable語句跳轉到語句組的尾部外,沒有提供任何其它跳轉語句。使用disable語句執行停止和繼續功能要求加入塊的名字,而且會產生不直觀的代碼。SystemVerilog加入了C語言的break和continue關鍵字,這兩個關鍵字不要求使用塊名字。另外,SystemVerilog還加入了一個return關鍵字,它能夠用來在任何執行點上退出一個任務或函數。
l break:退出一個循環,與C語言相同;
l continue:跳轉到一個循環的尾部,與C語言相同;
l return 表達式:退出一個函數;
l return:退出一個任務或void類型的函數。
SystemVerilog沒有包含C語言中的goto語句。
20. 塊名字和語句標籤
在Verilog中,咱們能夠經過在begin或fork關鍵字以後指定名字來爲begin-end或fork-jion語句指定名字。這個指定的名字表明整個語句塊。SystemVerilog還容許在end或jion關鍵字以後指定一個匹配的塊名字。這種機制很容易將end或jion與對應的begin或fork聯繫起來,尤爲是在一個長的塊或嵌套的塊中。塊結尾處的名字是可選的,但若是使用的話,它必須與塊起始處的名字相同。例如:
begin: foo // 在begin以後的塊名字
…
fork: bar // 具備名字的嵌套的塊
…
jion: bar // 必須具備相同的名字
…
end: foo // 必須具備相同的名字
SystemVerilog還容許像C語言同樣爲單個語句設置標籤。語句標籤放置在語句的前面,用來標識這條語句。例如:
initialbegin
test1: read_enable = 0;
…
test2: for (i=0; i<=255; i++)
…
end
21. 對事件控制的加強
Verilog使用@標記來控制基於特定事件的執行流,SystemVerilog加強了@事件控制。
l 有條件的事件控制
@標記的一個基本應用就是推斷一個具備使能輸入的鎖存器。下面的例子演示了一個鎖存器建模的基本風格。
always @(data or en)
if (en)y<=data;
這種編碼風格對仿真來講是效率低下的,由於即便在使能輸入無效的時候,數據輸入的每次改變都會觸發事件控制。
SystemVerilog在事件控制中加入了一個iff條件。只有iff條件爲真的條件下,事件控制纔會被觸發。經過將使能判斷移入到事件控制裏面,使得只有在鎖存器輸出可以改變的時候事件控制纔會被觸發。例如:
always @(a or en iff en==1)
y<=a;
l 事件控制中的表達式
Verilog容許在@事件控制列表中使用表達式,例如:
always @((a * b))
always @(memory[address])
在第一個例子中,是當操做數發生改變的時候仍是隻有當運算結果發生改變的時候纔會觸發事件控制?在第二個例子中,是當memory的地址發生變化的時候仍是隻有當memory的值發生變化的時候纔會觸發事件控制?當@事件控制中包含表達式的時候,IEEE Verilog標準容許仿真器進行不一樣的優化。這就可能致使在不一樣的仿真器間有不一樣的仿真結果,可能還會致使仿真與綜合之間的結果不一致。SystemVerilog加入了一個changed關鍵字,在事件控制列表中它被用做一個修飾符。@(changed (表達式))可以顯式地定義只有當表達式的結果發生改變的時候纔會觸發事件控制。例如:
always @(changed (a * b))
always @(changed memory[address])
l 事件控制中的賦值
Verilog不容許在事件控制中使用賦值。SystemVerilog容許在事件控制中使用賦值表達式。事件控制僅僅敏感於賦值表達式右側的變化。例如:
always @(y = a * b)
22. 新的過程
Verilog使用always過程來表示時序邏輯、組合邏輯和鎖存邏輯的RTL模型。綜合工具和其它軟件工具必須根據過程起始處的事件控制列表以及過程內的語句來推斷always過程的意圖。這種推斷會致使仿真結果和綜合結果之間的不一致。SystemVerilog增長了三個新的過程來顯式地指示邏輯的意圖。
l always_ff:表示時序邏輯的過程;
l always_comb:表示組合邏輯的過程;
l always_latch:表示鎖存邏輯的過程。
例如:
always_comb@(aor b or sel) begin
if (sel) y = a;
else y = b;
end
軟件工具可以檢查事件控制敏感列表和過程的內容來保證邏輯的功能匹配過程的類型。例如,工具可以檢查一個always_comb過程可以敏感過程內讀取的全部外部值,對邏輯的每個分支的相同變量進行賦值,而且檢查分支是否覆蓋了全部可能的條件。若是任何一個條件沒有知足,軟件工具均會報告該過程沒有正確建模組合邏輯。
23. 動態過程
Verilog經過使用fork-jion提供了一種靜態的併發過程。每個分支都是一個分離的、並行的過程。fork-jion中任何語句的執行必須在組內的每個過程完成後纔會執行。例如:
initialbegin
fork
send_packet_task (1,255, 0);
send_packet_task (7,128, 5);
watch_result_task (1,255, 0);
watch_result_task (7,128, 5);
jion // 全部的任務必須完成後纔會到達這裏
end
SystemVerilog經過process關鍵字加入了一個新的、動態的過程。它爲一個過程產生分支,而後繼續執行而無需等待其餘過程完成。過程不會阻塞過程或任務內的語句執行。這種方式可以建模多線程的過程。例如:
initialbegin
process send_packet_task (1,255, 0);
processsend_packet_task(7, 128, 5);
processwatch_result_task(1, 255, 0);
processwatch_result_task(7, 128, 5);
end //全部的過程並行運行
24. 任務和函數加強
SystemVerilog爲Verilog的任務和函數做了幾個加強。
l 靜態和自動的存儲
缺省狀況下,在Verilog任務或函數內的全部存儲都是靜態的。Verilog-2001容許將任務和函數聲明成自動的。在SystemVerilog中:(1). 在一個靜態任務和函數內的特定數據能夠顯式地聲明成自動的。聲明成自動的數據在塊中具備完整的生命週期,而且在任務和函數調用的入口處初始化;(2). 在一個自動的任務或函數中的特定數據能夠顯式地聲明成靜態的。自動的任務或函數中聲明成靜態的數據在一個塊的本地範圍內具備靜態的生命週期。
l 從任何點返回
Verilog在一個任務或函數中執行到endtask或endfunction關鍵字的時候返回。函數的返回值是給函數名賦的最後一個值。SystemVerilog加入了一個return關鍵字,使用這個關鍵字,一個任務或函數能夠在任何點上返回。
l 多語句
Verilog要求一個任務或函數只具備一個語句或語句塊。多條語句必須組合到一個單一的begin-end或fork-jion塊中。SystemVerilog去除了這種限制。所以,多條語句能夠在一個任務或函數中列出而無需使用的begin-end或fork-jion。每有分組的語句就像在begin-end中同樣順序執行。咱們還能夠產生一個沒有語句的任務或函數定義。
l void函數
Verilog要求一個函數具備一個返回值,函數的調用接收這個返回值。SystemVerilog加入了一個void數據類型,這個數據類型能夠做爲一個函數的返回值類型。void函數能夠像Verilog任務同樣進行調用,而無需接收一個返回值。void函數和任務的差異在於函數存在幾個限制,例如沒有時間控制等。
l 函數的輸入和輸出
Verilog標準要求一個函數至少具備一個輸入而且函數只能具備輸入。SystemVerilog去除了這些限制。函數能夠具備任意數目的輸入、輸出以及輸入輸出,也能夠什麼也沒有。
25. 連續賦值的加強
在Verilog中,連續賦值語句的左側只能是線網類型,例如wire。連續賦值語句被認爲是線網的驅動源,而線網能夠擁有任意數據的驅動源。SystemVerilog容許除reg類型之外的任何數據類型用於連續賦值語句的左側。與線網不一樣,全部其它數據類型被限制爲只能有一個連續賦值語句驅動。爲相同的變量混合使用連續賦值語句和過程賦值語句是不被容許的。
26. $bit系統函數
在Verilog中沒有相似於C語言中sizeof的函數。SystemVerilog加入一個新的$bit內建函數。這個函數返回保存一個值所需的硬件位的數目(一個四態值要求一個硬件位),這個函數還能夠用來肯定一個結構體所表明的硬件位的數目。
27. `define的加強
SystemVerilog加強了`define編譯器指令的能力以便支持將字符串做爲宏的參數。宏的文本字符串中能夠包含一個隔離的引號,它的前面必須具備一個反勾號(`」),這就容許字符串中包含宏參數。宏文本能夠在行的尾部包含一個反斜槓(’’)來表示在下一行繼續。若是宏文本字符串中包含反斜槓,則反斜槓應該被放在兩個反勾號之間,這樣它就不會被認爲是Verilog轉義標識符的開始。宏文本字符串還能夠包含雙反勾號(``),它容許標識符可以從參數中構建。這些加強使得`define指令更加靈活。例如:`include指令後能夠緊跟一個宏名字來替代一個字符串。
`define f1「../project_top/opcode_defines」
`include `f1
28. 狀態機建模
SystemVerilog容許在更高的抽象層次上對狀態機建模。這些結構包括:
l 枚舉類型
l 一個特殊的state數據類型;
l 一個遷移語句
l 一個遷移操做符
29. 斷言
SystemVerilog中加入了斷言的功能來改善系統的驗證過程。
30. 結論
SystemVerilog爲Verilog-2001標準提供了一系列的擴展。這些擴展使得大型設計的建模和驗證更加容易。