System verilog 将未打包数组的元素连接在一起

System verilog 将未打包数组的元素连接在一起,system-verilog,System Verilog,我在我的系统Verilog代码中使用以下函数。我想知道是否有一种惯用的方法可以达到同样的效果,也许不需要硬连接宽度。我尝试了流媒体运营商,但无法让他们正常工作。我需要使用未打包的数组。非常感谢 function bit [64:0] cat8 (bit [7:0] a[8]); return { a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0] }; endfunction; 由于您在concat中反转了数组,因此没有好的方法来表示它。 你有:

我在我的系统Verilog代码中使用以下函数。我想知道是否有一种惯用的方法可以达到同样的效果,也许不需要硬连接宽度。我尝试了流媒体运营商,但无法让他们正常工作。我需要使用未打包的数组。非常感谢

function bit [64:0] cat8 (bit [7:0] a[8]);
   return { a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0] };
endfunction;

由于您在concat中反转了数组,因此没有好的方法来表示它。 你有:

bit [7:0] a[8];
这相当于

bit [7:0] a[0:7];
在concat中,从最高有效位的[7]开始,判断7是否是数组中最低有效的索引

这就是为什么流媒体运营商在您的案例中不起作用的原因

因此,如果你真的需要反转数组,那么你就拥有你所拥有的,否则你会发现这两件事是等价的:

{ a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7] }


当然,您可以将数组声明为位[7:0]a[7:0],并在concat中保持索引顺序。但它不会像上述情况那样再次反转数组

您可以通过typedef定义新的数据类型


下面应该适合你

module top;
  function bit [63:0] cat8 (bit [7:0] a[8]);
   return { <<8{a}};
    endfunction;
    bit [7:0] arr[8];

    initial begin
    arr= '{1,2,3,4,5,6,7,8};
    foreach (arr[i])$display("%h", arr[i]);
        $display("%h", cat8(arr));
    end
endmodule
typedef bit[7:0] octet;
typedef octet upack[7:0];

function bit [64:0] cat8 (upack a);
  // your code
endfunction;
module top;
  function bit [63:0] cat8 (bit [7:0] a[8]);
   return { <<8{a}};
    endfunction;
    bit [7:0] arr[8];

    initial begin
    arr= '{1,2,3,4,5,6,7,8};
    foreach (arr[i])$display("%h", arr[i]);
        $display("%h", cat8(arr));
    end
endmodule