2016-04-18 6 views
1

Zunächst hatte ich eine Menge Schwierigkeiten, den Titel dieser Frage zu formulieren. Wenn Sie also das Problem verstehen, vor dem ich stehe, und es gibt einen besseren Weg, es zu formulieren, und die Frage wurde schon beantwortet, entschuldige ich mich und bitte zeigen Sie mir, wie ich das lösen kann. Wie auch immer, hier ist der entsprechende Code-Schnipsel, die ich für Klarheit abgeschnitten haben:Verkettung von RAM-Bits in Verilog

parameter RAM_DEPTH = 256; 
reg ram [0:RAM_DEPTH-1]; //256 deep memory, 1-bit size per location 

parameter NUM_INST = 64; 
parameter N = 4; 
genvar x; 
generate for (x = 0; x < NUM_INST; x = x + 1) begin: xs 
    //instantiate a module here 
    //connect N bits to input port 
    //which N bits depends module number x 
    mod inst (
     .in(ram[x*N : x*N + N - 1]) //the error is here 
    ); 
end endgenerate 

Der Fehler ist:

error: Array cannot be indexed by a range. 

Ich verstehe, dass dies, weil ram als reg ram [0:RAM_DEPTH-1] statt reg [0:RAM_DEPTH-1] ram deklariert wird. Aber gibt es eine Möglichkeit, die Verkettung von RAM-Bits basierend auf dem Parameter N zu automatisieren, dh, anstatt .in({ram[x*N],ram[x*N+1],ram[x*N+2],ram[x*N+3]}) schreiben zu müssen, gibt es eine automatische Bereichsauswahllogik, die die Bits auf der Basis von N verkettet. Sie können sich vorstellen, wenn, sagen wir N = 256, I müsste einen sehr langen Verkettungsoperator schreiben und macht auch mein Modul weniger parametrisch.

In diesem Fall sollte ich einfach reg [0:RAM_DEPTH-1] ram Deklaration verwenden und mein Modul neu schreiben, um Bit-Updates auf einem einzigen Registerarray zu unterstützen?

Danke.

+0

Haben Sie die in http://stackoverflow.com/questions/18067571/indexing-vectors-and-arrays-with beschriebenen Methode ausprobiert? Ich glaube mich daran zu erinnern, dass es für solche Dinge gut funktioniert ... – wilcroft

+0

Es sollte in Verilog 2001 möglich sein. Welche Standardversion verwendest du? –

+0

@wilcroft Die Lösung in Ihrem Link ist konzeptionell identisch. Wenn Sie sich die Variablendeklaration ansehen, handelt es sich um ein einzelnes N-Bit-Register, während ich N 1-Bit-Register deklariere (wie ein verteilter Speicherblock). Ich habe den '+:' Operator trotzdem versucht, und ich bekomme immer noch die gleichen Fehler. – sidmontu

Antwort

0

Die einfachste Lösung, die ich gefunden habe, war zu tun, wie Sie vorgeschlagen haben und drehen Sie reg ram [0:RAM_DEPTH-1] in reg [0:RAM_DEPTH-1] ram. Eine Alternative wäre die folgende:

parameter RAM_DEPTH = 256; 
parameter NUM_INST = 64; 
parameter N = 4; 

reg [RAM_DEPTH-1:0] ram; //256 deep memory, 1-bit size per location 
reg [N-1:0] ramwires [NUM_INST-1:0]; 

genvar x; 
integer y, z; 
generate for (x = 0; x < NUM_INST; x = x + 1) begin: xs 
    mod inst (
     .in(ramwires[x]) 
    ); 
end endgenerate 

[email protected](*) 
    for (y = 0; y<NUM_INST; y = y + 1) begin 
     for (z=0; z<N; z = z + 1) begin 
      ramwires[y][z] = ram[y*N+z]; 
     end 
    end 

Dieser wandelt das 1D-Array in eine 2D-Anordnung, die sich leicht in das Modul übergeben wird, während immer noch parametrierbaren ist.