OpenCores
URL https://opencores.org/ocsvn/ternary_adder/ternary_adder/trunk

Subversion Repositories ternary_adder

[/] [ternary_adder/] [trunk/] [vhdl/] [tb_ternary_adder.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 plutonium
---------------------------------------------------------------------------------------------
2
-- Author:          Martin Kumm
3
-- Contact:         kumm@uni-kassel.de
4
-- License:         LGPL
5
-- Date:            04.04.2013
6
--
7
-- Description:
8
-- Testbench for testing a single ternary adder component
9
---------------------------------------------------------------------------------------------
10
 
11
library ieee;
12
use ieee.std_logic_1164.all;
13
use ieee.numeric_std.all;
14
use ieee.math_real.all; -- for uniform, trunc functions
15
 
16
entity tb_ternary_adder is
17
  generic(
18
    input_word_size  : integer := 15;
19
    subtract_y       : boolean := false;
20
    subtract_z       : boolean := true;
21
    use_output_ff    : boolean := false
22
  );
23
end tb_ternary_adder;
24
 
25
architecture tb_ternary_adder_arch of tb_ternary_adder is
26
 
27
signal clk, rst : std_logic := '0';
28
signal x,y,z : std_logic_vector(input_word_size-1 downto 0) := (others => '0');
29
signal sum : std_logic_vector(input_word_size+1 downto 0) := (others => '0');
30
 
31
signal sum_ref,sum_dut: integer := 0;
32
 
33
begin
34
  dut: entity work.ternary_adder
35
    generic map (
36
      input_word_size  => input_word_size,
37
      subtract_y       => subtract_y,
38
      subtract_z       => subtract_z,
39
      use_output_ff    => use_output_ff
40
    )
41
    port map (
42
      clk_i => clk,
43
      rst_i => rst,
44
      x_i   => x,
45
      y_i   => y,
46
      z_i   => z,
47
      sum_o => sum
48
    );
49
 
50
  clk <= not clk after 5 ns;  -- 100 MHz
51
  rst <= '1', '0' after 5 ns;
52
 
53
  process
54
    variable seed1,seed2: positive;
55
    variable rand : real;
56
    variable x_int,y_int,z_int : integer;
57
  begin
58
      uniform(seed1, seed2, rand);
59
      x_int := integer(trunc(rand*real(2**(input_word_size-2)-1)));
60
      uniform(seed1, seed2, rand);
61
      y_int := integer(trunc(rand*real(2**(input_word_size-2)-1)));
62
      uniform(seed1, seed2, rand);
63
      z_int := integer(trunc(rand*real(2**(input_word_size-2)-1)));
64
      x <= std_logic_vector(to_signed(x_int, x'length)); -- rescale, quantize and convert
65
      y <= std_logic_vector(to_signed(y_int, y'length)); -- rescale, quantize and convert
66
      z <= std_logic_vector(to_signed(z_int, z'length)); -- rescale, quantize and convert
67
      wait until clk'event and clk='1';
68
  end process;
69
 
70
  process(clk,rst,x,y,z)
71
    variable y_sgn,z_sgn,sum_ref_unsync : integer;
72
  begin
73
    if subtract_y = true then
74
      y_sgn := -1*to_integer(signed(y));
75
    else
76
      y_sgn := to_integer(signed(y));
77
    end if;
78
    if subtract_z = true then
79
      z_sgn := -1*to_integer(signed(z));
80
    else
81
      z_sgn := to_integer(signed(z));
82
    end if;
83
    sum_ref_unsync := to_integer(signed(x)) + y_sgn + z_sgn;
84
 
85
    if use_output_ff = false then
86
      sum_ref <= sum_ref_unsync;
87
    else
88
      if clk'event and clk='1' then
89
        sum_ref <= sum_ref_unsync;
90
      end if;
91
    end if;
92
 
93
        end process;
94
 
95
  process(clk,rst,sum_ref)
96
  begin
97
  end process;
98
 
99
  sum_dut <= to_integer(signed(sum));
100
 
101
  process
102
    begin
103
      wait for 50 ns;
104
      loop
105
        wait until clk'event and clk='0';
106
        assert (sum_dut = sum_ref) report "Test failure" severity failure;
107
        wait until clk'event and clk='1';
108
      end loop;
109
  end process;
110
 
111
end architecture;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.