1

SystemVerilog 中用于数组和结构的比特流转换似乎不是很安全。

例如,以下铸造问题只会在运行时被捕获(可能是模拟的几个小时):

bit [31:0] bit_queue[$];
logic [31:0] logic_array[5];
for (int i = 0; i < 10; i++) begin
  bit_queue[i] = $urandom;
end

if (catch_issue) begin
  typedef logic [31:0] logic_array_t [5];
  logic_array = logic_array_t'(bit_queue); // <-- ISSUE
end

进行比特流转换是否有适当的“安全”程序?哪里可以在编译时发现任何问题或在运行时安全处理?还是在这种情况下语言被破坏了?

EDA Playground 上的示例代码:http ://www.edaplayground.com/x/2tp

4

2 回答 2

2

与 $cast 类似,由用户在运行时检查与

if ( $bits(bit_queue) == $bits(logic_array) )
  logic_array = logic_array_t'(bit_queue);
else
  $error("sizes do not match");

对于涉及动态大小的变量的强制转换,如果没有可能的数组大小会产生有效的赋值,则可能会出现编译时错误,但如果存在可能的大小,则在强制转换发生之前您无法执行该检查,因为大小可以更改直到演员表发生的时间。

于 2014-04-25T19:41:28.953 回答
0

因为您在 RHS 上使用队列(暗示可变大小),所以我认为编译器不能静态检查这一点(因为它没有评估 for 循环)。请注意,如果您将 typedef 更改为固定大小的解压缩数组 > 5 个条目,则会出现编译时错误。

于 2014-04-24T20:10:19.093 回答