2012-03-05 4 views
9

Я пытаюсь создать многоступенчатый компаратор в verilog, и я не могу понять, как увеличить несколько генов в одном цикле генерации. Я пытаюсь следующее:Приращение нескольких Genvars в Verilog Generate Statement

genvar i,j; 
//Level 1 
generate 
    j=0; 
    for (i=0;i<128;i=i+1) 
    begin: level1Comp 
    assign ci1[i] = minw(tc[j],tc[j+1]); 
    j = j+2; 
    end 
endgenerate 

И получаю следующее сообщение об ошибке:

Error-[SE] Syntax error 
    Following verilog source has syntax error : 
    "encoder.v", 322: token is '=' 
    j=0; 

Каждый знает, как приращение нескольких genvars в том же генерировать заявление? Или, по крайней мере, получить эквивалентную функциональность?

ответ

5

Предполагая, что ci1 имеет половину глубины tc и вы хотите, скажем, ci1[0] = min(tc[0], tc[1]), ci[1] = min(tc[2], tc[3]) и т.д., должно работать:

module st_genvar(); 

    int ci1 [0:127]; 
    int tc [0:255]; 

    function int minw(int i1, int i2); 
     if(i1 < i2) 
     minw = i1; 
     else 
     minw = i2; 
    endfunction 

    genvar i; 
    //Level 1 
    generate 
     for (i=0;i<128;i=i+1) 
     begin: level1Comp 
      assign ci1[i] = minw(tc[i*2],tc[i*2+1]); 
     end 
    endgenerate 

endmodule 
11

Anyone know how to increment multiple genvars in the same generate statement?

Это не допускается, так как генерировать цикл создает неявный localparam для переменной цикла и разрабатывает элементы в цикле, основанные только на этом локальном параметре. Это означает, что любые элементы внутри цикла должны быть действительны вне цикла, если genvar был объявлен как локальный.

genvar i,j; 
//Level 1 
generate 
    j=0; 
    for (i=0;i<128;i=i+1) 
    begin: level1Comp 
    assign ci1[i] = minw(tc[j],tc[j+1]); 
    j = j+2; 
    end 
endgenerate 

становится

//Done for each value of i 
genvar j; 
localparam integer i = i_for_each_iteration; 

j=0; //Not valid outside a procedural context so modelsim complains 
assign ci1[i] = minw(tc[j],tc[j+1]); 
j = j+2; //Also not valid outside a procedural context 

В этом случае вы могли бы создать «постоянную» значение, зависящее от genvar с помощью явного параметра внутри цикла.

genvar i; 
//Level 1 
generate 
    for (i=0;i<128;i=i+1) 
    begin: level1Comp 
    localparam integer j = i*2; 
    assign ci1[i] = minw(tc[j],tc[j+1]); 
    end 
endgenerate 
+0

Очень интересно! Создает ли localparam что-то в оборудовании? – Adam

+1

Нет. Локальные параметры - это константы, которые используются для разработки дизайна. –