Hallo,
für den test eines seriellen Interfaces muss meine Testbench den
Speicherinhalt eines ROM-Modells in einen seriellen Datenstrom
umwandeln. Dazu wollte ich mir ein package anlegen. Dieses stellt zwei
Speicher bereit, einmal ein Schieberegister und einmal der ROM - beide
besitzen die gleiche Anzahl an BIts. Der Arbeitsablauf, hätte so
ausgesehen: dass ich den ROM zunächst mit Daten fülle, danach den
Datensatz ins Schieberegister kopiere dabei in den seriellen Datenstrom
umwandle, und jetzt nur noch die Daten aus dem Register auf mein DUT
schieben muss.
Das Umkopieren erldeigt eine einfach verschachtelte SChleife. Die äußere
zieht nacheinander die parallelen Datenwörter aus dem Rom, und die
Innere soll anschließend das gezogene Datenwort in seine Bits zerlegen
und ins Schieberegister schreiben. Dazu interriert sie aber das
Datenwort. Weiterhin nutzt das ganze Variablen. Wenn ich nun aber die
geschachtelte Schleife kompilieren will meldet modelsim: "vcom-1246
range is null". Es iterriert also nicht über die innere Schleife. Die
Äußere wird allerdings problemlos duchlaufen.
Die Typevereinbarung sieht wie folgt aus:
1 | type tmemFIFO is record
|
2 | mem : tmemmap;
|
3 | FrstValue : tAdrIdx;
|
4 | LstValue : tAdrIdx;
|
5 | full : boolean;
|
6 | empty : boolean;
|
7 | end record;
|
8 |
|
9 | -- define serial fifo
|
10 | type tserFIFO is record
|
11 | mem : tsermap;
|
12 | FrstBit : integer;
|
13 | LstBit : integer;
|
14 | full : boolean;
|
15 | empty : boolean;
|
16 | lock : boolean;
|
17 | end record;
|
18 |
|
19 | -- define bitbanger datatyp
|
20 | type tbitbanger is record
|
21 | memFIFO : tmemFIFO;
|
22 | serFIFO : tserFIFO;
|
23 | end record;
|
tmemmap: ist ein array aus std_logic_vector
tAdrIdx: ist der INdex an den Speicherzellen
Die kopierroutine sieht so aus:
1 | procedure MoveContent_memFIFO_to_serFIFO (bitbanger : inout tbitbanger; good : out boolean) is
|
2 | variable DVALUE : tVALUE;
|
3 | variable DBIT : std_logic;
|
4 | variable state : boolean;
|
5 | begin
|
6 | -- runs until all datablocks serialized
|
7 | while (not bitbanger.memFIFO.empty) loop
|
8 | PopFirstDVALUEmemFIFO(bitbanger, DVALUE);
|
9 | -- appends bit for bit at the serFIFO
|
10 | for i in DVALUE'left to DVALUE'right loop
|
11 | DBIT := DVALUE(i);
|
12 | report std_logic'image(DBIT);
|
13 | AppendBITserFIFO (bitbanger, DVALUE(i), state);
|
14 |
|
15 | end loop;
|
16 | end loop;
|
17 | end procedure MoveContent_memFIFO_to_serFIFO;
|
PopFirstDVALUEmemFIFO: holt jeweils aus dem ROM das erste Datenwort
AppendBITserFIFO: hängt jedes Bit dem Schieberegister an.
Zu meiner Frage, wisst ihr woran es liegen kann, das der Simulator die
innere Schleife nicht ausfürhen will?
Vielen Dank für die Antworten!
mfg
Andreas