2017-04-12 189 views
1

當執行下面的一段的SystemVerilog代碼(編譯和奎斯塔運行)SystemVerilog 0與'0'有什麼不同?

bit [7:0] test = 255; 
$display("%b %b %b", test,  test == 255,  test == '1); 
$display("%b %b %b", ~test,  ~test == 0,  ~test == '0); 
$display("%b %b %b", 8'b00000000, 8'b00000000 == 0, 8'b00000000 == '0); 

輸出是

11111111 1 1 
00000000 0 1 
00000000 1 1 

我的問題是關於第2個輸出線的第二數目:如何是二進制00000000與0不同?爲什麼它只是~test的結果,而不是當它是一個文字?這是一個Questa錯誤還是該語言的屬性?

+1

我在2個不同的模擬器上看到相同的結果。你也可以在edaplayground上試試它。 – toolic

+0

FWIW,'〜test == 8'h00'爲我返回1。 – toolic

回答

4

區別在於0,沒有任何寬度前綴默認爲32位值。在等式中,在評估這些表達式之前,操作數的大小被調整爲LHS和RHS表達式之間的最大寬度。試試~test == 9'h0~test == 9'h100,看看你得到了什麼。

'0的大小是基於其上下文。所以~test =='0在這種情況下變成~test == 8'b0

+2

所以你說(在你的9位示例中)'test'會擴展爲'9'h0ff',然後反轉爲'9'h100'? 我正在考慮這樣的事情,但我假設它會首先計算'〜test'(它會是'8'h00'),然後將其擴展爲'9'h000'。 – PieterNuyts

+0

這就是我要說的。請參閱_11.8.2在1800-2012 LRM中評估表達式的步驟。 –

+0

我很難認爲這是一個功能,但也許這是個人的品味......感謝您的解釋! – PieterNuyts