Я предполагаю, что вы пробовали что-то вроде этого: Array[N*(index+1) : N*index ] = Vector[index];
в блоке всегда. Это не сработает, потому что Verilog требует, чтобы обе стороны диапазона были константами (во время моделирования).
Есть три Verilog подходы, чтобы получить желаемое назначение:
- Назначение Бит
- назначение среза массива
- Генерирование Назначение Петля
назначения Бит
В Verilog- 95 (IEEE1364-1995), единственным способом достижения этого было назначение бит с помощью двойной для контура:
Array[N*index_m+index_n] = Vector[index_m][index_n];
reg [M*N:0] Array;
integer index_m, index_n;
always @(Vector) begin // Verilog-95 style sensitivity list
for(index_m=0; index_m <= M; index_m = index_m + 1) begin
for(index_n=0; index_n <= N; index_n = index_n + 1) begin
Array[N*index_m+index_n] = Vector[index_m][index_n];
end
endgenerate
Массив Назначение ломтика
Другой подход заключается в вектор нарезка с +:
(особенность добавленной в IEEE1364-2001. См. Indexing vectors and arrays with +:). Это позволяет использовать один переменный начальный индекс и постоянное смещение для диапазона.
Array[N*index +: N ] = Vector[index];
reg [M*N:0] Array;
integer index;
always @* begin // Verilog-2001 style sensitivity list
for(index=0; index <= M; index = index + 1) begin
Array[index*N +: N ] = Vector[index];
end
endgenerate
Генерировать назначение петли
Третий подход будет использовать generate
блок (также добавлен в IEEE1364-2001). Генерирование блоков для цикла сводится к разработке. Там форма, которую вы могли бы использовать Array[N*(index+1) : N*index ] = Vector[index];
, при условии, что index
является genvar
: Или с генерировать блок
wire [M*N:0] Array; // note 'wire'
generate
genvar g_index; // The 'g_' prefix is suggested coding style to identified genvars
for(g_index=0; g_index <= M; g_index = g_index + 1) begin
assign Array[(g_index+1)*N] : g_index*N] = Vector[g_index];
//assign Array[g_index*N +: N ] = Vector[g_index]; // +: also works
end
endgenerate
SytemVerilog (IEEE1800) добавил битные потоковый, который может сделать операцию на один шаг Array = {>>{Vector}};
, но я не знаю, как общего он поддерживается для синтеза. (Я обычно использую нарезку массива (+:
) с помощью SystemVerilog's foreach
в always_comb
)