2012-03-05 20 views
9

Estoy intentando crear un comparador de etapas múltiples en verilog y no puedo encontrar la manera de incrementar múltiples genvarios en un solo ciclo de generación. Estoy intentando lo siguiente:Incremento de múltiples Genvars en 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 

Y conseguir el error siguiente:

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

Alguien sabe cómo incrementar múltiples genvars en la misma instrucción generar? ¿O al menos obtener una funcionalidad equivalente?

Respuesta

5

Suponiendo que ci1 tiene la mitad de la profundidad de tc y que quieras, di ci1[0] = min(tc[0], tc[1]), ci[1] = min(tc[2], tc[3]) etc, lo siguiente debería funcionar:

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?

Esto no está permitido debido a que una generación de bucle crea una implícita declaración localparam para la variable de bucle y elabora los elementos en el bucle basados ​​solo en ese paralaje local. Esto significa que cualquier elemento dentro del ciclo debe ser válido fuera del ciclo si el genvar se declaró como un localparam.

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 

convierte

//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 

En este caso se podría crear un valor 'constante' depende de la genvar utilizando un parámetro explícito dentro del bucle.

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

muy interesante! ¿El localparam crea algo en el hardware? – Adam

+1

No. Los parámetros locales son constantes que se utilizan para la elaboración del diseño. –