Verilog: array einer packed struct indizieren F1 bitte.

OP #7818142
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

#7818782
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.

OP #7818905
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

Angehängte Dateien:
#7819124
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...

#7819126
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
OP #7820574
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren