mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Sigint 1. (sigint)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: S. R. (svenska)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans Hämmerle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: S. R. (svenska)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Sigint 1. (sigint)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: S. R. (svenska)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Sigint 1. (sigint)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ein Bild sagt mehr als tausend Worte. :-)
Hier mal ein Testcase für mein Problem.
module test(
  output [3:0]n1,
  output [3:0]n2
  );

  initial begin
  $dumpfile("eor.vcs");
  $dumpvars(0,test);
  #10 $finish();
  end
  
  
reg [3:0]leer;
reg [3:0]voll=4'ha;

assign n1=leer^leer;
assign n2=voll^voll;


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

Autor: S. R. (svenska)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Strubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.