在输出 Verilog 处串联数组

Concatenation of Array at Output Verilog

这里完全是菜鸟,只是为了清楚。学习 Verilog 仅一个月左右。

所以我有一些用户定义的参数,我想将所有项目串联成一个数组。例如,如果数组长度是静态的(在本例中,是一个包含 10 个 12 位项的数组),我当然可以这样做:

    reg [11:0] array [9:0];
    output <= {array[9],...,array[0]};

但是如果数组长度是用户定义的而不是静态值怎么办?例如,如果我想要这样的两个输出,长度是一个参数:

    output1 <= array[0];
    output2 <= {array[length-1],...,array[1]};

我已经为此苦苦思索了一两分钟,但在我的互联网搜索中没有找到任何东西……希望我说得足够清楚了……

假设您有以下条件:

parameter NUM_ITEMS = 10;
parameter LOWER = 1;
parameter UPPER = 9;
reg [11:0] array [NUM_ITEMS-1:0];
reg [12*(NUM_ITEMS-1)-1:0] output;

以下方法可行:

integer i;
always@(*) begin
    for (i=0; i <= UPPER; i=i+1)
        output[i*12+:12] = array[LOWER+i];
        //alternatively output [12*i+11:12*i] = array[LOWER+i];
end

不过,您的数组元素需要是连续的。

您可以尝试将循环中的数组分配给变量 output2。您将遍历 output2 变量的位并将数组的每个元素的值分配给 output2。 WIDTH_ARRAY是数组的宽度,必须是一个常数。

parameter SZ = 10;
parameter WIDTH_ARRAY = 8;

reg [WIDTH_ARRAY-1:0] a[SZ] = {1,1,1,1,1,1,1,1,1,1}  ;
reg [SZ*WIDTH_ARRAY:0] output2;

output1 <= array[0];
for ( int i = 0 ; i<SZ-1;i++)
   begin
        output2[(i*WIDTH_ARRAY)+:WIDTH_ARRAY] = array[i+1];
   end

不能直接将数组分配给 output2,因为一个是解包的,另一个是压缩结构。

+:称为位片运算符。 Indexing vectors and arrays with +: