以下程序答案是{6,7,8},但我不明白爲什麼,請解釋一下:請解釋這SystemVerilog的語法{>>字節{...}}
module q();
typedef byte byteq[$];
initial begin
byte ans[$];
ans = byteq'({>>byte{24'h060708}});
$display("A:expect '{6,7,8} get %p", ans);
end
endmodule
以下程序答案是{6,7,8},但我不明白爲什麼,請解釋一下:請解釋這SystemVerilog的語法{>>字節{...}}
module q();
typedef byte byteq[$];
initial begin
byte ans[$];
ans = byteq'({>>byte{24'h060708}});
$display("A:expect '{6,7,8} get %p", ans);
end
endmodule
對於一個完整的說明,請參閱IEEE Std 1800-2012 § 11.4.14 流操作符(/去分組)
的 slice_size確定每個塊的大小,以位爲單位。如果未指定 slice_size,則缺省值爲1.如果指定,它可以是常量積分表達式或簡單類型。如果使用類型,塊大小應該是該類型中的位數。如果使用常量積分表達式,則表達式的值應該是零或負的錯誤。
的 stream_operator<<
或>>
確定在其中的數據塊被流的順序:>>
導致的數據塊中要被流左到右的順序,而<<
導致數據的塊中的從右到被流 - 左邊的訂單。使用>>
從左到右流式傳輸將導致 slice_size被忽略,並且不執行重新排序。使用<<
從右到左流式傳輸應顛倒流中的塊順序,保留每個塊內的位順序。對於使用<<
的從右到左流式傳輸,流將被劃分爲具有指定位數的塊,從最右邊的位開始。如果作爲最後(最左邊)塊的切片結果具有比塊大小更少的位,則最後的塊具有剩餘位的大小;沒有填充或截斷。
在你的情況{>>byte{24'h060708}
創建流{8'h06, 8'h07, 8'h08}
。 byteq'()
正在將流轉換爲字節,但由於流已匹配正確的大小,因此不必要。 ans = {>>byte{24'h060708}};
將有相同的結果。如果您將 stream_operator更改爲<<
,則該流將爲{8'h08, 8'h07, 8'h06}
。
>>運算符在此上下文中不是邏輯移位,但它被稱爲流運算符。
流運營商確定,其中數據塊被流的順序:>>使塊中的數據 到在左到右的順序進行流式傳輸,而< <導致數據的塊中從右到流傳輸左命令。
考慮例如下列行:
$display ("%h", {>>byte{24'h060708}});
$display ("%h", {<<byte{24'h060708}});
在兩者中,數24'h060708應首先切成字節(稱爲slice_size)。第一個從左到右打印字節,而第二個從右到左打印它們。爲此,輸出爲:
060708
080706
現在,在線路ans = byteq'({>>byte{24'h060708}});
您使用的比特流鑄,其投射在24'h060708
表示的字節切片數從左至右進byteq,這是字節的隊列。