SystemVerilog Verilog中的unarray移位运算符?

时间:2015-08-10 21:00:21

标签: verilog system-verilog

我在SystemVerilog sim中遇到了这一行,我用Google搜索了但我不确定它在做什么:

data_w = { >> 32 { { >> { data } } } };

任何澄清都将非常感谢! 谢谢!

1 个答案:

答案 0 :(得分:5)

它被称为流媒体。它存在于SystemVerilog中;不是Verilog。有关完整说明,请参阅IEEE Std 1800-2012§11.4.14流媒体运营商(打包/解压缩)

  

slice_size 确定每个块的大小,以位为单位。如果未指定 slice_size ,则默认值为1.如果指定,则它可以是常量整型表达式或简单类型。如果使用类型,则块大小应为该类型中的位数。如果使用常量积分表达式,则表达式的值为零或负数时应该是一个错误。

   stream_operator <<>>确定流式传输数据块的顺序:>>导致数据块按从左到右的顺序流式传输,<<导致数据块按从右到左的顺序流式传输。使用>>从左到右的流式传输将导致 slice_size 被忽略,并且不执行重新排序。使用<<从右到左的流式传输将颠倒流中块的顺序,保留每个块内的位顺序。对于使用<<的从右到左的流,流被切成具有指定位数的块,从最右边的位开始。如果作为切片的结果,最后一个(最左边)的块具有比块大小更少的位,则最后一个块具有剩余位的大小;没有填充或截断。

示例表格IEEE Std 1800-2012§11.4.14.2通用流的重新排序

int j = { "A", "B", "C", "D" };
{ >> {j}} // generates stream "A" "B" "C" "D"
{ << byte {j}} // generates stream "D" "C" "B" "A" (little endian)
{ << 16 {j}} // generates stream "C" "D" "A" "B"
{ << { 8'b0011_0101 }} // generates stream 'b1010_1100 (bit reverse)
{ << 4 { 6'b11_0101 }} // generates stream 'b0101_11
{ >> 4 { 6'b11_0101 }} // generates stream 'b1101_01 (same)
{ << 2 { { << { 4'b1101 }} }} // generates stream 'b1110