2016-08-29 3 views
0

Я пытаюсь найти максимальное значение внутри параметризованного массива, я смотрел на это post и наткнулся на forloop-generate. Единственное изменение, которое я хочу сделать, это изменить этот подход явного массива в параметризованный массив, но я столкнулся с проблемой назначения genvar.Verilog, generate/loop с параметризованным объявлением массива

reg [$clog2(LENGTH)-1:0] arr [0:LENGTH-1]; 

    wire [$clog2(LENGTH)-1:0] value_l1[0:LENGTH-2]; 
    wire [$clog2(LENGTH)-1:0] index_l1[0:LENGTH-2]; 

    genvar gen_i, gen_j, gen_k; 
    generate 
     for(gen_i = 0; gen_i < LENGTH; gen_i = gen_i + 2) begin : loop1 
     Compare cmp1(.A(arr[i]) 
        ,.B(arr[i+1]) 
        ,.indexA(i) 
        ,.indexB(i+1) 
        ,.value(value_l1[i/2]) 
        ,.index(index_l1[i/2]) 
        ); 
     end 

     gen_k = 0; 
     for(gen_i = 1; gen_i < $clog2(LENGTH); gen_i = gen_i + 1) begin : loop2_1 
     for(gen_j = 0; gen_j < LENGTH/(2*gen_i); gen_j = gen_j + 2) begin : loop2_2 
      Compare cmp2(.A(value_l1[gen_k + gen_j]) 
         ,.B(value_l1[gen_k + gen_j+1]) 
         ,.indexA(index_l1[gen_k + gen_j]) 
         ,.indexB(index_l1[gen_k + gen_j+1]) 
         ,.value(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)]) 
         ,.index(index_l1[(LENGTH/(2*gen_i))+(gen_j/2)]) 
         ); 
     end 
     //gen_k = gen_j; // <--------- problem here 
     end 
    endgenerate 

Мой подход заключается в список сравниваемых элементов, а затем сравнить этот список и записать обратно результат в том же списке. Например:

original array : 0 1 2 3 4 5 6 7 

бы результаты в

compare array : 1 3 5 7 | 3 7 | 7 
         ^ ^
          |  | 
          |  largest element 
          | 
          gen_k + gen_j 

затем выход 7 как самый большой элемент, но я не могу сделать gen_k = gen_j, чтобы сохранить индекс (смещение второй части сравнения массива). Можно ли использовать generate с параметризованным массивом? Если да, то как я могу исправить эту проблему?

ответ

1

Вы можете сделать это с помощью промежуточного параметра.

for(gen_i = 1; gen_i < $clog2(LENGTH); gen_i = gen_i + 1) begin : loop2_1 
     parameter param_k = LENGTH/(2*gen_i) + 1; 
     for(gen_j = 0; gen_j < LENGTH/(2*gen_i); gen_j = gen_j + 2) begin : loop2_2 
      Compare cmp2(.A(value_l1[param_k + gen_j]) 
         ,.B(value_l1[param_k + gen_j+1]) 
         ,.indexA(index_l1[param_k + gen_j]) 
         ,.indexB(index_l1[param_k + gen_j+1]) 
         ,.value(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)]) 
         ,.index(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)]) 
         ); 
     end 
     end