2012-03-05 13 views
9

Sto cercando di creare un comparatore multistadio in verilog e non riesco a capire come incrementare più genvars in un singolo ciclo di generazione. Sto cercando il seguente:Incremento di più Genvars in 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 

E ottenere il seguente errore:

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

Qualcuno sa come incrementare più genvars nella stessa istruzione di generare? O almeno ottenere funzionalità equivalenti?

risposta

5

Supponendo che ci1 ha metà della profondità del tc e si desidera, dicono ci1[0] = min(tc[0], tc[1]), ci[1] = min(tc[2], tc[3]) ecc, il seguente dovrebbe funzionare:

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?

questo non è consentito a causa di una generare ciclo for crea un implicito istruzione localparam per la variabile loop ed elabora gli elementi nel loop basandosi solo su quel parametro locale. Ciò significa che tutti gli elementi all'interno del ciclo devono essere validi al di fuori del ciclo se il genvar è stato dichiarato come 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 

diventa

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

In questo caso è possibile creare un valore 'costante' dipendente dalla genvar utilizzando un parametro esplicito all'interno del ciclo.

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

molto interessante! Il localparam crea qualcosa nell'hardware? – Adam

+1

No. Localparams sono le costanti utilizzate per l'elaborazione del progetto. –