VHDL immer Variablen auf U in der Simulation

OP #7562790
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.

Angehängte Dateien:
Persönliche Seite #7564139
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.

#7564288
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...

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