请解释一下这个SystemVerilog语法{>> byte {...}}

时间:2014-04-12 00:14:02

标签: verilog system-verilog bit-shift

以下计划的答案是{6,7,8},但我不明白为什么,请解释一下:

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

2 个答案:

答案 0 :(得分:4)

>> operator在此上下文中不是逻辑移位,但它被称为流操作符。

流运营商确定流式传输数据块的顺序:>>导致块 数据以从左到右的顺序流传输,而<<<导致数据块以从右到左的顺序流式传输。

例如,请考虑以下几行:

$display ("%h",  {>>byte{24'h060708}} );
$display ("%h",  {<<byte{24'h060708}} );

在两者中,数字24'h060708应首先切成字节(称为slice_size)。第一个从左到右打印字节,而第二个从右到左打印它们。因此,输出是:

060708
080706

现在,在行ans = byteq'({>>byte{24'h060708}});中你正在使用比特流转换,它将从左到右表示的字节切换的24'h060708数字转换为byteq,这是一个字节队列。

答案 1 :(得分:3)

有关完整说明,请参阅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}