2016-12-19 5 views
0

Ich möchte ein LocalParam-Array in SystemVerilog erstellen und definieren. Die Größe des Arrays sollte konfigurierbar sein und der Wert jeder LocalParam-Array-Zelle basierend auf dessen Position berechnet werden. Im Wesentlichen dieser Code:Systemverilog Localparam-Array mit konfigurierbarer Größe

localparam [7:0] [ADDR_BITS-1:0] ADDR_OFFSET = '{ 
    7*PAGE_SIZE, 
    6*PAGE_SIZE, 
    5*PAGE_SIZE, 
    4*PAGE_SIZE, 
    3*PAGE_SIZE, 
    2*PAGE_SIZE, 
    1*PAGE_SIZE, 
    0 
}; 

aber, wo die erste ‚7‘ mit einem Parameter ersetzt wird, und wobei die Parameter-Initialisierung auf den allgemeinen Fall erweitert. Also brauche ich eine Möglichkeit, von 0 bis (N-1) zu loopen und ADDR_OFFSET (loop) = loop * PAGE_SIZE zu setzen.

Die "offensichtliche" Option in SystemVerilog würde generiert werden, aber ich habe gelesen, dass das Platzieren einer Parameterdefinition in einem generate-Block einen neuen lokalen Parameter relativ zum hierarchischen Bereich innerhalb des generate-Blocks (source) generiert.

Irgendwelche Vorschläge?

Für Hintergrundreferenz: Ich muss eine tatsächliche Adresse basierend auf einer Basisadresse und einer Zahl berechnen. Die Berechnung ist einfach: real_address = base_address + number * PAGE_SIZE

Allerdings möchte ich nicht das "*" in meinem Code haben, da ich befürchte, dass das synt-Tool einen Multiplikator generiert, den es dann versucht zu vereinfachen, da PAGE_SIZE ein konstanter Wert ist. Ich vermute, dass dies zu mehr Logik führen kann, als wenn ich beim Generieren des localparam-Arrays alle Berechnungen ausführen würde, da dies sicherlich keinen Multiplikator in der Logik ergibt.

So mit der obigen Definition localparam führe ich die gewünschte Adresse Berechnung wie folgt aus:

function [ADDR_BITS-1:0] addr_calc; 
    input [ADDR_BITS-1:0] base_addr; 
    input [NBITS-1:0] num; 

    addr_calc = base_addr + ADDR_OFFSET[num]; 
    endfunction 

Ich denke, vielleicht fand ich eine Lösung. Würde ich nicht im Wesentlichen dasselbe erreichen, indem ich kein localparam-Array definiere, sondern die Adressberechnung innerhalb einer Schleife durchführe? Da der Systemverilog die Schleifenvariable als "konstant" ansieht (wenn es um die Erzeugung von Logik geht), scheint dies dasselbe zu erreichen. So (innerhalb der Funktion, die ich oben schrieb):

Antwort

3

Sie können Ihr localparam mit dem Rückgabewert einer Funktion festlegen.

localparam bit [7:0] [ADDR_BITS-1:0] ADDR_OFFSET = ADDR_CALC(); 
    function bit [7:0] [ADDR_BITS-1:0] ADDR_CALC(); 
     for(int ii=0;ii<$size(ADDR_CALC,1); ii++) 
    ADDR_CALC[ii] = ii * PAGE_SIZE; 
    endfunction 
+0

Brilliant, danke! – ArneA

Verwandte Themen