Forum: FPGA, VHDL & Co. Timing Simulation Quartus+ModelSim mit Testbench - Signale gehen in unbesimmten Zusand


von Dustin F. (nudeleisen)


Lesenswert?

Hi Jungs!

Ich hab das Problem, dass meine funktionale Simulation von meiner Logik 
super mit meiner Testbench geht, aber die Timing-Simulation einfach 
nicht will. Dazu folgendes:

Wenn man Quartus gesagt hat, dass die Timing-Simulation mit ModelSim 
gemacht werden soll, fallen bei der Synthese *.vho Datein für Slow- und 
Fast-Model sowie SDO-Dateien raus. In den Dateien ist das Verhalten der 
originalen VHDL Dateien noch einmal mit den durch die Bibliotheken des 
FPGA-Chips ermittelten Signallaufzeiten nachgebildet oder?

So... funktionale Simulation ist easy: Projekt-VHDL-Dateien und 
anschließend die Testbench kompilieren und dann die Testbench einfach 
ausführen und schauen was passiert.

Wenn ich eine Timing Simulation machen möchte, mache ich folgendes:

- im Modelsim ein neues Projekt anlegen
- in dem Projekt alle benötigten Dateien rein schmeißen
  - vho-Datei
  - sdo-Datei
  - Testbench
- beim Hinzufügen der sdf-Datei muss wegen der Testbench noch eine 
Instanz angegeben werden, auf die sich die SDF-Datei beziehen soll
- alles kompilieren
- anschließend das Projekt simulieren (weil Testbench - einfach auf 
"Feuer" drücken)

Beim Kompilieren der SDO Datei wurden keine Fehler angezeigt.

Folgendes soll passieren:

Nachdem durch das von der Testbench erzeugte Input-Signal eine FSM im 
DUT gestartet wurde, soll das Ausgangssignal "abc" vom DUT von '0' auf 
'1' wechseln. Nach 3 Takten ist die FSM in einem anderen Zustand, 
wodurch das Signal "abc" wieder '0' wird.

Folgendes passiert:

"abc" = '0'
Eingangssignal von TB wird am DUT angelegt
FSM startet
"abc" = x
nach drei Takten
"abc" = '0'

Und das passiert mit allen andern Signalen auch.

Also entweder bin ich zu blöd ein Design zu machen, oder zu doof es zu 
Simulieren.
Wenn ich nur die vho Datei mit dem SDF File im Projekt einbinde, dann 
geht alles. Nur kann ich dann meine Testbench nicht benutzen, sondern 
müsste tcl Skripte schreiben. Das wäre aber wieder doof für meine 
Studienarbeit.


Ich schau alles nochmal durch. Wenn ihr auf Anhieb keine Ideen habt, was 
ich falsch mache, mach ich den Code nochmal bisschen schön und reich den 
noch nach, wenn das besser ist.

Dank euch schon mal im Voraus!!

von Duke Scarring (Gast)


Lesenswert?

Dustin F. schrieb:
> Wenn ich eine Timing Simulation machen möchte, mache ich folgendes:
Abgesehen von Deinem konkreten Problem: Warum möchtest Du eine 
Timingsimulation machen?

Man braucht schon einen guten Grund für eine Timingsimulation. Ich habe 
die Timingssimulation vor ein paar Jahren das letzte Mal gebraucht, um 
Synthesefehler im XST aufzuspüren...

Mit den passenden Timingconstraints und einem synchronen Design kann man 
auf die Timingsimulation verzichten.

Duke

von SuperWilly (Gast)


Lesenswert?

Zeig doch mal ein paar Screenshots des Wave-Verlaufes...

Vg, SuperWilly

von SuperWilly (Gast)


Lesenswert?

... für die funktionale und Timing-Simulation.

Vielleicht noch den Code-Teil dazu, der die Zutandswechsel zeigt.

von Dustin F. (nudeleisen)


Lesenswert?

Duke Scarring schrieb:
> Dustin F. schrieb:
>> Wenn ich eine Timing Simulation machen möchte, mache ich folgendes:
> Abgesehen von Deinem konkreten Problem: Warum möchtest Du eine
> Timingsimulation machen?
>

Nja, das wollte ich machen um mein Studienprojekt zu Verifizieren. Ich 
dachte, dass ich einfach meine TBs auf die neuen vho Files los lasse, 
und wenn das passt, dann hab ich meine Back-End Verifikation.

> Mit den passenden Timingconstraints und einem synchronen Design kann man
> auf die Timingsimulation verzichten.

Das Design ist synchron gehalten und Constraints hab ich für die Clocks 
bisschen eingestellt... Weil die Eingänge alle Schalter sind und die 
Ausgänge vom FPGA (incl. clk) zum ASIC gehen hab ich überall delays von 
0 gesetzt. Die Summary von Quartus ist zumindest zufrieden.


Ja ich komm gerade auch immer mehr von dieser Zeitsimulation hab. 
Vielleicht mach ich die Backen-Verifikation einfach mit Wireshark - istn 
Ethernetsendecontroller - oder so. Aber das wurmt mich trotzdem, dass 
das nich so geht wie ich will :/

von Dustin F. (nudeleisen)


Angehängte Dateien:

Lesenswert?

SuperWilly schrieb:
> ... für die funktionale und Timing-Simulation.
>
> Vielleicht noch den Code-Teil dazu, der die Zutandswechsel zeigt.

Ich hab das Augenmerk mal auf "start_tx" gelegt. Das ist das erste was 
geprüft wird und mir komisch aufgefallen ist. rst_n_cnt ist allerdings 
auch komisch und wird im zweiten Prozess generiert. Ich hab im Bild das 
Signal ctrl_in(2) vergessen. Das ist die ganze Zeit '0'....


Syntehese-Logik
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
USE IEEE.numeric_std.ALL;
4
USE WORK.memory_pkg.ALL;
5
6
entity frame_ctrl is
7
8
  port  (
9
10
    clk     : in std_logic;    
11
    rst_n    : in std_logic;
12
    saddr_in  : in std_logic_vector(memory_depth-1 downto 0);
13
    eaddr_in  : in std_logic_vector(memory_depth-1 downto 0);
14
    ctrl_in    : in std_logic_vector(15 downto 0);
15
    tx_done    : in std_logic;
16
    start_tx  : out std_logic;
17
    rst_n_cnt  : out std_logic;
18
    frame_addr  : out std_logic_vector(memory_depth-1 downto 0);
19
    frame_ctrl_done  : out std_logic;
20
    failure    : out std_logic_vector(2 downto 0)
21
  );
22
23
end frame_ctrl;
24
25
26
architecture rtl of frame_ctrl is
27
28
signal reset   : std_logic:= '1';
29
--signal fsm_state     : unsigned (3 downto 0) := (others => '0');
30
31
type state_type is (resetSTATE, 
32
      idleSTATE, 
33
      waitSTATE, 
34
      loopSTATE, 
35
      delaySTATE);
36
signal currentstate  : state_type := resetSTATE;
37
38
type cyco_type is (  resetCYCO, 
39
      idleCYCO, 
40
      execCYCO);
41
signal currentCYCO  : cyco_type := resetCYCO;
42
43
signal start_fsm   : std_logic := '0';
44
signal loop_en     : std_logic;
45
46
signal delay_en     : std_logic;
47
48
begin
49
50
51
reset <= not(rst_n);
52
start_fsm <= ctrl_in(0);
53
54
55
  transmit_count : process (clk, reset)
56
  begin
57
58
    if reset = '1' then
59
      currentstate <= resetSTATE;
60
      frame_addr <= (others => '0');
61
      failure <= "000";
62
    elsif rising_edge(clk) then
63
64
      case currentstate is
65
        
66
        when resetSTATE =>
67
          -- alle Signales werden resettet-spar ich an der Stelle mal aus
68
          currentstate <= idleSTATE;
69
        when idleSTATE => -- fsm_state <= "0000";
70
          start_tx <= '0';
71
          if start_fsm = '1' then
72
            frame_ctrl_done<='0';
73
            loop_en <= ctrl_in(1);
74
            currentstate <= waitSTATE;
75
            end if;
76
          else 
77
            currentstate <= idleSTATE;
78
          end if;
79
80
        when waitSTATE => -- fsm_state <= "0001";
81
          
82
          if tx_done = '1' then
83
            currentstate <= loopSTATE;
84
          end if;
85
          
86
        when loopSTATE => -- fsm_state <= "0010";
87
88
          if loop_en = '0' then              -- erster Fall : loop = 0; nur Paketfolge!
89
            start_tx <= '1';
90
            currentstate <= delaySTATE;
91
          end if;
92
93
        when delaySTATE => -- fsm_state <= "0100";
94
95
          start_tx <= '0';
96
97
.....
98
99
100
reset_cyco : process (clk, reset)
101
  begin
102
    if reset = '1' then
103
      currentCYCO <= resetCYCO;
104
105
    elsif rising_edge(clk) then
106
      case currentCYCO is
107
      
108
        when resetCYCO =>
109
          rst_n_cnt <= '0';
110
          currentCYCO <= idleCYCO;
111
        
112
        when idleCYCO =>
113
          rst_n_cnt <= '1';
114
          if ctrl_in(2) = '1' then
115
            rst_n_cnt <= '0';
116
            currentCYCO <= execCYCO;
117
          end if;
118
        
119
        when execCYCO =>
120
          rst_n_cnt <= '1';
121
          if (ctrl_in(2)) = '0' then
122
            currentCYCO <= idleCYCO;
123
          end if;
124
          
125
        when others =>
126
    
127
      end case;
128
    end if;
129
  end process;
130
end architecture;


Testbenchschnipsel
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
USE IEEE.numeric_std.ALL;
4
USE WORK.memory_pkg.ALL;
5
6
entity frame_ctrl_tb is end frame_ctrl_tb;
7
8
architecture TestBench of frame_ctrl_tb is
9
10
component frame_ctrl
11
  port  (clk, rst_n, tx_done  : in std_logic;
12
    saddr_in, eaddr_in  : in std_logic_vector(memory_depth-1 downto 0);
13
    ctrl_in      : in std_logic_vector(15 downto 0);
14
    start_tx, rst_n_cnt, frame_ctrl_done  : out std_logic;
15
    frame_addr    : out std_logic_vector(memory_depth-1 downto 0);
16
    failure      : out std_logic_vector(2 downto 0));
17
end component;
18
19
signal clk, rst_n, tx_done    : std_logic;
20
signal sending_done1, sending_done2  : std_logic;
21
signal saddr_in, eaddr_in    : std_logic_vector(memory_depth-1 downto 0);
22
signal ctrl_in        : std_logic_vector(15 downto 0);
23
signal start_tx, rst_n_cnt, frame_ctrl_done  : std_logic;
24
signal frame_addr      : std_logic_vector(memory_depth-1 downto 0);
25
signal failureX        : std_logic_vector(2 downto 0):=(others => '0');
26
27
signal count_delay                    : std_logic;
28
signal count_quant                    : integer := 0;
29
30
signal sending_done_process  : std_logic;
31
32
signal failure_process_en  : std_logic;
33
34
35
begin
36
37
------------- <Portmap Anfang> ------------- 
38
39
DUT: frame_ctrl
40
port map (  clk=>clk, 
41
        rst_n=>rst_n, 
42
        tx_done=>tx_done, 
43
        saddr_in=>saddr_in, 
44
        eaddr_in=>eaddr_in, 
45
        ctrl_in=>ctrl_in, 
46
        start_tx=>start_tx, 
47
        rst_n_cnt=>rst_n_cnt, 
48
        frame_ctrl_done=>frame_ctrl_done, 
49
        frame_addr=> frame_addr, 
50
        failure=>failureX);
51
52
------------- <Portmap Ende> ------------- 
53
54
stimClk: process
55
  begin
56
    clk <= '1'; wait for 20 ns;
57
    clk <= '0'; wait for 20 ns;
58
  end process stimClk;
59
60
61
watchFAILURE: process
62
  variable i : integer;
63
  begin
64
    wait until (clk'event and clk = '1');
65
    if failure_process_en = '1' then
66
      if failureX /= "000" then
67
        assert false report "FAiLuRE!!!!!!!!!!!!!!!" severity FAILURE;
68
      end if;
69
    end if;
70
  end process watchFAILURE;
71
  
72
process
73
74
  variable i,j : integer;
75
76
  begin
77
    rst_n <= '1'; wait for 100 ns;
78
    rst_n <= '0'; wait for 100 ns;
79
    rst_n <= '1'; wait for 100 ns;
80
81
    failure_process_en <= '1';
82
83
    report "______________________________________________________ Test 1.0 : package single, no delay, no loop";
84
    frame_ctrl_test ("00000", "00000", x"02", x"1", '0', '0', '0', saddr_in, eaddr_in, ctrl_in, start_tx, rst_n_cnt, frame_addr, frame_ctrl_done,  sending_done_process, count_quant, count_quant);
85
    report "______________________________________________________ Test 1.0 : successful";
86
    wait for 18000 ns;

Die Testbench generiert die signale in einer Prozedur und gibt die Werte 
dann auf die Signale.

Was noch aufgefallen ist, ist dass ModelSim nicht ganz ohne Warnings 
tut:

# Loading instances from 
C:/altera/workspace/Verifikation/nwft_ohne_nios/simulation/modelsim/netw 
ork_frame-transmitter_vhd.sdo
# Loading timing data from 
C:/altera/workspace/Verifikation/nwft_ohne_nios/simulation/modelsim/netw 
ork_frame-transmitter_vhd.sdo
# ** Warning: Design size of 2 instances exceeds ModelSim ALTERA 
recommended capacity.
# This may because you are loading cell libraries which are not 
recommended with
# the ModelSim Altera version. Expect performance to be adversely 
affected.
# ** Note: (vsim-3587) SDF Backannotation Successfully Completed.
#    Time: 0 ps  Iteration: 0  Instance: /frame_ctrl_tb File: 
C:/altera/workspace/Verifikation/nwft_ohne_nios/simulation/modelsim/fram 
e_ctrl_tb.vhd
run
run
run
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.067 ns; At : 203.093 ns
#    Time: 203093 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\cycletime[1]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.086 ns; At : 203.106 ns
#    Time: 203106 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\start_addr[0]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.086 ns; At : 203.106 ns
#    Time: 203106 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loops[7]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.086 ns; At : 203.106 ns
#    Time: 203106 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loops[6]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.086 ns; At : 203.106 ns
#    Time: 203106 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loops[4]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.086 ns; At : 203.106 ns
#    Time: 203106 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\cycletime[2]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.086 ns; At : 203.106 ns
#    Time: 203106 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\start_addr[2]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.086 ns; At : 203.106 ns
#    Time: 203106 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\start_addr[1]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.086 ns; At : 203.106 ns
#    Time: 203106 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loops[5]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.089 ns; At : 203.116 ns
#    Time: 203116 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\frame_ctrl_done~reg0\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.089 ns; At : 203.116 ns
#    Time: 203117 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loop_cnt[7]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.094 ns; At : 203.117 ns
#    Time: 203117 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loop_cnt[6]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.094 ns; At : 203.117 ns
#    Time: 203117 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loop_cnt[5]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.094 ns; At : 203.117 ns
#    Time: 203117 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loop_cnt[4]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.094 ns; At : 203.117 ns
#    Time: 203117 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loop_cnt[2]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.094 ns; At : 203.117 ns
#    Time: 203117 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loop_cnt[1]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.094 ns; At : 203.117 ns
#    Time: 203117 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loop_cnt[0]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.103 ns; At : 203.137 ns
#    Time: 203137 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\cycleend[0]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.103 ns; At : 203.137 ns
#    Time: 203137 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\quant_cnt[1]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.103 ns; At : 203.137 ns
#    Time: 203137 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\quant_cnt[0]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.103 ns; At : 203.137 ns
#    Time: 203146 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\frame_diff[1]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.129 ns; At : 203.146 ns
#    Time: 203146 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\frame_diff[3]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.129 ns; At : 203.146 ns
#    Time: 203146 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\frame_diff[4]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.129 ns; At : 203.146 ns
#    Time: 203146 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\frame_diff[5]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.129 ns; At : 203.146 ns
#    Time: 203146 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\frame_diff[0]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.126 ns; At : 203.147 ns
#    Time: 203147 ps  Iteration: 0  Instance: /frame_ctrl_tb/DUT/loop_en
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.146 ns; At : 203.181 ns
#    Time: 203189 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loops[1]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.167 ns; At : 203.189 ns
#    Time: 203189 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loops[0]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.167 ns; At : 203.189 ns
#    Time: 203189 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loop_cnt[3]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.167 ns; At : 203.189 ns
#    Time: 203189 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loops[2]\
# ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
#   Expected := 0.186 ns; Observed := 0.167 ns; At : 203.189 ns
#    Time: 203189 ps  Iteration: 0  Instance: 
/frame_ctrl_tb/DUT/\loops[3]\


Bild im Anhang.


Ich geh langsam so bisschen von VDHL-Designfehlern aus. Komisch ist nur: 
praktisch läuft das ganze Super und die funktionale Simulation funzt 
auch super....

Ach Kopf-->Tisch!

Dank´ euch schon mal fürs lesen!!

Ist das halbwegs lesbar?

von bko (Gast)


Lesenswert?

wo kommt dein Reset her?

Du hast asynchrone resets
>reset_cyco : process (clk, reset)
>  begin
>    if reset = '1' then
Siehe auch:
Beitrag "Re: Xilinx und die Resets"

In der Testbench sehe ich Ihn hier:
>  rst_n <= '1'; wait for 100 ns;
>  rst_n <= '0'; wait for 100 ns;
>  rst_n <= '1'; wait for 100 ns;

Der TB-Reset wird inaktiv bei positiver Taktflanke, deswegen die 
Hold-time Verletzung(en), und bei einer solchen wird das
"getroffene" Flipflop vom  Simulator auf 'X' gesetzt...
>#   Expected := 0.186 ns; Observed := 0.067 ns; At : 203.093 ns  <==
>#    Time: 203093 ps  Iteration: 0  Instance:
>/frame_ctrl_tb/DUT/\cycletime[1]\
># ** Warning: */DFFEAS HOLD  Low VIOLATION ON ENA WITH RESPECT TO CLK;
>#   Expected := 0.186 ns; Observed := 0.086 ns; At : 203.106 ns

>komisch ist nur: praktisch läuft das ganze Super
Evtl. verbirgt sich hier Zukünftig ein: "komisch-manchmal hängt die 
Schaltung....

von Dustin F. (nudeleisen)


Lesenswert?

bko schrieb:
> wo kommt dein Reset her?
>

Der rst_n Input wird negiert auf reset. Steht gleich nach dem Begin. Ist 
damit ich nicht durcheinander komme mit negiert und nicht negiert.


> Du hast asynchrone resets
>>reset_cyco : process (clk, reset)
>>  begin
>>    if reset = '1' then

Genau

> Siehe auch:
> Beitrag "Re: Xilinx und die Resets"
>

Weiß noch nicht worauf du hinaus willst.

Zum reset: im Asynchronen reset-Teil wird alles sofort ausgeführt. Bei 
meiner FSM hab ich nochmal einen reset-State ... der ist überflüssig 
oder? weil er ja erst wieder ausgeführt wird wenn der async-reset weg 
ist und dann u.U. erst ein Takt später ausgeführt wird, oder?



> In der Testbench sehe ich Ihn hier:
>>  rst_n <= '1'; wait for 100 ns;
>>  rst_n <= '0'; wait for 100 ns;
>>  rst_n <= '1'; wait for 100 ns;
>
> Der TB-Reset wird inaktiv bei positiver Taktflanke, deswegen die
> Hold-time Verletzung(en), und bei einer solchen wird das
> "getroffene" Flipflop vom  Simulator auf 'X' gesetzt...

Ach krass. Da muss ich beim schreiben meiner Testbench die su- und 
hold-time quasi mit berücksichtigen?! Auweia.... Wobei doch da aber auch 
der Reset async erlaubt sein sollte? Muss ich das dann in den 
Constraints beachten?
Der Reset im eigentlichen Design kann vom nem Taster oder vom Nios am 
Ende erfolgen.

>>komisch ist nur: praktisch läuft das ganze Super
> Evtl. verbirgt sich hier Zukünftig ein: "komisch-manchmal hängt die
> Schaltung....

Gut zu wissen :/

von bko (Gast)


Lesenswert?

Wie alle alle asyncronen Signale sollten auch Resets
einsyncronsisiert werden, und um mir Tipparbeit zu sparen
hab ich den Link genommen, da steht vieles zum Thema Reset
(zwar für Xilinx, gilt aber auch für Altera) einer der Beiträge
ist von Lothar und ich kanns nicht besser formulieren, deshalb noch
ein Link:
Beitrag "Re: Reset für mehrere Komponenten"

Darum die Frage, wo kommt dann in deiner Schaltung der Reset her (nicht 
in der Testbench):
>Der Reset im eigentlichen Design kann vom nem Taster oder vom Nios am
>Ende erfolgen.
Also kann er tatsächlich asyncron zum Takt sein..

>Ach krass. Da muss ich beim schreiben meiner Testbench die su- und
>hold-time quasi mit berücksichtigen?! Auweia.... Wobei doch da aber auch
>der Reset async erlaubt sein sollte? Muss ich das dann in den
>Constraints beachten?
Wenn du eine Timingsimulation machst -ja-, für den Anfang reicht es alle
Stimuli mit der fallenden Taktflanke zu ändern.

In der realen Schaltung musst du asyncrones einsyncronisieren ...
Warum, steht auch schon bei Lothar M, darum also noch ein Link:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

von Dustin F. (nudeleisen)


Lesenswert?

bko schrieb:
> Wie alle alle asyncronen Signale sollten auch Resets
> einsyncronsisiert werden, und um mir Tipparbeit zu sparen
> hab ich den Link genommen, da steht vieles zum Thema Reset
> (zwar für Xilinx, gilt aber auch für Altera) einer der Beiträge
> ist von Lothar und ich kanns nicht besser formulieren, deshalb noch
> ein Link:
> Beitrag "Re: Reset für mehrere Komponenten"
>

Krass, danke! Hatte gerade noch bisschen gelesen und gesehen, dass das 
mit dem asynch-reset nicht so einfach abzuhandeln ist.

> Also kann er tatsächlich asyncron zum Takt sein..
>

Ja. Ich spiel wegen der Problematik mit dem Gedanke, die asnychronen 
Signale über ne einfache Impuls-Detektion zu machen, damit der 
Arbeitsaufwand nicht noch weiter ausartet:

Wenn Impuls detektiert, dann gebe für einen Takt ein high-signal aus und 
sperre für paar Takte den Impuls-Detektor.
Die Smarte Lösung wäre natürlich das richtige einsynchronisieren mit 2-3 
FF :/


>>Ach krass. Da muss ich beim schreiben meiner Testbench die su- und
>>hold-time quasi mit berücksichtigen?! Auweia.... Wobei doch da aber auch
>>der Reset async erlaubt sein sollte? Muss ich das dann in den
>>Constraints beachten?

> Wenn du eine Timingsimulation machst -ja-, für den Anfang reicht es alle
> Stimuli mit der fallenden Taktflanke zu ändern.
>

nice to know!!

> http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

Danke dir! Ach FPGAs programmieren kann halt doch nich jeder^^
Neuer ToDo auf der Liste...

Mein Timing-Simulations-Problem ( siehe "start_tx" ) rührt aber woanders 
her oder?!

von SuperWilly (Gast)


Lesenswert?

Zeig doch mal zum Vergleich das Wave der funktionalen Simulation ...

von Dustin F. (nudeleisen)


Angehängte Dateien:

Lesenswert?

SuperWilly schrieb:
> Zeig doch mal zum Vergleich das Wave der funktionalen Simulation ...

gern

von SuperWilly (Gast)


Lesenswert?

Was passiert, wenn Du "ctrl_in" in der Testbench bei der 
Signal-Deklaration vorinitialisierst (mit x"0000") ?

von SuperWilly (Gast)


Lesenswert?

Was passiert, wenn Du die Stimuli (wie bereits vorgeschlagen) mit der 
fallenden Flanke der Taktes änderst?

von Dustin F. (nudeleisen)


Angehängte Dateien:

Lesenswert?

SuperWilly schrieb:
> Was passiert, wenn Du "ctrl_in" in der Testbench bei der
> Signal-Deklaration vorinitialisierst (mit x"0000") ?

Hiho,

krass, lag wirklich nur an der Signalinitialisierung! Die Hold-Time 
Verletzungen beim Reset sind auch weg. Habs danach nochmal mit Anlegen 
der andern Signale bei fallender Flanke probiert. Schaut auch gut aus! 
Muss nur nochmal die assertion-check-delay wegen der Signallaufzeiten 
anpassen.

Super danke! Auch wenn es mich jetzt ärgert, weil ich da auch selbst 
hätte drauf kommen können.
Zudem ist ärgerlich, dass ich die Initialisierungen vorher alle mal drin 
hatte. Nachdem ich dann eine Vorlesung hatte, in der unser Lehrer gesagt 
hat, dass wir alles über einen reset initialisieren sollen und nicht 
über := Zuweisungen hab ich das alles wieder raus geschmissen und nach 
reset verlagert. In den Hardwarebeschreibungs-Vorlesungen hat auch 
niemand mal was vom einsynchronisieren von asynchronen Signalen 
gesagt... na toll... und sowas als Etechniker.

Als ToDo ist jetzt also noch offen, dass die asynchronen resets in 
synchrone umgeschrieben werden müssen und das Signal vorher mit 2-3 FF 
einsynchronisiert werden muss.
Mit ist leider aufgefallen, dass die Eingänge an dem frame_ctrl Modul 
alle async sind, weil die vom NiosII über eine simple PIO-Schnittstelle 
erzeugt werden.

Hach, wieder viel gelernt. Danke!

von Duke Scarring (Gast)


Lesenswert?

Dustin F. schrieb:
> Mit ist leider aufgefallen, dass die Eingänge an dem frame_ctrl Modul
> alle async sind, weil die vom NiosII über eine simple PIO-Schnittstelle
> erzeugt werden.
Der NIOS läuft doch auch mit einem Takt. Und die PIO-Ausgänge sind zu 
diesem Takt synchron. Asynchron wird es erst, wenn Du im fram_ctrl-Modul 
eine andere Taktquelle verwendest.

Duke

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.