2015-05-17 11 views
9

Sto scrivendo un progetto con Verilog e voglio usare parameter per definire alcuni parametri nel mio modulo. Ma quando leggo in qualche codice sorgente, a volte viene utilizzato localparam anziché parameter.Differenza tra "parametro" e "localparam"

Qual è la differenza tra loro?

risposta

19

Generalmente, l'idea alla base del localparam (aggiunta allo standard Verilog-2001) è di proteggere il valore di localparam da ridefinizione accidentale o non corretto da un utente finale (a differenza di un valore parameter, questo valore non può essere modificato ridefinizione dei parametri o con una dichiarazione defparam).

Sulla base di IEEE 1364-2005 (ch 4.10.2.):

Verilog HDL local parameters are identical to parameters except that they cannot directly be modified by defparam statements or module instance parameter value assignments. Local parameters can be assigned constant expressions containing parameters, which can be modified with defparam statements or module instance parameter value assignments.

Inoltre, in SystemVerilog (IEEE 1800-2012 (ch 6.20.4).):

Unlike nonlocal parameters, local parameters can be declared in a generate block, package, class body, or compilation-unit scope. In these contexts, the parameter keyword shall be a synonym for the localparam keyword.

Local parameters may be declared in a module’s parameter_port_list. Any parameter declaration appearing in such a list between a localparam keyword and the next parameter keyword (or the end of the list, if there is no next parameter keyword) shall be a local parameter. Any other parameter declaration in such a list shall be a nonlocal parameter that may be overridden.

Se si desidera per saperne di più su questo argomento, ti consiglierei il documento di Clifford E. Cummings "New Verilog-2001 Techniques for Creating Parameterized Models (or Down With `define and Death of a defparam!)".

0

Esempio minimo

Ecco un esempio di ciò Qiu menzionato.

In una RAM, la dimensione della memoria è una funzione delle dimensioni della parola e dell'indirizzo.

Quindi, se il modulo genitore specifica la dimensione della parola e dell'indirizzo, non dovrebbe essere in grado di specificare anche la dimensione della memoria.

module myram #(
    parameter WORD_SIZE = 1, 
    parameter ADDR_SIZE = 1 
) (
    input wire [ADDR_SIZE-1:0] addr, 
    inout wire [WORD_SIZE-1:0] data, 
    // ... 
); 
    localparam MEM_SIZE = WORD_SIZE * (1 << ADDR_SIZE); 
    // Use MEM_SIZE several times in block. 
... 

E sul modulo padre, questo va bene:

module myram_tb; 
    myram #(
     .ADDR_SIZE(2), 
     .WORD_SIZE(2) 
    ) top (
     /* wires */ 
    ) 

ma questo dovrebbe essere un errore:

module myram_tb; 
    myram #(
     .ADDR_SIZE(2), 
     .WORD_SIZE(2), 
     .MEM_SIZE(2) 
    ) top (
     /* wires */ 
    ) 

iverilog non manca, e credo che questo è un bug: https://github.com/steveicarus/iverilog/issues/157

Incisivo dà un errore come previsto.