如何在SystemVerilog中正确转换数组?

时间:2014-04-24 17:16:16

标签: arrays casting system-verilog bitstream

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

是否有适当的&#34;安全&#34;进行比特流铸造的程序?哪些问题可以在编译时捕获或在运行时安全处理?或者在这种情况下语言被破坏了吗?

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

2 个答案:

答案 0 :(得分:2)

与$ cast类似,用户可以通过

检查运行时的兼容性
if ( $bits(bit_queue) == $bits(logic_array) )
  logic_array = logic_array_t'(bit_queue);
else
  $error("sizes do not match");

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

答案 1 :(得分:0)

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