SystemVerilog語言簡介(三)
15. 強製類型轉換
Verilog不能將一個值強製轉換成不同的數據類型。SystemVerilog通過使用'操作符提供了數據類型的強製轉換功能。這種強製轉換可以轉換成任意類型,包括用戶定義的類型。例如:
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; // 值3、5、6、7會引起一個警告
priority if (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 // 值3、5、6、7會引起一個警告
priority casez (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
最後更新:2017-04-03 14:53:40