流媒体运营商解包是如何工作的?
How does streaming operator unpacking work?
考虑以下代码:
wire unpacked_wire[3:0];
wire [3:0] packed_wire;
assign unpacked_wire = packed_wire; // Error: Cannot assign packed type to unpacked type
assign {>>{unpacked_wire}} = packed_wire; // No errors
我的第一个赋值语句出错了。但是,第二个没有。但是,根据 IEEE Std 1800-2017,第 11.4.14 节:
When used in the left-hand side, the streaming operators perform the reverse operation, i.e., unpack a stream of bits into one or more variables.
所以 LHS 上的流式运算符不是多余的吗,因为它将解压类型...转换为解压类型?那么这第二个任务不应该仍然是非法的吗?对我来说,这段代码读起来就像流媒体运营商实际上是打包数据。
从某种意义上说,它是解包,它采用单个整数打包值并将其分解为解包数组的各个元素。说到streaming operator,是packing还是unpacking就没那么重要了——它是在重新组织bits的布局。
你也可以写成
assign unpacked_wire = {>>{packed_wire}};
当赋值的任一侧只有一个对象时,将流运算符放在哪一侧都没有关系。
LRM 将解压类型视为 strong 类型。您只能对 from/to 等价类型进行赋值。另一方面,压缩类型弱。您可以在不同大小的打包类型之间进行分配,它会静默截断或填充数据。流式运算符更像是一种显式转换,有助于在未打包类型和其他打包或未打包类型之间进行分配。
考虑以下代码:
wire unpacked_wire[3:0];
wire [3:0] packed_wire;
assign unpacked_wire = packed_wire; // Error: Cannot assign packed type to unpacked type
assign {>>{unpacked_wire}} = packed_wire; // No errors
我的第一个赋值语句出错了。但是,第二个没有。但是,根据 IEEE Std 1800-2017,第 11.4.14 节:
When used in the left-hand side, the streaming operators perform the reverse operation, i.e., unpack a stream of bits into one or more variables.
所以 LHS 上的流式运算符不是多余的吗,因为它将解压类型...转换为解压类型?那么这第二个任务不应该仍然是非法的吗?对我来说,这段代码读起来就像流媒体运营商实际上是打包数据。
从某种意义上说,它是解包,它采用单个整数打包值并将其分解为解包数组的各个元素。说到streaming operator,是packing还是unpacking就没那么重要了——它是在重新组织bits的布局。 你也可以写成
assign unpacked_wire = {>>{packed_wire}};
当赋值的任一侧只有一个对象时,将流运算符放在哪一侧都没有关系。
LRM 将解压类型视为 strong 类型。您只能对 from/to 等价类型进行赋值。另一方面,压缩类型弱。您可以在不同大小的打包类型之间进行分配,它会静默截断或填充数据。流式运算符更像是一种显式转换,有助于在未打包类型和其他打包或未打包类型之间进行分配。