Forum: FPGA, VHDL & Co. Vergleichen mit std_logic_arith


von Duke Scarring (Gast)


Lesenswert?

Hallo Forum!

Hier ist mal ein Beispiel, warum man std_logic_arith nicht verwenden 
sollte:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all; -- to avoid like the plague
4
--use ieee.numeric_std.all;
5
6
entity arith_test is
7
    port(
8
        value   : in  unsigned(2 downto 0);
9
        greater : out std_ulogic
10
    );
11
end entity arith_test;
12
13
architecture rtl of arith_test is
14
15
begin
16
17
    process( value)
18
    begin
19
        greater <= '0';
20
21
        if value > 8 then
22
            greater <= '1';
23
        end if;
24
    end process;
25
26
end architecture rtl;
27
28
29
30
library ieee;
31
use ieee.std_logic_1164.all;
32
use ieee.std_logic_arith.all; -- to avoid like the plague
33
--use ieee.numeric_std.all;
34
35
entity arith_test_tb is
36
end entity arith_test_tb;
37
38
architecture testbench of arith_test_tb is
39
40
    signal tb_value    : unsigned(2 downto 0);
41
    signal tb_greater  : std_ulogic;
42
43
44
begin
45
46
    dut: entity work.arith_test
47
        port map (
48
            value   => tb_value,
49
            greater => tb_greater
50
        );
51
52
53
    process
54
    begin
55
        tb_value <= "000";
56
        wait for 10 ns;
57
        report "--------> new value: 0";
58
59
        if tb_greater = '1' then
60
            report "YES: it's greater then 8";
61
        end if;
62
63
        tb_value <= "110"; 
64
        wait for 10 ns;
65
        report "--------> new value: 6";
66
67
        if tb_greater = '1' then
68
            report "YES: it's greater then 8";
69
        end if;
70
71
        wait; -- forever
72
    end process;
73
74
end architecture testbench;

Durch eine unsaubere Implementation des Vergleiches (innerhalb der 
std_logic_arith) liefert die Simulation flasche Ergebisse.
Immerhin gibt der Synthesizer (xst) eine - wenn auch nicht direkt 
ziehlführende - Warnung aus. Und er liefert das erwartete Ergebniss.

Mit numeric_std stimmt die Simulation und die Synthese (und die 
Mathematik) überein.

Das Beispiel hier mag simpel erscheinen, dafür ist es ein 
Minimalbeispiel. Man kann sich vorstellen wie lange man in einem 
größeren Projekt nach solchen Fehlern suchen kann...

Duke

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


Lesenswert?

Duke Scarring schrieb:
> Immerhin gibt der Synthesizer (xst) eine - wenn auch nicht direkt
> ziehlführende - Warnung aus.
Synplify (Lattice) sagt:
1
@W: CL159 :"...\stdlogicarith.vhd":8:8:8:12 | Input value is unused
Klar, denn value kann mit seinen 3 Bits niemals größer als 8 
werden...



Und, falls einer fragt, das passiert auch hier, wenn man traditionsgemäß 
einen std_logic_vector übergibt und die std_logic_unsigned.all hernimmt:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all; -- to avoid like the plague
4
use IEEE.std_logic_unsigned.all; -- to avoid like the plague
5
6
entity arith_test is
7
    port(
8
        value   : in  std_logic_vector(2 downto 0);
9
        greater : out std_ulogic
10
    );
11
end entity arith_test;
12
13
architecture rtl of arith_test is
14
15
begin
16
17
    process(value)
18
    begin
19
        greater <= '0';
20
        if value > 8 then
21
            greater <= '1';
22
        end if;
23
    end process;
24
25
end architecture rtl;
26
27
28
29
library ieee;
30
use ieee.std_logic_1164.all;
31
use ieee.std_logic_arith.all; -- to avoid like the plague
32
use IEEE.std_logic_unsigned.all; -- to avoid like the plague
33
34
entity arith_test_tb is
35
end entity arith_test_tb;
36
37
architecture testbench of arith_test_tb is
38
39
    signal tb_value    : std_logic_vector(2 downto 0);
40
    signal tb_greater  : std_ulogic;
41
42
begin
43
44
    dut: entity work.arith_test
45
        port map (
46
            value   => tb_value,
47
            greater => tb_greater
48
        );
49
50
51
    process
52
    begin
53
        tb_value <= "000";
54
        wait for 10 ns;
55
        report "--------> new value: 0";
56
        if tb_greater = '1' then
57
            report "YES: it's greater then 8";
58
        end if;
59
60
        tb_value <= "110"; 
61
        wait for 10 ns;
62
        report "--------> new value: 6";
63
        if tb_greater = '1' then
64
            report "YES: it's greater then 8";
65
        end if;
66
67
        wait; -- forever
68
    end process;
69
70
end architecture testbench;


Ja was passiert denn überhaupt, fragen jetzt die, die das nicht selber 
simulieren können oder wollen?
Das hier (Aldec Active-HDL):
1
# EXECUTION:: NOTE   : --------> new value: 0
2
# EXECUTION:: NOTE   : YES: it's greater then 8
3
4
# EXECUTION:: NOTE   : --------> new value: 6
5
# EXECUTION:: NOTE   : YES: it's greater then 8

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.