15. 強(qiáng)制類型轉(zhuǎn)換
Verilog不能將一個(gè)值強(qiáng)制轉(zhuǎn)換成不同的數(shù)據(jù)類型。SystemVerilog通過(guò)使用<type>’操作符提供了數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換功能。這種強(qiáng)制轉(zhuǎn)換可以轉(zhuǎn)換成任意類型,包括用戶定義的類型。例如:
int’ (2.0 * 3.0) // 將結(jié)果轉(zhuǎn)換為int類型
mytype’ (foo) // 將foo轉(zhuǎn)換為mytype類型
一個(gè)值還可以通過(guò)在強(qiáng)制轉(zhuǎn)換操作符前指定一個(gè)10進(jìn)制數(shù)來(lái)轉(zhuǎn)換成不同的向量寬度,例如:
17’ (x - 2) // 將結(jié)果轉(zhuǎn)換為17位寬度
也可以將結(jié)果轉(zhuǎn)換成有符號(hào)值,例如:
signed’ (x) // 將x轉(zhuǎn)換為有符號(hào)值
16. 操作符
Verilog沒(méi)有C語(yǔ)言的遞增(++)和遞減(--)操作符。而SystemVerilog加入了幾個(gè)新的操作符:
++和--:遞增和遞減操作符;
+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=、<<<=和>>>=賦值操作符;
17. 唯一性和優(yōu)先級(jí)決定語(yǔ)句
在Verilog中,如果沒(méi)有遵循嚴(yán)格的編碼風(fēng)格,它的if-else和case語(yǔ)句會(huì)在RTL仿真和RTL綜合間具有不一致的結(jié)果。如果沒(méi)有正確使用full_case和parallel_case綜合指令還會(huì)引起一些其它的錯(cuò)誤。
SystemVerilog能夠顯式地指明什么時(shí)候一條決定語(yǔ)句的分支是唯一的,或者什么時(shí)候需要計(jì)算優(yōu)先級(jí)。我們可以在if或case關(guān)鍵字之前使用 unique或requires關(guān)鍵字。這些關(guān)鍵字可以向仿真器、綜合編譯器、以及其它工具指示我們期望的硬件類型。工具使用這些信息來(lái)檢查if或 case語(yǔ)句是否正確建模了期望的邏輯。例如,如果使用unique限定了一個(gè)決定語(yǔ)句,那么在不希望的case值出現(xiàn)的時(shí)候仿真器就能夠發(fā)布一個(gè)警告信息。
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會(huì)引起一個(gè)警告
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會(huì)引起一個(gè)警告
priority casez (a)
2’b00? : y = in1; // a是0或1
2’b0?? : y = in2; // a是2或3
default : y = in3; //如果a為其他的值
endcase
18. 底部檢測(cè)的循環(huán)
Verilog包含for、while和repeat循環(huán),這幾個(gè)循環(huán)都是在循環(huán)的起始處檢測(cè)循環(huán)條件。SystemVerilog加入了一個(gè)do-while循環(huán),這種循環(huán)在執(zhí)行語(yǔ)句的結(jié)尾處檢測(cè)循環(huán)條件。
19. 跳轉(zhuǎn)語(yǔ)句
在語(yǔ)句的執(zhí)行過(guò)程中,C語(yǔ)言提供了幾種方式來(lái)跳轉(zhuǎn)到新的語(yǔ)句,包括:return、break、continue和goto。在Verilog中除了通過(guò)使用disable語(yǔ)句跳轉(zhuǎn)到語(yǔ)句組的尾部外,沒(méi)有提供任何其它跳轉(zhuǎn)語(yǔ)句。使用disable語(yǔ)句執(zhí)行中止和繼續(xù)功能要求加入塊的名字,并且會(huì)產(chǎn)生不直觀的代碼。SystemVerilog加入了C語(yǔ)言的break和continue關(guān)鍵字,這兩個(gè)關(guān)鍵字不要求使用塊名字。另外,SystemVerilog還加入了一個(gè)return關(guān)鍵字,它可以用來(lái)在任何執(zhí)行點(diǎn)上退出一個(gè)任務(wù)或函數(shù)。
break:退出一個(gè)循環(huán),與C語(yǔ)言相同;
continue:跳轉(zhuǎn)到一個(gè)循環(huán)的尾部,與C語(yǔ)言相同;
return 表達(dá)式:退出一個(gè)函數(shù);
return:退出一個(gè)任務(wù)或void類型的函數(shù)。
SystemVerilog沒(méi)有包含C語(yǔ)言中的goto語(yǔ)句。
20. 塊名字和語(yǔ)句標(biāo)簽
在Verilog中,我們可以通過(guò)在begin或fork關(guān)鍵字之后指定名字來(lái)為begin-end或fork-jion語(yǔ)句指定名字。這個(gè)指定的名字代表整個(gè)語(yǔ)句塊。SystemVerilog還允許在end或jion關(guān)鍵字之后指定一個(gè)匹配的塊名字。這種機(jī)制很容易將end或jion與對(duì)應(yīng)的 begin或fork聯(lián)系起來(lái),尤其是在一個(gè)長(zhǎng)的塊或嵌套的塊中。塊結(jié)尾處的名字是可選的,但如果使用的話,它必須與塊起始處的名字相同。例如: