Forum: FPGA, VHDL & Co. Iverilog: Standardwert bei Registern möglich?


von Sigint 112 (sigint)


Lesenswert?

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

von S. R. (svenska)


Lesenswert?

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.

von Hans Hämmerle (Gast)


Lesenswert?

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).

von S. R. (svenska)


Lesenswert?

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
von Sigint 112 (sigint)


Lesenswert?

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

von S. R. (svenska)


Lesenswert?

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. :-)

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

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

von S. R. (svenska)


Lesenswert?

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
von Strubi (Gast)


Lesenswert?

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