考虑以下代码:
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,sec 11.4.14的说法:
当在左侧使用
时,流运算符执行反向操作,即将一个比特流解压到一个或多个变量中。
那么LHS上的流媒体运营商难道不是多余的,因为它转换了一个未打包的类型.一种未包装的类型?所以这第二次任务不应该仍然是非法的吗?对我来说,这段代码读起来像是流操作符实际上正在打包数据。
发布于 2022-04-15 17:44:52
它是解压的意思是,它接受一个单一的积分填充值,并将其分解为一个未打包数组的各个元素。当涉及到流运算符时,无论是打包还是解压,都没有那么重要--它正在重新组织比特的布局。你也可以把它写成
assign unpacked_wire = {>>{packed_wire}};当赋值的任何一方只有一个对象时,无论您将流运算符放在哪一方都不重要。
LRM将未打包类型视为强类型。您只能从/到等效类型进行赋值。另一方面,包装型比较弱。您可以在不同大小的打包类型之间进行分配,并且它会悄悄地截断或填充数据。流运算符更像是一个显式的强制转换,它便于在未打包的类型和其他打包或解压缩类型之间分配。
https://stackoverflow.com/questions/71886973
复制相似问题