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
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.
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?
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
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.