Hi zusammen, ich hab ne kurze Frage: Ist es bei Icarus Verilog möglich nicht initialisierten Registern einen Standardwert zu geben? Ich versuche den navre-softcore zu simulieren, bekomme aber ziemlich viele "x", da einige Register keinen Anfangswert haben. (z.B. die GPR) Vielen Dank für die Hilfe. Gruß, SIGINT
Bist du sicher, dass "Register initialisieren" die richtige Lösung ist? Ich hatte ein ähnliches Problem mit einem IP-Core, der schlicht einen Reset-Puls für die Initialisierung benötigt hat. Ohne Reset lief er weder in der Simulation noch in der Synthese korrekt an.
S. R. schrieb: > Bist du sicher, dass "Register initialisieren" die richtige Lösung ist? Kommt auf die FPGA-Familie an, bei Xilinx kann man FF ohne reset auf einen bestimmten Wert initialisieren. signal example is Std_logic_vector(7 downto 0) := "01010111"; Im unterschied zu anderen familien ist dieser Wert auch in Simulation und im Reallife nach PowerUp gesetzt. Je nach Branche ist eine solche Technik toleriert (Consumer) oder verboten (Avionik).
Hans Hämmerle schrieb: > Kommt auf die FPGA-Familie an, bei Xilinx kann man FF > ohne reset auf einen bestimmten Wert initialisieren. Das sagt erstmal nur, dass es möglich ist. Wenn der vorhandene IP-Core das aber nicht nutzt, sondern immer einen Reset erwartet, dann hilft eine Initialisierung vermutlich nicht weiter. Daher meine Nachfrage. Ich nutze das privat durchgängig.
:
Bearbeitet durch User
Guten Abend zusammen, erstmal Danke für die Posts. Ich nutze natürlich den Reset, um den Core in einen definierten Zustand zu versetzen. Einige Register werden aber beim Reset nicht auf einen definierten Wert gesetzt. Unter anderem die GPRs. Das bereitet in der Simulation natürlich Probleme. Meines Wissens nach funktioniert das in Hardware aber ohne Probleme, da die Register in Hardware einen zufälligen Wert annehmen. (oder irre ich mich da?) Ein Register, das z.B. als Ziwschenspeicher verwendet wird, braucht nicht unbedingt einen definierten Anfangszustand. RAM Bausteine enthalten beim Einschalten ja auch nur Zufallswerte. Gruß, SIGINT
Sigint 1. schrieb: > Ich nutze natürlich den Reset, um den > Core in einen definierten Zustand zu versetzen. Gut, dann wäre das geklärt. Sigint 1. schrieb: > Einige Register werden aber beim Reset nicht auf einen > definierten Wert gesetzt. Unter anderem die GPRs. Ich vermute, du redest von einem Softcore. Je nach Architektur sind da die Registerwerte nach Reset tatsächlich nicht definiert. Sigint 1. schrieb: > Das bereitet in der Simulation natürlich Probleme. Was ist denn das Problem genau? Wenn im Timingdiagramm ein X steht, dann ist das schlicht korrekt (der Wert ist nicht vorhersehbar - auf realer Hardware ist das ein Zufallswert). Solange du diese Werte nicht benutzt, bevor du sie schreibst, sollte es keine Probleme geben. Alles andere ist ein Fehler. Um eine zuverlässige Simulation zu erhalten, die mit dem Verhalten der Hardware übereinstimmt, solltest du die Register also vorher korrekt setzen. Sigint 1. schrieb: > Ein Register, das z.B. als Ziwschenspeicher verwendet wird, > braucht nicht unbedingt einen definierten Anfangszustand. Aber es sollte nicht benutzt werden, bevor es einen definierten Zustand bekommt. :-)
Ein Bild sagt mehr als tausend Worte. :-) Hier mal ein Testcase für mein Problem.
1 | module test( |
2 | output [3:0]n1, |
3 | output [3:0]n2 |
4 | ); |
5 | |
6 | initial begin |
7 | $dumpfile("eor.vcs"); |
8 | $dumpvars(0,test); |
9 | #10 $finish(); |
10 | end |
11 | |
12 | |
13 | reg [3:0]leer; |
14 | reg [3:0]voll=4'ha; |
15 | |
16 | assign n1=leer^leer; |
17 | assign n2=voll^voll; |
18 | |
19 | |
20 | endmodule |
Das Register "leer" ist in der Simulation undefiniert ("x"). In der Hardware steht da aber ein Zufallswert drin. (wahrscheinlich 0) Wenn der Wert "A" im Register "voll" steht, dann gibt die XOR Verknüpfung korrerterweise "0" zurück. Ist das Register aber "X", dann gibt XOR auch "X" zurück, obwohl es eigentlich "0" liefern sollte. (jedenfalls in der Hardware) Mach ich da irgendwie einen Denkfehler, oder ist die Simultion in diesem Punkt wirklich etwas ungünstig programmiert? (Es ist kein direkter Fehler) Gruß, SIGINT
Sigint 1. schrieb: > Das Register "leer" ist in der Simulation undefiniert ("x"). Richtig. Sigint 1. schrieb: > In der Hardware steht da aber ein Zufallswert drin. Richtig. > (wahrscheinlich 0) Falsch: Ein Zufallswert ist nicht "wahrscheinlich 0". Sigint 1. schrieb: > Mach ich da irgendwie einen Denkfehler, > oder ist die Simultion in diesem > Punkt wirklich etwas ungünstig programmiert? Wenn du einen unbekannten Wert invertierst, dann ist er immernoch unbekannt. Genau das sagt dir die Simulation. Nachtrag: Ich sehe gerade, dass du den Wert mit sich selbst verknüpfst. Das sollte tatsächlich immer "0000" liefern, unabhängig vom Wert. Insofern könnte das tatsächlich ein Mangel der Simulation sein.
:
Bearbeitet durch User
Sigint 1. schrieb: > Mach ich da irgendwie einen Denkfehler, oder ist die Simultion in diesem > Punkt wirklich etwas ungünstig programmiert? (Es ist kein direkter > Fehler) In meiner Simulationsumgebung will ich ansich die Warnung sehen, wenn nicht-initialisierte Werte in eine Operation eingehen, u.U. ist das sogar ein Abbruchkriterium. Aber du hast recht, dass im Spezialfall 'xor r0 r0', oder wie auch immer das bei dir aussieht, ein Register (bei einigen Architekturen) auf 0 initialisiert würde, und das für die Prozessorsimulation so funktional völlig korrekt wäre. Die VHDL-Puristen definieren sich dann für den Fall einen Datentyp, weiss nicht, ob/wie das bei Verilog geht.
Beitrag #5849992 wurde von einem Moderator gelöscht.
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.