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


von Patrick M. (Firma: na) (bitdiver)


Angehängte Dateien:

Lesenswert?

Hi,

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

Vielen Dank

TB
1
`timescale 1 ns / 1 ps
2
module top_counter;
3
4
  reg clk;
5
6
  parameter N_cycles = 20;
7
  parameter pulse_width = 5;
8
  integer j;
9
10
  initial begin
11
    $dumpfile("waves.vcd");
12
    $dumpvars();
13
14
  end
15
16
  initial begin
17
   clk <= 0;
18
   for (j=0; j<N_cycles; j = j + 1)
19
      #pulse_width clk <= ~clk;
20
  end
21
22
  reg counter_rstn_tb;
23
  reg counter_en_tb;
24
  wire [1:0] counter_n_tb;
25
26
  counter #( .N(2)) u0(
27
     .clk(clk),
28
     .rstn(counter_rstn_tb),
29
     .en(counter_en_tb),
30
     .out(counter_n_tb)
31
  );
32
33
 initial begin
34
     counter_en_tb <= 0;
35
     counter_rstn_tb <= 0;
36
     #4 counter_rstn_tb <= 1;
37
     #8 counter_en_tb <= 0;
38
     #10 counter_en_tb <= 1;
39
     #20 counter_en_tb <= 1;
40
  end 
41
42
endmodule



Counter
1
// https://www.chipverify.com/verilog/verilog-parameters
2
module counter
3
4
  #(    parameter N = 2,
5
                parameter DOWN = 0)
6
7
  ( input     clk,
8
    input     rstn,
9
    input     en,
10
    output  reg [N-1:0] out);
11
12
  always @ (posedge clk) begin
13
    if (!rstn) begin
14
      out <= 0;
15
    end else begin
16
      if (en)
17
        if (DOWN)
18
          out <= out - 1;
19
        else
20
          out <= out + 1;
21
      else
22
         out <= out;
23
    end
24
  end
25
endmodule

von DDR3 (Gast)


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

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.