在SystemVerilog中调整动态数组的大小

时间:2018-08-16 16:09:09

标签: system-verilog dynamic-arrays

在SystemVerilog中,我有一个动态的整数数组。我需要修改此数组,以跳过前2个元素。为了向后兼容,我无法将数据类型更改为队列。 (这将允许我执行pop_front)。所以我想出了这个hacky代码,该代码至少复制了两次阵列。有更好的方法吗?

tmp_arr = new[dyn_arr.size() -2];         
for(int i = 0; i < tmp_arr.size(); i++) begin
  tmp_arr[i] = dyn_arr[i + 2];           // First Copy
end
dyn_arr = tmp_arr;                       // Second Copy

我的测试也在edaplayground上。 https://www.edaplayground.com/x/2VPm

2 个答案:

答案 0 :(得分:1)

取决于您的工具对流运算符的支持程度,您可以像这样使用它:

dyn_arr = {>>$size(dyn_arr[0]){dyn_arr with [2:dyn_arr.size()-1]}};

这假设dyn_arr的长度至少为3个元素(即结果数组的长度至少为1个元素)。

否则,您总是可以使用循环将整个数组下移,而不必制作一个新的数组:

for (int i = 2; i < dyn_arr.size(); i++) begin
  dyn_arr[i - 2] = dyn_arr[i];
end
dyn_arr = new[dyn_arr.size()-2] (dyn_arr); // Only include this if you need to use dyn_arr.size with the smaller size after the operation is complete

答案 1 :(得分:1)

不是。流运算符可以做到这一点,但可能会更昂贵。

您可以尝试

for(int i=2;i < dyn_arr.size(); i++)
   dyn_arr[i-2] = dyn_arr[i];
dyn_arr = new[dyn_arr.size-2] dyn_arr;

并希望编译器足够聪明,可以在不进行复制的情况下对其进行优化。