Forum: FPGA, VHDL & Co. Woher kommt X / wie vermeiden in dieser Verilog Counter TB ?


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)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich verstehe nicht genau woher das X in dieser einfacher Counter TB 
kommt?
Welche Optionen zum Debuggen gibt es?

Vielen Dank

TB
`timescale 1 ns / 1 ps
module top_counter;

  reg clk;

  parameter N_cycles = 20;
  parameter pulse_width = 5;
  integer j;

  initial begin
    $dumpfile("waves.vcd");
    $dumpvars();

  end

  initial begin
   clk <= 0;
   for (j=0; j<N_cycles; j = j + 1)
      #pulse_width clk <= ~clk;
  end

  reg counter_rstn_tb;
  reg counter_en_tb;
  wire [1:0] counter_n_tb;

  counter #( .N(2)) u0(
     .clk(clk),
     .rstn(counter_rstn_tb),
     .en(counter_en_tb),
     .out(counter_n_tb)
  );

 initial begin
     counter_en_tb <= 0;
     counter_rstn_tb <= 0;
     #4 counter_rstn_tb <= 1;
     #8 counter_en_tb <= 0;
     #10 counter_en_tb <= 1;
     #20 counter_en_tb <= 1;
  end 

endmodule



Counter
// https://www.chipverify.com/verilog/verilog-parameters
module counter

  #(    parameter N = 2,
                parameter DOWN = 0)

  ( input     clk,
    input     rstn,
    input     en,
    output  reg [N-1:0] out);

  always @ (posedge clk) begin
    if (!rstn) begin
      out <= 0;
    end else begin
      if (en)
        if (DOWN)
          out <= out - 1;
        else
          out <= out + 1;
      else
         out <= out;
    end
  end
endmodule

von DDR3 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kenn kein verilog. Deswegen nur eine Vermutung:

Dein Reset ist low aktiv und wird synchron zur steigenden Flanke von clk 
gesampled. Im Timingdiagramm sieht es so aus, als würde der Counter nie 
einen reset Puls bekommen, da der Reset auf high geht, bevor die erste 
Flanke kommt. Spricht dein Counter bleibt uninitialisiert und es 
passiert Mist.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Patrick M. schrieb:
> always @ (posedge clk) begin
Was passiert, wenn du dort den offensichtlich asynchron gewollten Reset 
auch mit reinnimmst:
https://electronics.stackexchange.com/questions/163018/asynchronous-reset-in-verilog

: Bearbeitet durch Moderator
von Patrick M. (Firma: na) (bitdiver)


Bewertung
0 lesenswert
nicht lesenswert
ah, genau, gut gesehen ... die sensitivity list war nicht korrekt.
aber das setup der stimuli kann ich auch verbessern, danke!

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Patrick M. schrieb:
> die sensitivity list war nicht korrekt.
Oder eben der Reset nicht lang genug aktiv...
Kommt wie gesagt drauf an, ob du einen asynchronen oder einen synchronen 
Reset in deinem Baustein haben willst.

von DDR3 (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Darf ich mal naiv nachfragen, warum das Signal auf "X" steht. Von meinem 
VHDL-Wissen her würde ich ein "U" erwarten in diesem Fall. Ein X 
entsteht doch wenn von verschiedenen Quellen getrieben wird, oder?

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
DDR3 schrieb:
> VHDL-Wissen
Hilft bei Verilog nur begrenzt (siehe dort Seite 4: 
https://cseweb.ucsd.edu/classes/sp11/cse141L/pdf/01/SV_Part_1.pdf)

> Von meinem VHDL-Wissen her würde ich ein "U" erwarten in diesem Fall.
> Ein X entsteht doch wenn von verschiedenen Quellen getrieben wird, oder?
Und 'U' gibts bei VHDL auch nur beim Datentyp std_logic und abgeleiteten 
Versionen (oder Datentypen, wo eben ein 'U' definiert wird.. ;-).
Was bei einem Konflikt aus einem Signal wird, das steht in der passenden 
"Resolution Table". Wenn bei VHDL z.B. zwei Quellen eine '1' treiben, 
dann kommt trotzdem eine '1' heraus.

: Bearbeitet durch Moderator
von Patrick M. (Firma: na) (bitdiver)


Bewertung
0 lesenswert
nicht lesenswert
Die Slides geben eine gute Ubersicht. D.h. fuer synchrone Designs 
addieren wir ein #pulse_width delay zwischen Clock und Steuersignale, 
somit hat man immer die steigende Flanke in der Mitte vom Signal Puls ?

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Patrick M. schrieb:
> D.h. fuer synchrone Designs addieren wir ein #pulse_width delay
Das ist jetzt in erster Linie nur für den Simulator. Dort muss für 
synchrone Designs natürlich während der aktiven (steigenden) Taktflanke 
der Reset ebenfalls aktiv (low) sein, damit er sich auswirkt.
Kurz gesagt: der synchrone Reset muss einfach mindestens 1 Taktzyklus 
lang aktiv sein. Er kann aber auch 5 oder 10 oder 100 oder 1000 Takte 
aktiv sein. So lange läuft dann das Design halt nicht los.

Für den Synthesizer bzw. die Umsetzung in Hardware ist allerdings allein 
das Hinzufügen oder Weglassen des "negedge reset" in der Sensitivliste 
zuständig dafür, ob das Design auf dem FPGA mit einem asynchronen oder 
synchronen Reset umgesetzt wird.
Was NÖTIG oder BESSER ist, das findest du im Datenblatt zu den 
Logikblöcken deines speziellen FPGAs.

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.