Woher kommt X / wie vermeiden in dieser Verilog Counter TB ?

OP (Firma: na) #6383228
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
Angehängte Dateien:
Gast #6383265
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.
Moderator (Firma: Titel) Persönliche Seite #6383607
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.
Moderator (Firma: Titel) Persönliche Seite #6384095
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren