Forum: FPGA, VHDL & Co. Verilog: array einer packed struct indizieren F1 bitte.


von Bernd (65c02)


Lesenswert?

Hallo,

schon mal vorab Danke fürs lesen.
Vorab: Ich arbeite mit yosys/icarus -g2012

Ich habe mir folgenden Typen kreiert:

typedef struct packed { // Going from highest bit (18) to lowest bit (0)
  logic [5:0] ledNo;    // led to switch (1-64)
  logic [11:0] color;   // color to choose rgb (4:4:4)
  logic status;         // 0- off, 1- on
} DebugInfo;

In meinem Modul übergebe ich diese natürlich vorab instantieerte 
Struktur als Input Parameter...

module visuMon( input   logic i_clk25Mhz,
...
                input   DebugInfo i_debugInfo,
... );

// ... und lege in diesem Modul ein Array mit 64 Elementen dieser 
Struktur an (denke ich zumindest)...

DebugInfo _debugInfo[64];


// und möchte dann diesen Input parameter (i_debugInfo) in mein internes 
Array einfügen, wobei das Feld "ledNo" als Index auf das Array genutzt 
werden soll:

always @(posedge i_clk25Mhz)
begin
  ...
  _debugInfo[i_debugInfo.ledNo-1]<=i_debugInfo;
  ...
end

Ergebnis ist folgende Fehlermeldungen:

ERROR: Assert `!source_offset && !id2ast->range_swapped' failed in 
frontends/ast/genrtlil.cc:1604.

Ich denke ich habe da mit meinem C-Wissen SystemVerilog mal wieder 
fehlinterpretiert... Ich würde mich freuen, wenn mir jemand die Augen 
hier öffnen könnte...

Gruß,
Bernd

von Vancouver (vancouver)


Lesenswert?

Erste Frage: Kommt die Fehlermeldung aus yosys oder aus Icarus? Eine 
fehlgeschlagene Assertion im C-Code sieht für mich eher nach einem nicht 
abgefangenen Bug in der Software aus. Ich kann aus dieser Fehlermeldung 
nicht erkennen, was an deinem Code nicht funktioniert. Versuch das mal 
näher einzugrenzen, z.B. Zuweisung immer an das selbe Arrayelement, etc.

Und ja, man sieht, dass du aus der C-Welt kommst :-) In deinem Code wird 
nichts instanziiert und nichts an ein Modul übergeben. Du deklarierst 
irgendwo ein Signal vom Typ DebugInfo und verbindest das mit einem 
Interface-Port deines Moduls. Das ist eine vollkommem statische 
Angelegenheit. Im Modul soll dann bei jeder steigenden Taktflanke der 
Wert des Signals an eins von 64 Registern übergeben werden, abhängig vom 
ledNo-Field. Versetzte dich mal in die Welt der Digitaltechnik und 
versuche zu ergründen, welche Schaltung dahinter steckt.

Für mich ist daran aber erstmal nichts falsch. Wie gesagt, verusche mal 
die genau Zeil zu finden, die den Fehler verursacht.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

1
  logic [5:0] ledNo;    // led to switch (1-64) <== eher 0-63
1
  _debugInfo[i_debugInfo.ledNo-1]<=i_debugInfo; <== index < 0, wenn ledNo == 0
Möglicherweise ein off-by-one Fehler?

von Bernd (65c02)


Angehängte Dateien:

Lesenswert?

Danke erstmal für die Antworten. Ich arbeite hier mit Icarus Verilog 
12.0 (stable).

Mein Modul als .ZIP anbei. Ich bekomme leider beim Simulieren den Icarus 
Fehler:

sim/visuMon_tb.sv:51: assert: elab_expr.cc:2487: failed assertion 
base_index.size()+1 == net->packed_dimensions()

CmdLine für Icarus lautet:

IVLFLAGS = -Winfloop -g2012 -gspecify -Ttyp -v #-delaborate

Die Zeile, die ihm nicht gefällt ist die Folgende:

assert(U1.arrDebugInfo[0].ledNo==1);

die folgenden beiden Zeilen, wenn ich og. einkommentiere, mag er auch 
nicht:

assert(U1.arrDebugInfo[0].color==red);
assert(U1.arrDebugInfo[0].status==1);

Bin für jeden Hinweis dankbar.

Gruß,
Bernd

von Rick D. (rickdangerus)


Lesenswert?

Wenn ich Deine Dateien Modelsim vorwerfe, kommt folgendes raus:
1
$ vlog ../src/*.*
2
Model Technology ModelSim SE-64 vlog 10.7f Compiler 2020.03 Mar 23 2020
3
Start time: 08:06:58 on Jan 28,2025
4
vlog ../src/visuMon.sv ../src/visuMon.svh 
5
** Error: ../src/visuMon.sv(7): Cannot open `include file "./syncGen/src/syncGen.v".
6
** Warning: ../src/visuMon.sv(16): (vlog-13314) Defaulting port 'i_debugInfo' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed.
7
** Error: ../src/visuMon.svh(8): Typedef 'debugInfo_t' multiply defined.
8
** Error: ../src/visuMon.svh(13): Enum literal name 'almostBlack' already exists.
9
** Error: ../src/visuMon.svh(14): Enum literal name 'darkRed' already exists.
10
** Error: ../src/visuMon.svh(15): Enum literal name 'red' already exists.
11
** Error: ../src/visuMon.svh(16): Enum literal name 'darkGreen' already exists.
12
** Error: ../src/visuMon.svh(17): Enum literal name 'green' already exists.
13
** Error: ../src/visuMon.svh(18): Enum literal name 'darkBlue' already exists.
14
** Error: ../src/visuMon.svh(19): Enum literal name 'blue' already exists.
15
** Error: ../src/visuMon.svh(20): Enum literal name 'darkGray' already exists.
16
** Error: ../src/visuMon.svh(21): Enum literal name 'gray' already exists.
17
** Error: ../src/visuMon.svh(22): Enum literal name 'yellow' already exists.
18
** Error: ../src/visuMon.svh(23): Enum literal name 'magenta' already exists.
19
** Error: ../src/visuMon.svh(24): Enum literal name 'purple' already exists.
20
** Error: ../src/visuMon.svh(26): Enum literal name 'white' already exists.
21
** Error: ../src/visuMon.svh(26): Typedef 'Color' multiply defined.
22
End time: 08:06:58 on Jan 28,2025, Elapsed time: 0:00:00
23
Errors: 16, Warnings: 1

Keine Ahnung, ob die Warnung in Zeile 16 hilfreich und berechtigt ist...

von Rick D. (rickdangerus)


Lesenswert?

Mit einer leeren ./syncGen/src/syncGen.v sieht es so aus:
1
$ vlog ../src/*.* ../sim/visuMon_tb.sv 
2
Model Technology ModelSim SE-64 vlog 10.7f Compiler 2020.03 Mar 23 2020
3
Start time: 08:11:58 on Jan 28,2025
4
vlog ../src/visuMon.sv ../src/visuMon.svh ../sim/visuMon_tb.sv 
5
** Warning: ../src/visuMon.sv(16): (vlog-13314) Defaulting port 'i_debugInfo' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed.
6
-- Compiling package visuMon_sv_unit
7
-- Compiling module visuMon
8
** Warning: ../src/visuMon.sv(16): (vlog-13314) Defaulting port 'i_debugInfo' kind to 'var' rather than 'wire' due to default compile option setting of -svinputport=relaxed.
9
-- Compiling module visuMon_tb
10
** Error: ../sim/visuMon_tb.sv(14): 'debugInfo_t' is an unknown type.
11
Or did you omit the '()' for an instantiation?
12
End time: 08:11:58 on Jan 28,2025, Elapsed time: 0:00:00
13
Errors: 1, Warnings: 2

: Bearbeitet durch User
von Bernd (65c02)


Lesenswert?

Hallo,

das Problem konnte durch die Änderungen im folgenden PR von yosys gelöst 
werden. Es handelt sich demnach um einen Fehler in yosys <=0.49+5:

https://github.com/YosysHQ/yosys/issues/4653

Ich habe den yosys Sourcecode abgerufen, und wie in diesem PR 
entsprechend geändert, kompiliert, läuft.

Dank an alle, die an einer Lösung meiner Frage mitgearbeitet haben.

Gruß,
Bernd

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.