2015-05-17 8 views
9

Ich schreibe ein Projekt mit Verilog und möchte parameter verwenden, um einige Parameter in meinem Modul zu definieren. Aber wenn ich etwas Quellcode einlese, wird manchmal localparam statt parameter verwendet.Unterschied zwischen "Parameter" und "localparam"

Was ist der Unterschied zwischen ihnen?

Antwort

19

Im Allgemeinen ist die Idee hinter den localparam (zu dem Verilog-2001-Standard) ist durch einen Endbenutzer Wert von localparam durch zufällige oder falsche Neudefinition zu schützen (im Gegensatz zu einem parameter Wert, dieser Wert kann nicht modifiziert werden Parameterredefinition oder durch eine defparam Anweisung).

Basierend auf 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.

, zusätzlich 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.

Wenn Sie möchten, Um mehr über dieses Thema zu erfahren, empfehle ich Ihnen Clifford E. Cummings Papier "New Verilog-2001 Techniques for Creating Parameterized Models (or Down With `define and Death of a defparam!)".

0

Minimal Beispiel

Hier ist ein Beispiel dafür, was Qiu erwähnt.

In einem RAM ist die Speichergröße eine Funktion der Wort- und Adressgrößen.

Wenn also das übergeordnete Modul die Wort- und Adressgröße angibt, sollte es nicht in der Lage sein, die Speichergröße ebenfalls anzugeben.

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

Und auf Elternmodul, das ist in Ordnung:

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

aber sollte ein Fehler sein:

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

iverilog nicht scheitern, und ich glaube, dass diese ist ein Fehler: https://github.com/steveicarus/iverilog/issues/157

Einschneiden gibt einen Fehler wie erwartet.

Verwandte Themen