Forum: FPGA, VHDL & Co. modelsim warning vcom-1246 range null bei geschachtelter Schleife


von Andreas (Gast)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

Was sollen denn immer diese unvollständigen Codeschnippsel? Da ist also 
ein Nullrange, beim Iterieren über alle Elemente eine tVALUE. Aber was 
ein tVALUE ist, ist nicht zu sehen.

Bzw. für diese Variablennamen gehört jemand durch den Serializer 
gedreht!
1
 FrstValue   : tAdrIdx;
2
 LstValue    : tAdrIdx;

Frst und Lst ist ja wohl eine Frechheit, ganzen einen Buchstaben 
gespart, aber dafür sehr viel schwerer zu lesen.

von Andreas (Gast)


Lesenswert?

Hallo,

>Aber was ein tVALUE ist, ist nicht zu sehen.

Das ist ein std_logic_vector(7 downto 0), wobei seine länge über eine 
Konstante eingestellt werden kann.

>Bzw. für diese Variablennamen gehört jemand durch den Serializer gedreht!

Jaa, sie sind nicht die schönsten Bezeichnungen, aber mit dem Problem 
des fehlenden iterierens haben sie glaube ich nichts zu tun.

Also nochmals aus reiner Neugier: woran könnte es liegen das der 
Modelsim denkt in der inneren Schleife, wäre nichts zu tun?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andreas schrieb:
> woran es liegen kann, das der Simulator die
> innere Schleife nicht ausfürhen will?
Was ist damit:
> range is null
Wie ist tValue definiert? Etwa so: (7 downto 0)?
Dann ist links größer als rechts und die Schleife wird sofort 
abgebrochen.

Klaus schrieb:
> Bzw. für diese Variablennamen gehört jemand durch den Serializer
> gedreht!
Insbesondere, wenn er danach für einen POP (der allgemein geläufig das 
oberste Datenwort von wo auch immer holt) dann so nennt:
>> PopFirstDVALUEmemFIFO


Insgesamt habe ich den Eindruck, dass da was recht Einfaches kompliziert 
umgesetzt wird...

EDIT: Kleine Überschneidung...
Aber es ist wie ichs vermutet hatte:
> Das ist ein std_logic_vector(7 downto 0)
--> 'left und 'right austauschen, oder 'high und 'low verwenden...

von Andreas (Gast)


Lesenswert?

Ja klar, die Schleife ist "to" definiert und der std_logic_vector 
"downto".

Nochmals Vielen Dank!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.