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.
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
Es sollte in Verilog 2001 möglich sein. Welche Standardversion verwendest du? –
@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