2016-10-24 8 views
0

У меня есть вектор, как этотПреобразовать вектор в массив

wire [N:0] Vector[M:0]; 

, и я хочу, чтобы преобразовать его в массив размером M * N. Псевдокод может быть:

Array={Vector[M],Vector[M-1],Vector[M-2],...,Vector[0]} 

Так что я хочу, чтобы объединить элементы вектора в массиве. Я попытался сделать это, используя цикл, но когда я пытаюсь имитировать, он дает фатальную ошибку без описания. Есть ли более простой способ сделать это? Благодаря!!!

ответ

2

Я предполагаю, что вы пробовали что-то вроде этого: Array[N*(index+1) : N*index ] = Vector[index]; в блоке всегда. Это не сработает, потому что Verilog требует, чтобы обе стороны диапазона были константами (во время моделирования).

Есть три Verilog подходы, чтобы получить желаемое назначение:

  1. Назначение Бит
  2. назначение среза массива
  3. Генерирование Назначение Петля

назначения Бит
В 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)