Forum: FPGA, VHDL & Co. VHDL immer Variablen auf U in der Simulation


von Justus B. (justus_b)


Angehängte Dateien:

Lesenswert?

Hey ich bin neu im VHDL Gebiet und wollte ein halbaddierer bauen:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity halfadder is
5
port(
6
  a, b : in std_logic;
7
  sum, carry : out std_logic
8
);
9
end halfadder;
10
11
architecture behavioral of halfadder is
12
begin
13
  sum <= a xor b;
14
  carry <= a and b;
15
end behavioral;

Bis dahin ist es soweit kein Problem, jedoch wenn ich meine Testbench:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use std.env.finish;
4
entity halfadder_tb is
5
end halfadder_tb;
6
7
architecture Behavioral of halfadder_tb is
8
9
10
signal a_sig : std_logic := '0';
11
signal b_sig : std_logic := '0';
12
signal sum_sig : std_logic := '0';
13
signal carry_sig : std_logic := '0';
14
15
16
17
  component halfadder is
18
    Port(
19
  a, b : in std_logic;
20
  sum, carry : out std_logic
21
);
22
  end component;
23
24
25
begin
26
  -- Instantiate the Halfadder
27
 dut: halfadder port map (
28
    a => a_sig,
29
    b => b_sig,
30
    sum => sum_sig,
31
    carry => carry_sig
32
  );
33
34
  -- Testbench
35
 test_pattern_gen : process begin
36
    -- Corner Case 1: A = '0', B = '0'
37
    a_sig <= '0';
38
    b_sig <= '0';
39
    wait for 10 ns;
40
    assert sum_sig ='0';
41
    assert carry_sig ='0';
42
43
    -- Corner Case 2: A = '1', B = '0'
44
    a_sig <= '1';
45
    b_sig <= '0';
46
    wait for 10 ns;
47
    assert sum_sig ='1';
48
    assert carry_sig ='0';
49
    -- Corner Case 3: A = '0', B = '1'
50
    a_sig <= '0';
51
    b_sig <= '1';
52
    wait for 10 ns;
53
    assert sum_sig ='1';
54
    assert carry_sig ='0';
55
    -- Corner Case 4: A = '1', B = '1'
56
    a_sig <= '1';
57
    b_sig <= '1';
58
    wait for 10 ns;
59
    assert sum_sig ='0';
60
    assert carry_sig ='1';
61
    -- Halt simulation
62
  end process;
63
end Behavioral;


ausführe sind meine Variablen nie initialisiert und ich bekomme nur eine 
Orangene Simulation. DAnke im voraus.

: Bearbeitet durch Moderator
von Rick D. (rickdangerus)


Angehängte Dateien:

Lesenswert?

Hast Du auch die richtige Simulation gestartet (halfadder_tb statt 
halfadder)?

von Justus B. (justus_b)


Lesenswert?

Uh blöde Frage , wie kann ich die richtige den aktiv starten?

von Rick D. (rickdangerus)


Angehängte Dateien:

Lesenswert?

Ich mach das (fast) immer zu Fuß (oder per Script):
1
vlib work
2
vcom *.vhd
3
vsim -gui halfadder_tb
4
add wave *
5
run 1 us

Man kann aber auch bei Library auf der entsprechenden Datei mit der 
rechten Maustaste "Simulate..." auswählen.

von Justus B. (justus_b)


Lesenswert?

AHH ok vielen Dank für die Hilfe! Hab meinen Glauben an mich selber 
wieder bekommen :)

von J. S. (engineer) Benutzerseite


Lesenswert?

Du solltest entweder in der Simulation einen Reset einbauen und zwar so, 
wie er real auch vorliegt und schauen, ob dann alles läuft - oder die 
Simulation mit den Init-Werten laden, die in den Registern vorliegen. 
Wenn das nicht determiniert ist, kann man das durch Variationsrechnung 
durchfahren - macht natürlich niemand.

Am Besten ist es dann, man lädt mit einem Prozess, der einmal gestartet 
wird und dann stoppt einmal alle Variablen und Signale so, wie sie im 
FPGA z.B. durch Init vorbelegt werden und den Rest mit worst case.

Ich mache es so, dass die INITs im VHDL stehen und alles, was einen 
ändernden Zustand haben kann, fest belegt. Das ist zwar technisch nicht 
besser oder sicherer, erspart aber nutzlose Simulationen von Zuständen, 
die keiner braucht. Die Zustandspeicher und Register, die Auswirkungen 
auf die Ausgänge haben, bekommen einen Reset. Alles was rechnet und 
"einschwingt" bekommt nichts dergleichen. Damit kann man sehen, wie die 
(und DASS!) dies "U"s langs aus dem System verschwinden, wenn man es 
richtig getimed hat.

von Rick D. (rickdangerus)


Lesenswert?

Justus B. schrieb:
> library ieee;
> use ieee.std_logic_1164.all;
> entity halfadder is
> port(
>   a, b : in std_logic;
>   sum, carry : out std_logic
> );
> end halfadder;
> architecture behavioral of halfadder is
> begin
>   sum <= a xor b;
>   carry <= a and b;
> end behavioral;

Jürgen S. schrieb:
> solltest entweder in der Simulation einen Reset einbauen
Wo schließe ich bei einem Halfadder den Reset an?
Außerdem funktioniert der Code von Justus. Er hatte nur versehentlich 
das DUT statt der Testbench simuliert...

von J. S. (engineer) Benutzerseite


Lesenswert?

Rick D. schrieb:
> Jürgen S. schrieb:
>> solltest entweder in der Simulation einen Reset einbauen
> Wo schließe ich bei einem Halfadder den Reset an?

Nirgendwo(?) Der HA ist eine der Schaltungen, die "einschwingen" und 
keinen Zustand haben (müssen), weil es innen nichts gibt, wo sich die 
Historie der Nutzung auf das Ergebnis auswirkt.

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.