mikrocontroller.net

Forum: FPGA, VHDL & Co. Clock loop für N cycles


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.
von Patrick M. (Firma: na) (bitdiver)


Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich frage mich wie ich im Verilog eine CLK für eine Testbench baue.
Im VHDL hatte ich diesen "Process" welcher mir gut gefallen hat:
  
  begin
    clk <= not clk;
    wait for clk_period/2;
  
    if NOW > 100 ns then
      wait;
    end if;
  end process;

von Vancouver (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nicht getestet, aber sollte so gehen:
initial begin
   clk <= 0;
   for (int j=0; j<100; ++j)
      #clk_half_period clk <= ~clk;
end

Es ist allerdings recht ungewöhnlich, einen Takt zu stoppen. Meistens 
lässt man den durchlaufen und stoppt stattdessen die Simulation nach der 
gewissen Zeit.

von Christoph Z. (christophz)


Bewertung
0 lesenswert
nicht lesenswert
Vancouver schrieb:
> Es ist allerdings recht ungewöhnlich, einen Takt zu stoppen. Meistens
> lässt man den durchlaufen und stoppt stattdessen die Simulation nach der
> gewissen Zeit.

In VHDL finde ich das gar nicht ungewöhnlich, da es keine reguläre 
Möglichkeit gibt den Simulator zu stoppen.

- Also entweder gibt es nichts mehr zu simulieren, dann stoppt der 
Simulator von selber (darum den Takt nach einer Weile/per Signal 
stoppen)
- Ein assert false severity failure; machen, dann stoppt der Simulator 
auch, ist aber super hässlich, dass in der letzten Zeit des Logfiles 
"failure" steht und in der Zeile darüber "simulation done, everything 
OK" oder so ähnlich :-)

von Vancouver (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Christoph Z. schrieb:
> - Also entweder gibt es nichts mehr zu simulieren, dann stoppt der
> Simulator von selber (darum den Takt nach einer Weile/per Signal
> stoppen)

Das wird bei komplexeren Simulation aber anstrengend, wenn du viele 
Clocks und Datenquellen einzeln stoppen musst, damit die Eventqueue des 
Simulators leer läuft. Außerdem weiß man nicht immer im Voraus, nach 
wievielen Takten eine Simulation durch ist.

Christoph Z. schrieb:
> Ein assert false severity failure; machen, dann stoppt der Simulator
> auch, ist aber super hässlich,

Das ist in VHDL der offizielle Weg um eine Simulation zu beenden. In 
Verilog ist es $finish oder $stop. Beides erlaubt es dir, in der 
Simulation z.B. ein Statusbit zu pollen und dann den Simulator zu 
stoppen.

von Christopher C. (trihexagon)


Bewertung
2 lesenswert
nicht lesenswert
Seit VHDL-2008 gibt es in VHDL auch stop und finish als Anweisung (in 
std.env).

von Christoph Z. (christophz)


Bewertung
0 lesenswert
nicht lesenswert
Christopher C. schrieb:
> Seit VHDL-2008 gibt es in VHDL auch stop und finish als Anweisung (in
> std.env).

Vielen dank!

Vancouver schrieb:
> Das wird bei komplexeren Simulation aber anstrengend, wenn du viele
> Clocks und Datenquellen einzeln stoppen musst, damit die Eventqueue des
> Simulators leer läuft. Außerdem weiß man nicht immer im Voraus, nach
> wievielen Takten eine Simulation durch ist.

Ja, ich weiss ich nicht, wie lange meine Simulation läuft, bzw. ich kann 
das auch mit ein paar Variablen anpassen bzw. Testcases per externer 
Datei aktivieren/deaktivieren.

Jeder Clockgenerator und Datenquelle bekommt einen boolean Eingang 
"EndOfSim" und alle werden miteinander verbunden.

von Vancouver (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Klar, das kann man so machen. Viele Wege führen nach Rom. Ich frage mich 
nur, ob sich der Aufwand lohnt, nur um eine "hässliche" Meldung ganz am 
Ende des Logfiles zu vermeiden, deren Grund ja auch bekannt ist.

Wenn der interessante Teil durchsimuliert ist, kann man die Simulation 
einfach abbrechen und gut is. Das kontrollierte Stoppen aller 
Taktquellen erfüllt an dieser Stelle keinen Zweck mehr, außer du willst 
tatsächlich wissen, wie dein Design darauf reagiert. Aber nur um dem 
Simulator zu sagen, dass er jetzt aufhören soll, ist das ziemlich viel 
Aufwand..

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
Gibt es in Verilog kein "after"?

CLK <= not CLK after 5 ns;

Würde man doch im VHDL schreiben.

von vancouver (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
#5 clk <= ~clk;

Verilog ist weniger geschwätzig :-)

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.