--

-- ****************************************************************************
--                                                                           --
--     Copyright @ 1999                                                      --
--                                                                           --
--     Tetraedre SARL,  chenes 19,   2072 Saint-Blaise,  Switzerland         --
--                                                                           --
-- ****************************************************************************
--                                                                           --
-- Filename  : tcdg_bench.vhd                                                --
--                                                                           --
-- ****************************************************************************
--                                                                           --
-- WARNING: This file is the property of Tetraedre SARL, Switzerland. This   --
-- file is protected by a copyright. The reading, copying, compilation,      --
-- synthesis and other use of this file is forbidden without a written       --
-- agreement signed by Tetraedre SARL, Switzerland.                          --
--                                                                           --
-- IN NO EVENT SHALL TETRAEDRE SARL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER--
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING   --
-- FROM, OUT OF OR IN CONNECTION WITH THIS DESCRIPTION OR THE USE OF IT.     --
--                                                                           --
-- ****************************************************************************







---------------------------------------------------------------------------
------------------------------   tcdg_bench    ---------------------------- 
---------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
entity tcdg_bench is
end;



---------- Architecture bench ---------- 
library ieee, work;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;



architecture simple of tcdg_bench is

    signal key    : std_logic_vector(63 downto 0);
    signal d      : std_logic_vector(63 downto 0);
    signal start  : std_logic;
    signal crypt  : std_logic;
    signal erreur : std_logic;
    signal clk    : std_logic;
    signal nreset : std_logic;
    signal q      : std_logic_vector(63 downto 0);
    signal done   : std_logic;

    component tcdg 
    port (
         key   : in  std_logic_vector(63 downto 0);
         d     : in  std_logic_vector(63 downto 0);
         start : in  std_logic;
         crypt : in  std_logic;
         clk   : in  std_logic;
         nreset: in  std_logic;
         q     : out std_logic_vector(63 downto 0);
         done  : out std_logic
    );
    end component;


begin



    i_tcdg : tcdg
    port map (
        key   => key,
        d     => d,
        crypt => crypt,
        start => start,
        clk   => clk,
        nreset=> nreset,
        q     => q,
        done  => done
    );


    process
    begin
        nreset <= '0';
        wait for 100 ns;
        nreset <= '1';
        wait;
    end process;



    P41 : process
    begin
        clk <= '0';
        wait for 500 ns;
        clk <= '1';
        wait for 500 ns;
    end process;


    -- ********************************************************
    -- ****                TEST PROCEDURE                  ****
    -- ********************************************************
    P42 : process
    procedure des_test(constant xdatain : in  bit_vector(63 downto 0);
                       constant xkey    : in  bit_vector(63 downto 0);
                       constant xexpect : in  bit_vector(63 downto 0);
                       constant xcrypt  : in  std_logic              ) is
        variable expect : std_logic_vector(63 downto 0);
    begin
        crypt <= xcrypt;
        d     <= to_stdlogicvector(xdatain);
        key   <= to_stdlogicvector(xkey);
        start <= '1';
        wait for 1000 ns;
        start <= '0';
        d     <= (others=>'0');
        wait on done;
        wait for 400 ns;

        expect := to_stdlogicvector(xexpect);
        assert q=expect report "------------- !!! ERROR !!! " 
                    severity error;
        if (q/=expect) then
            erreur <= '1';
        end if;
        wait for 50 ns;

    end des_test;



    -- ********************************************************
    -- ****                TEST VECTORS                    ****
    -- ********************************************************

    begin
        start  <= '0';
        erreur <= '0';
        wait for 2000 ns;

des_test(X"0663D1B37C48090C",X"23456789ABCDEF01",X"3FA40E8A984D4815",'1');
des_test(X"95A8D72813DAA94D",X"8001010101010101",X"0000000000000000",'0');
des_test(X"0EEC1487DD8C26D5",X"4001010101010101",X"0000000000000000",'0');
des_test(X"7AD16FFB79C45926",X"2001010101010101",X"0000000000000000",'0');
des_test(X"D3746294CA6A6CF3",X"1001010101010101",X"0000000000000000",'0');
des_test(X"809F5F873C1FD761",X"0801010101010101",X"0000000000000000",'0');
des_test(X"C02FAFFEC989D1FC",X"0401010101010101",X"0000000000000000",'0');
des_test(X"4615AA1D33E72F10",X"0201010101010101",X"0000000000000000",'0');
des_test(X"2055123350C00858",X"0180010101010101",X"0000000000000000",'0');
des_test(X"DF3B99D6577397C8",X"0140010101010101",X"0000000000000000",'0');
des_test(X"31FE17369B5288C9",X"0120010101010101",X"0000000000000000",'0');
des_test(X"DFDD3CC64DAE1642",X"0110010101010101",X"0000000000000000",'0');
des_test(X"178C83CE2B399D94",X"0108010101010101",X"0000000000000000",'0');
des_test(X"50F636324A9B7F80",X"0104010101010101",X"0000000000000000",'0');
des_test(X"A8468EE3BC18F06D",X"0102010101010101",X"0000000000000000",'0');
des_test(X"A2DC9E92FD3CDE92",X"0101800101010101",X"0000000000000000",'0');
des_test(X"CAC09F797D031287",X"0101400101010101",X"0000000000000000",'0');
des_test(X"90BA680B22AEB525",X"0101200101010101",X"0000000000000000",'0');
des_test(X"CE7A24F350E280B6",X"0101100101010101",X"0000000000000000",'0');
des_test(X"882BFF0AA01A0B87",X"0101080101010101",X"0000000000000000",'0');
des_test(X"25610288924511C2",X"0101040101010101",X"0000000000000000",'0');
des_test(X"C71516C29C75D170",X"0101020101010101",X"0000000000000000",'0');
des_test(X"5199C29A52C9F059",X"0101018001010101",X"0000000000000000",'0');
des_test(X"C22F0A294A71F29F",X"0101014001010101",X"0000000000000000",'0');
des_test(X"EE371483714C02EA",X"0101012001010101",X"0000000000000000",'0');
des_test(X"A81FBD448F9E522F",X"0101011001010101",X"0000000000000000",'0');
des_test(X"4F644C92E192DFED",X"0101010801010101",X"0000000000000000",'0');
des_test(X"1AFA9A66A6DF92AE",X"0101010401010101",X"0000000000000000",'0');
des_test(X"B3C1CC715CB879D8",X"0101010201010101",X"0000000000000000",'0');
des_test(X"19D032E64AB0BD8B",X"0101010180010101",X"0000000000000000",'0');
des_test(X"3CFAA7A7DC8720DC",X"0101010140010101",X"0000000000000000",'0');
des_test(X"B7265F7F447AC6F3",X"0101010120010101",X"0000000000000000",'0');
des_test(X"9DB73B3C0D163F54",X"0101010110010101",X"0000000000000000",'0');
des_test(X"8181B65BABF4A975",X"0101010108010101",X"0000000000000000",'0');
des_test(X"93C9B64042EAA240",X"0101010104010101",X"0000000000000000",'0');
des_test(X"5570530829705592",X"0101010102010101",X"0000000000000000",'0');
des_test(X"8638809E878787A0",X"0101010101800101",X"0000000000000000",'0');
des_test(X"41B9A79AF79AC208",X"0101010101400101",X"0000000000000000",'0');
des_test(X"7A9BE42F2009A892",X"0101010101200101",X"0000000000000000",'0');
des_test(X"29038D56BA6D2745",X"0101010101100101",X"0000000000000000",'0');
des_test(X"5495C6ABF1E5DF51",X"0101010101080101",X"0000000000000000",'0');
des_test(X"AE13DBD561488933",X"0101010101040101",X"0000000000000000",'0');
des_test(X"024D1FFA8904E389",X"0101010101020101",X"0000000000000000",'0');
des_test(X"D1399712F99BF02E",X"0101010101018001",X"0000000000000000",'0');
des_test(X"14C1D7C1CFFEC79E",X"0101010101014001",X"0000000000000000",'0');
des_test(X"1DE5279DAE3BED6F",X"0101010101012001",X"0000000000000000",'0');
des_test(X"E941A33F85501303",X"0101010101011001",X"0000000000000000",'0');
des_test(X"DA99DBBC9A03F379",X"0101010101010801",X"0000000000000000",'0');
des_test(X"B7FC92F91D8E92E9",X"0101010101010401",X"0000000000000000",'0');
des_test(X"AE8E5CAA3CA04E85",X"0101010101010201",X"0000000000000000",'0');
des_test(X"9CC62DF43B6EED74",X"0101010101010180",X"0000000000000000",'0');
des_test(X"D863DBB5C59A91A0",X"0101010101010140",X"0000000000000000",'0');
des_test(X"A1AB2190545B91D7",X"0101010101010120",X"0000000000000000",'0');
des_test(X"0875041E64C570F7",X"0101010101010110",X"0000000000000000",'0');
des_test(X"5A594528BEBEF1CC",X"0101010101010108",X"0000000000000000",'0');
des_test(X"FCDB3291DE21F0C0",X"0101010101010104",X"0000000000000000",'0');
des_test(X"869EFD7F9F265A09",X"0101010101010102",X"0000000000000000",'0');
des_test(X"88D55E54F54C97B4",X"1046913489980131",X"0000000000000000",'0');
des_test(X"0C0CC00C83EA48FD",X"1007103489988020",X"0000000000000000",'0');
des_test(X"83BC8EF3A6570183",X"10071034C8980120",X"0000000000000000",'0');
des_test(X"DF725DCAD94EA2E9",X"1046103489988020",X"0000000000000000",'0');
des_test(X"E652B53B550BE8B0",X"1086911519190101",X"0000000000000000",'0');
des_test(X"AF527120C485CBB0",X"1086911519580101",X"0000000000000000",'0');
des_test(X"0F04CE393DB926D5",X"5107B01519580101",X"0000000000000000",'0');
des_test(X"C9F00FFC74079067",X"1007B01519190101",X"0000000000000000",'0');
des_test(X"7CFD82A593252B4E",X"3107915498080101",X"0000000000000000",'0');
des_test(X"CB49A2F9E91363E3",X"3107919498080101",X"0000000000000000",'0');
des_test(X"00B588BE70D23F56",X"10079115B9080140",X"0000000000000000",'0');
des_test(X"406A9A6AB43399AE",X"3107911598090140",X"0000000000000000",'0');
des_test(X"6CB773611DCA9ADA",X"1007D01589980101",X"0000000000000000",'0');
des_test(X"67FD21C17DBB5D70",X"9107911589980101",X"0000000000000000",'0');
des_test(X"9592CB4110430787",X"9107D01589190101",X"0000000000000000",'0');
des_test(X"A6B7FF68A318DDD3",X"1007D01598980120",X"0000000000000000",'0');
des_test(X"4D102196C914CA16",X"1007940498190101",X"0000000000000000",'0');
des_test(X"2DFA9F4573594965",X"0107910491190401",X"0000000000000000",'0');
des_test(X"B46604816C0E0774",X"0107910491190101",X"0000000000000000",'0');
des_test(X"6E7E6221A4F34E87",X"0107940491190401",X"0000000000000000",'0');
des_test(X"AA85E74643233199",X"19079210981A0101",X"0000000000000000",'0');
des_test(X"2E5A19DB4D1962D6",X"1007911998190801",X"0000000000000000",'0');
des_test(X"23A866A809D30894",X"10079119981A0801",X"0000000000000000",'0');
des_test(X"D812D961F017D320",X"1007921098190101",X"0000000000000000",'0');
des_test(X"055605816E58608F",X"100791159819010B",X"0000000000000000",'0');
des_test(X"ABD88E8B1B7716F1",X"1004801598190101",X"0000000000000000",'0');
des_test(X"537AC95BE69DA1E1",X"1004801598190102",X"0000000000000000",'0');
des_test(X"AED0F6AE3C25CDD8",X"1004801598190108",X"0000000000000000",'0');
des_test(X"B3E35A5EE53E7B8D",X"1002911598100104",X"0000000000000000",'0');
des_test(X"61C79C71921A2EF8",X"1002911598190104",X"0000000000000000",'0');
des_test(X"E2F5728F0995013C",X"1002911598100201",X"0000000000000000",'0');
des_test(X"1AEAC39A61F0A464",X"1002911698100101",X"0000000000000000",'0');
des_test(X"95F8A5E5DD31D900",X"0101010101010101",X"8000000000000000",'1');
des_test(X"DD7F121CA5015619",X"0101010101010101",X"4000000000000000",'1');
des_test(X"2E8653104F3834EA",X"0101010101010101",X"2000000000000000",'1');
des_test(X"4BD388FF6CD81D4F",X"0101010101010101",X"1000000000000000",'1');
des_test(X"20B9E767B2FB1456",X"0101010101010101",X"0800000000000000",'1');
des_test(X"55579380D77138EF",X"0101010101010101",X"0400000000000000",'1');
des_test(X"6CC5DEFAAF04512F",X"0101010101010101",X"0200000000000000",'1');
des_test(X"0D9F279BA5D87260",X"0101010101010101",X"0100000000000000",'1');
des_test(X"D9031B0271BD5A0A",X"0101010101010101",X"0080000000000000",'1');
des_test(X"424250B37C3DD951",X"0101010101010101",X"0040000000000000",'1');
des_test(X"B8061B7ECD9A21E5",X"0101010101010101",X"0020000000000000",'1');
des_test(X"F15D0F286B65BD28",X"0101010101010101",X"0010000000000000",'1');
des_test(X"ADD0CC8D6E5DEBA1",X"0101010101010101",X"0008000000000000",'1');
des_test(X"E6D5F82752AD63D1",X"0101010101010101",X"0004000000000000",'1');
des_test(X"ECBFE3BD3F591A5E",X"0101010101010101",X"0002000000000000",'1');
des_test(X"F356834379D165CD",X"0101010101010101",X"0001000000000000",'1');
des_test(X"2B9F982F20037FA9",X"0101010101010101",X"0000800000000000",'1');
des_test(X"889DE068A16F0BE6",X"0101010101010101",X"0000400000000000",'1');
des_test(X"E19E275D846A1298",X"0101010101010101",X"0000200000000000",'1');
des_test(X"329A8ED523D71AEC",X"0101010101010101",X"0000100000000000",'1');
des_test(X"E7FCE22557D23C97",X"0101010101010101",X"0000080000000000",'1');
des_test(X"12A9F5817FF2D65D",X"0101010101010101",X"0000040000000000",'1');
des_test(X"A484C3AD38DC9C19",X"0101010101010101",X"0000020000000000",'1');
des_test(X"FBE00A8A1EF8AD72",X"0101010101010101",X"0000010000000000",'1');
des_test(X"750D079407521363",X"0101010101010101",X"0000008000000000",'1');
des_test(X"64FEED9C724C2FAF",X"0101010101010101",X"0000004000000000",'1');
des_test(X"F02B263B328E2B60",X"0101010101010101",X"0000002000000000",'1');
des_test(X"9D64555A9A10B852",X"0101010101010101",X"0000001000000000",'1');
des_test(X"D106FF0BED5255D7",X"0101010101010101",X"0000000800000000",'1');
des_test(X"E1652C6B138C64A5",X"0101010101010101",X"0000000400000000",'1');
des_test(X"E428581186EC8F46",X"0101010101010101",X"0000000200000000",'1');
des_test(X"AEB5F5EDE22D1A36",X"0101010101010101",X"0000000100000000",'1');
des_test(X"E943D7568AEC0C5C",X"0101010101010101",X"0000000080000000",'1');
des_test(X"DF98C8276F54B04B",X"0101010101010101",X"0000000040000000",'1');
des_test(X"B160E4680F6C696F",X"0101010101010101",X"0000000020000000",'1');
des_test(X"FA0752B07D9C4AB8",X"0101010101010101",X"0000000010000000",'1');
des_test(X"CA3A2B036DBC8502",X"0101010101010101",X"0000000008000000",'1');
des_test(X"5E0905517BB59BCF",X"0101010101010101",X"0000000004000000",'1');
des_test(X"814EEB3B91D90726",X"0101010101010101",X"0000000002000000",'1');
des_test(X"4D49DB1532919C9F",X"0101010101010101",X"0000000001000000",'1');
des_test(X"25EB5FC3F8CF0621",X"0101010101010101",X"0000000000800000",'1');
des_test(X"AB6A20C0620D1C6F",X"0101010101010101",X"0000000000400000",'1');
des_test(X"79E90DBC98F92CCA",X"0101010101010101",X"0000000000200000",'1');
des_test(X"866ECEDD8072BB0E",X"0101010101010101",X"0000000000100000",'1');
des_test(X"8B54536F2F3E64A8",X"0101010101010101",X"0000000000080000",'1');
des_test(X"EA51D3975595B86B",X"0101010101010101",X"0000000000040000",'1');
des_test(X"CAFFC6AC4542DE31",X"0101010101010101",X"0000000000020000",'1');
des_test(X"8DD45A2DDF90796C",X"0101010101010101",X"0000000000010000",'1');
des_test(X"1029D55E880EC2D0",X"0101010101010101",X"0000000000008000",'1');
des_test(X"5D86CB23639DBEA9",X"0101010101010101",X"0000000000004000",'1');
des_test(X"1D1CA853AE7C0C5F",X"0101010101010101",X"0000000000002000",'1');
des_test(X"CE332329248F3228",X"0101010101010101",X"0000000000001000",'1');
des_test(X"8405D1ABE24FB942",X"0101010101010101",X"0000000000000800",'1');
des_test(X"E643D78090CA4207",X"0101010101010101",X"0000000000000400",'1');
des_test(X"48221B9937748A23",X"0101010101010101",X"0000000000000200",'1');
des_test(X"DD7C0BBD61FAFD54",X"0101010101010101",X"0000000000000100",'1');
des_test(X"2FBC291A570DB5C4",X"0101010101010101",X"0000000000000080",'1');
des_test(X"E07C30D7E4E26E12",X"0101010101010101",X"0000000000000040",'1');
des_test(X"0953E2258E8E90A1",X"0101010101010101",X"0000000000000020",'1');
des_test(X"5B711BC4CEEBF2EE",X"0101010101010101",X"0000000000000010",'1');
des_test(X"CC083F1E6D9E85F6",X"0101010101010101",X"0000000000000008",'1');
des_test(X"D2FD8867D50D2DFE",X"0101010101010101",X"0000000000000004",'1');
des_test(X"06E7EA22CE92708F",X"0101010101010101",X"0000000000000002",'1');
des_test(X"166B40B44ABA4BD6",X"0101010101010101",X"0000000000000001",'1');
des_test(X"0000000000000000",X"8001010101010101",X"95A8D72813DAA94D",'1');
des_test(X"0000000000000000",X"4001010101010101",X"0EEC1487DD8C26D5",'1');
des_test(X"0000000000000000",X"2001010101010101",X"7AD16FFB79C45926",'1');
des_test(X"0000000000000000",X"1001010101010101",X"D3746294CA6A6CF3",'1');
des_test(X"0000000000000000",X"0801010101010101",X"809F5F873C1FD761",'1');
des_test(X"0000000000000000",X"0401010101010101",X"C02FAFFEC989D1FC",'1');
des_test(X"0000000000000000",X"0201010101010101",X"4615AA1D33E72F10",'1');
des_test(X"0000000000000000",X"0180010101010101",X"2055123350C00858",'1');
des_test(X"0000000000000000",X"0140010101010101",X"DF3B99D6577397C8",'1');
des_test(X"0000000000000000",X"0120010101010101",X"31FE17369B5288C9",'1');
des_test(X"0000000000000000",X"0110010101010101",X"DFDD3CC64DAE1642",'1');
des_test(X"0000000000000000",X"0108010101010101",X"178C83CE2B399D94",'1');
des_test(X"0000000000000000",X"0104010101010101",X"50F636324A9B7F80",'1');
des_test(X"0000000000000000",X"0102010101010101",X"A8468EE3BC18F06D",'1');
des_test(X"0000000000000000",X"0101800101010101",X"A2DC9E92FD3CDE92",'1');
des_test(X"0000000000000000",X"0101400101010101",X"CAC09F797D031287",'1');
des_test(X"0000000000000000",X"0101200101010101",X"90BA680B22AEB525",'1');
des_test(X"0000000000000000",X"0101100101010101",X"CE7A24F350E280B6",'1');
des_test(X"0000000000000000",X"0101080101010101",X"882BFF0AA01A0B87",'1');
des_test(X"0000000000000000",X"0101040101010101",X"25610288924511C2",'1');
des_test(X"0000000000000000",X"0101020101010101",X"C71516C29C75D170",'1');
des_test(X"0000000000000000",X"0101018001010101",X"5199C29A52C9F059",'1');
des_test(X"0000000000000000",X"0101014001010101",X"C22F0A294A71F29F",'1');
des_test(X"0000000000000000",X"0101012001010101",X"EE371483714C02EA",'1');
des_test(X"0000000000000000",X"0101011001010101",X"A81FBD448F9E522F",'1');
des_test(X"0000000000000000",X"0101010801010101",X"4F644C92E192DFED",'1');
des_test(X"0000000000000000",X"0101010401010101",X"1AFA9A66A6DF92AE",'1');
des_test(X"0000000000000000",X"0101010201010101",X"B3C1CC715CB879D8",'1');
des_test(X"0000000000000000",X"0101010180010101",X"19D032E64AB0BD8B",'1');
des_test(X"0000000000000000",X"0101010140010101",X"3CFAA7A7DC8720DC",'1');
des_test(X"0000000000000000",X"0101010120010101",X"B7265F7F447AC6F3",'1');
des_test(X"0000000000000000",X"0101010110010101",X"9DB73B3C0D163F54",'1');
des_test(X"0000000000000000",X"0101010108010101",X"8181B65BABF4A975",'1');
des_test(X"0000000000000000",X"0101010104010101",X"93C9B64042EAA240",'1');
des_test(X"0000000000000000",X"0101010102010101",X"5570530829705592",'1');
des_test(X"0000000000000000",X"0101010101800101",X"8638809E878787A0",'1');
des_test(X"0000000000000000",X"0101010101400101",X"41B9A79AF79AC208",'1');
des_test(X"0000000000000000",X"0101010101200101",X"7A9BE42F2009A892",'1');
des_test(X"0000000000000000",X"0101010101100101",X"29038D56BA6D2745",'1');
des_test(X"0000000000000000",X"0101010101080101",X"5495C6ABF1E5DF51",'1');
des_test(X"0000000000000000",X"0101010101040101",X"AE13DBD561488933",'1');
des_test(X"0000000000000000",X"0101010101020101",X"024D1FFA8904E389",'1');
des_test(X"0000000000000000",X"0101010101018001",X"D1399712F99BF02E",'1');
des_test(X"0000000000000000",X"0101010101014001",X"14C1D7C1CFFEC79E",'1');
des_test(X"0000000000000000",X"0101010101012001",X"1DE5279DAE3BED6F",'1');
des_test(X"0000000000000000",X"0101010101011001",X"E941A33F85501303",'1');
des_test(X"0000000000000000",X"0101010101010801",X"DA99DBBC9A03F379",'1');
des_test(X"0000000000000000",X"0101010101010401",X"B7FC92F91D8E92E9",'1');
des_test(X"0000000000000000",X"0101010101010201",X"AE8E5CAA3CA04E85",'1');
des_test(X"0000000000000000",X"0101010101010180",X"9CC62DF43B6EED74",'1');
des_test(X"0000000000000000",X"0101010101010140",X"D863DBB5C59A91A0",'1');
des_test(X"0000000000000000",X"0101010101010120",X"A1AB2190545B91D7",'1');
des_test(X"0000000000000000",X"0101010101010110",X"0875041E64C570F7",'1');
des_test(X"0000000000000000",X"0101010101010108",X"5A594528BEBEF1CC",'1');
des_test(X"0000000000000000",X"0101010101010104",X"FCDB3291DE21F0C0",'1');
des_test(X"0000000000000000",X"0101010101010102",X"869EFD7F9F265A09",'1');
des_test(X"0000000000000000",X"1046913489980131",X"88D55E54F54C97B4",'1');
des_test(X"0000000000000000",X"1007103489988020",X"0C0CC00C83EA48FD",'1');
des_test(X"0000000000000000",X"10071034C8980120",X"83BC8EF3A6570183",'1');
des_test(X"0000000000000000",X"1046103489988020",X"DF725DCAD94EA2E9",'1');
des_test(X"0000000000000000",X"1086911519190101",X"E652B53B550BE8B0",'1');
des_test(X"0000000000000000",X"1086911519580101",X"AF527120C485CBB0",'1');
des_test(X"0000000000000000",X"5107B01519580101",X"0F04CE393DB926D5",'1');
des_test(X"0000000000000000",X"1007B01519190101",X"C9F00FFC74079067",'1');
des_test(X"0000000000000000",X"3107915498080101",X"7CFD82A593252B4E",'1');
des_test(X"0000000000000000",X"3107919498080101",X"CB49A2F9E91363E3",'1');
des_test(X"0000000000000000",X"10079115B9080140",X"00B588BE70D23F56",'1');
des_test(X"0000000000000000",X"3107911598090140",X"406A9A6AB43399AE",'1');
des_test(X"0000000000000000",X"1007D01589980101",X"6CB773611DCA9ADA",'1');
des_test(X"0000000000000000",X"9107911589980101",X"67FD21C17DBB5D70",'1');
des_test(X"0000000000000000",X"9107D01589190101",X"9592CB4110430787",'1');
des_test(X"0000000000000000",X"1007D01598980120",X"A6B7FF68A318DDD3",'1');
des_test(X"0000000000000000",X"1007940498190101",X"4D102196C914CA16",'1');
des_test(X"0000000000000000",X"0107910491190401",X"2DFA9F4573594965",'1');
des_test(X"0000000000000000",X"0107910491190101",X"B46604816C0E0774",'1');
des_test(X"0000000000000000",X"0107940491190401",X"6E7E6221A4F34E87",'1');
des_test(X"0000000000000000",X"19079210981A0101",X"AA85E74643233199",'1');
des_test(X"0000000000000000",X"1007911998190801",X"2E5A19DB4D1962D6",'1');
des_test(X"0000000000000000",X"10079119981A0801",X"23A866A809D30894",'1');
des_test(X"0000000000000000",X"1007921098190101",X"D812D961F017D320",'1');
des_test(X"0000000000000000",X"100791159819010B",X"055605816E58608F",'1');
des_test(X"0000000000000000",X"1004801598190101",X"ABD88E8B1B7716F1",'1');
des_test(X"0000000000000000",X"1004801598190102",X"537AC95BE69DA1E1",'1');
des_test(X"0000000000000000",X"1004801598190108",X"AED0F6AE3C25CDD8",'1');
des_test(X"0000000000000000",X"1002911598100104",X"B3E35A5EE53E7B8D",'1');
des_test(X"0000000000000000",X"1002911598190104",X"61C79C71921A2EF8",'1');
des_test(X"0000000000000000",X"1002911598100201",X"E2F5728F0995013C",'1');
des_test(X"0000000000000000",X"1002911698100101",X"1AEAC39A61F0A464",'1');
des_test(X"01A1D6D039776742",X"7CA110454A1A6E57",X"690F5B0D9A26939B",'1');
des_test(X"5CD54CA83DEF57DA",X"0131D9619DC1376E",X"7A389D10354BD271",'1');
des_test(X"0248D43806F67172",X"07A1133E4A0B2686",X"868EBB51CAB4599A",'1');
des_test(X"51454B582DDF440A",X"3849674C2602319E",X"7178876E01F19B2A",'1');
des_test(X"42FD443059577FA2",X"04B915BA43FEB5B6",X"AF37FB421F8C4095",'1');
des_test(X"059B5E0851CF143A",X"0113B970FD34F2CE",X"86A560F10EC6D85B",'1');
des_test(X"0756D8E0774761D2",X"0170F175468FB5E6",X"0CD3DA020021DC09",'1');
des_test(X"762514B829BF486A",X"43297FAD38E373FE",X"EA676B2CB7DB2B7A",'1');
des_test(X"3BDD119049372802",X"07A7137045DA2A16",X"DFD64A815CAF1A0F",'1');
des_test(X"26955F6835AF609A",X"04689104C2FD3B2F",X"5C513C9C4886C088",'1');
des_test(X"164D5E404F275232",X"37D06BB516CB7546",X"0A2AEEAE3FF4AB77",'1');
des_test(X"6B056E18759F5CCA",X"1F08260D1AC2465E",X"EF1BF03E5DFA575A",'1');
des_test(X"004BD6EF09176062",X"584023641ABA6176",X"88BF0DB6D70DEE56",'1');
des_test(X"480D39006EE762F2",X"025816164629B007",X"A1F9915541020B56",'1');
des_test(X"437540C8698F3CFA",X"49793EBC79B3258F",X"6FBF1CAFCFFD0556",'1');
des_test(X"072D43A077075292",X"4FB05E1515AB73A7",X"2F22E49BAB7CA1AC",'1');
des_test(X"02FE55778117F12A",X"49E95D6D4CA229BF",X"5A6B612CC26CCE4A",'1');
des_test(X"1D9D5C5018F728C2",X"018310DC409B26D6",X"5F4C038ED12B2E41",'1');
des_test(X"305532286D6F295A",X"1C587F1C13924FEF",X"63FAC0D034D9F793",'1');
des_test(X"8000000000000000",X"0101010101010101",X"95F8A5E5DD31D900",'0');
des_test(X"4000000000000000",X"0101010101010101",X"DD7F121CA5015619",'0');
des_test(X"2000000000000000",X"0101010101010101",X"2E8653104F3834EA",'0');
des_test(X"1000000000000000",X"0101010101010101",X"4BD388FF6CD81D4F",'0');
des_test(X"0800000000000000",X"0101010101010101",X"20B9E767B2FB1456",'0');
des_test(X"0400000000000000",X"0101010101010101",X"55579380D77138EF",'0');
des_test(X"0200000000000000",X"0101010101010101",X"6CC5DEFAAF04512F",'0');
des_test(X"0100000000000000",X"0101010101010101",X"0D9F279BA5D87260",'0');
des_test(X"0080000000000000",X"0101010101010101",X"D9031B0271BD5A0A",'0');
des_test(X"0040000000000000",X"0101010101010101",X"424250B37C3DD951",'0');
des_test(X"0020000000000000",X"0101010101010101",X"B8061B7ECD9A21E5",'0');
des_test(X"0010000000000000",X"0101010101010101",X"F15D0F286B65BD28",'0');
des_test(X"0008000000000000",X"0101010101010101",X"ADD0CC8D6E5DEBA1",'0');
des_test(X"0004000000000000",X"0101010101010101",X"E6D5F82752AD63D1",'0');
des_test(X"0002000000000000",X"0101010101010101",X"ECBFE3BD3F591A5E",'0');
des_test(X"0001000000000000",X"0101010101010101",X"F356834379D165CD",'0');
des_test(X"0000800000000000",X"0101010101010101",X"2B9F982F20037FA9",'0');
des_test(X"0000400000000000",X"0101010101010101",X"889DE068A16F0BE6",'0');
des_test(X"0000200000000000",X"0101010101010101",X"E19E275D846A1298",'0');
des_test(X"0000100000000000",X"0101010101010101",X"329A8ED523D71AEC",'0');
des_test(X"0000080000000000",X"0101010101010101",X"E7FCE22557D23C97",'0');
des_test(X"0000040000000000",X"0101010101010101",X"12A9F5817FF2D65D",'0');
des_test(X"0000020000000000",X"0101010101010101",X"A484C3AD38DC9C19",'0');
des_test(X"0000010000000000",X"0101010101010101",X"FBE00A8A1EF8AD72",'0');
des_test(X"0000008000000000",X"0101010101010101",X"750D079407521363",'0');
des_test(X"0000004000000000",X"0101010101010101",X"64FEED9C724C2FAF",'0');
des_test(X"0000002000000000",X"0101010101010101",X"F02B263B328E2B60",'0');
des_test(X"0000001000000000",X"0101010101010101",X"9D64555A9A10B852",'0');
des_test(X"0000000800000000",X"0101010101010101",X"D106FF0BED5255D7",'0');
des_test(X"0000000400000000",X"0101010101010101",X"E1652C6B138C64A5",'0');
des_test(X"0000000200000000",X"0101010101010101",X"E428581186EC8F46",'0');
des_test(X"0000000100000000",X"0101010101010101",X"AEB5F5EDE22D1A36",'0');
des_test(X"0000000080000000",X"0101010101010101",X"E943D7568AEC0C5C",'0');
des_test(X"0000000040000000",X"0101010101010101",X"DF98C8276F54B04B",'0');
des_test(X"0000000020000000",X"0101010101010101",X"B160E4680F6C696F",'0');
des_test(X"0000000010000000",X"0101010101010101",X"FA0752B07D9C4AB8",'0');
des_test(X"0000000008000000",X"0101010101010101",X"CA3A2B036DBC8502",'0');
des_test(X"0000000004000000",X"0101010101010101",X"5E0905517BB59BCF",'0');
des_test(X"0000000002000000",X"0101010101010101",X"814EEB3B91D90726",'0');
des_test(X"0000000001000000",X"0101010101010101",X"4D49DB1532919C9F",'0');
des_test(X"0000000000800000",X"0101010101010101",X"25EB5FC3F8CF0621",'0');
des_test(X"0000000000400000",X"0101010101010101",X"AB6A20C0620D1C6F",'0');
des_test(X"0000000000200000",X"0101010101010101",X"79E90DBC98F92CCA",'0');
des_test(X"0000000000100000",X"0101010101010101",X"866ECEDD8072BB0E",'0');
des_test(X"0000000000080000",X"0101010101010101",X"8B54536F2F3E64A8",'0');
des_test(X"0000000000040000",X"0101010101010101",X"EA51D3975595B86B",'0');
des_test(X"0000000000020000",X"0101010101010101",X"CAFFC6AC4542DE31",'0');
des_test(X"0000000000010000",X"0101010101010101",X"8DD45A2DDF90796C",'0');
des_test(X"0000000000008000",X"0101010101010101",X"1029D55E880EC2D0",'0');
des_test(X"0000000000004000",X"0101010101010101",X"5D86CB23639DBEA9",'0');
des_test(X"0000000000002000",X"0101010101010101",X"1D1CA853AE7C0C5F",'0');
des_test(X"0000000000001000",X"0101010101010101",X"CE332329248F3228",'0');
des_test(X"0000000000000800",X"0101010101010101",X"8405D1ABE24FB942",'0');
des_test(X"0000000000000400",X"0101010101010101",X"E643D78090CA4207",'0');
des_test(X"0000000000000200",X"0101010101010101",X"48221B9937748A23",'0');
des_test(X"0000000000000100",X"0101010101010101",X"DD7C0BBD61FAFD54",'0');
des_test(X"0000000000000080",X"0101010101010101",X"2FBC291A570DB5C4",'0');
des_test(X"0000000000000040",X"0101010101010101",X"E07C30D7E4E26E12",'0');
des_test(X"0000000000000020",X"0101010101010101",X"0953E2258E8E90A1",'0');
des_test(X"0000000000000010",X"0101010101010101",X"5B711BC4CEEBF2EE",'0');
des_test(X"0000000000000008",X"0101010101010101",X"CC083F1E6D9E85F6",'0');
des_test(X"0000000000000004",X"0101010101010101",X"D2FD8867D50D2DFE",'0');
des_test(X"0000000000000002",X"0101010101010101",X"06E7EA22CE92708F",'0');
des_test(X"0000000000000001",X"0101010101010101",X"166B40B44ABA4BD6",'0');
des_test(X"690F5B0D9A26939B",X"7CA110454A1A6E57",X"01A1D6D039776742",'0');
des_test(X"7A389D10354BD271",X"0131D9619DC1376E",X"5CD54CA83DEF57DA",'0');
des_test(X"868EBB51CAB4599A",X"07A1133E4A0B2686",X"0248D43806F67172",'0');
des_test(X"7178876E01F19B2A",X"3849674C2602319E",X"51454B582DDF440A",'0');
des_test(X"AF37FB421F8C4095",X"04B915BA43FEB5B6",X"42FD443059577FA2",'0');
des_test(X"86A560F10EC6D85B",X"0113B970FD34F2CE",X"059B5E0851CF143A",'0');
des_test(X"0CD3DA020021DC09",X"0170F175468FB5E6",X"0756D8E0774761D2",'0');
des_test(X"EA676B2CB7DB2B7A",X"43297FAD38E373FE",X"762514B829BF486A",'0');
des_test(X"DFD64A815CAF1A0F",X"07A7137045DA2A16",X"3BDD119049372802",'0');
des_test(X"5C513C9C4886C088",X"04689104C2FD3B2F",X"26955F6835AF609A",'0');
des_test(X"0A2AEEAE3FF4AB77",X"37D06BB516CB7546",X"164D5E404F275232",'0');
des_test(X"EF1BF03E5DFA575A",X"1F08260D1AC2465E",X"6B056E18759F5CCA",'0');
des_test(X"88BF0DB6D70DEE56",X"584023641ABA6176",X"004BD6EF09176062",'0');
des_test(X"A1F9915541020B56",X"025816164629B007",X"480D39006EE762F2",'0');
des_test(X"6FBF1CAFCFFD0556",X"49793EBC79B3258F",X"437540C8698F3CFA",'0');
des_test(X"2F22E49BAB7CA1AC",X"4FB05E1515AB73A7",X"072D43A077075292",'0');
des_test(X"5A6B612CC26CCE4A",X"49E95D6D4CA229BF",X"02FE55778117F12A",'0');
des_test(X"5F4C038ED12B2E41",X"018310DC409B26D6",X"1D9D5C5018F728C2",'0');
des_test(X"63FAC0D034D9F793",X"1C587F1C13924FEF",X"305532286D6F295A",'0');
des_test(X"666F7220616C6C20",X"0123456789ABCDEF",X"893d51EC4B563B53",'1');
des_test(X"893D51EC4B563B53",X"23456789ABCDEF01",X"5FED3EB05419F67C",'0');
des_test(X"5FED3EB05419F67C",X"456789ABCDEF0123",X"FF55C5F80FAAAC45",'1');
des_test(X"699EF7DA2DC96A23",X"0123456789ABCDEF",X"4F0269117C22DCA6",'1');
des_test(X"652374947EB36B10",X"23456789ABCDEF01",X"CF5024BE929D20F7",'0');
des_test(X"0D0EAE1DC6D08194",X"456789ABCDEF0123",X"03649EFA6872A717",'1');
des_test(X"4E6F772069732074",X"0123456789ABCDEF",X"3FA40E8A984D4815",'1');
des_test(X"3FA40E8A984D4815",X"23456789ABCDEF01",X"0663D1B37C48090C",'0');
des_test(X"0663D1B37C48090C",X"456789ABCDEF0123",X"314F8327FA7A09A8",'1');
des_test(X"68652074696D6520",X"0123456789ABCDEF",X"6A271787AB8883F9",'1');
des_test(X"6A271787AB8883F9",X"23456789ABCDEF01",X"95CAE06A9FF4D6D2",'0');
des_test(X"95CAE06A9FF4D6D2",X"456789ABCDEF0123",X"4362760CC13BA7DA",'1');
des_test(X"666F7220616C6C20",X"0123456789ABCDEF",X"893D51EC4B563B53",'1');
des_test(X"893D51EC4B563B53",X"23456789ABCDEF01",X"5FED3EB05419F67C",'0');
des_test(X"5FED3EB05419F67C",X"456789ABCDEF0123",X"FF55C5F80FAAAC45",'1');
des_test(X"314F8327FA7A09A8",X"456789ABCDEF0123",X"0663D1B37C48090C",'0');
des_test(X"3FA40E8A984D4815",X"0123456789ABCDEF",X"4E6F772069732074",'0');
des_test(X"4362760CC13BA7DA",X"456789ABCDEF0123",X"95CAE06A9FF4D6D2",'0');
des_test(X"95CAE06A9FF4D6D2",X"23456789ABCDEF01",X"6A271787AB8883F9",'1');
des_test(X"6A271787AB8883F9",X"0123456789ABCDEF",X"68652074696D6520",'0');
des_test(X"FF55C5F80FAAAC45",X"456789ABCDEF0123",X"5FED3EB05419F67C",'0');
des_test(X"5FED3EB05419F67C",X"23456789ABCDEF01",X"893D51EC4B563B53",'1');
des_test(X"893D51EC4B563B53",X"0123456789ABCDEF",X"666F7220616C6C20",'0');
des_test(X"5C5B2158F9D8ED9B",X"0123456789ABCDEF",X"E5C7CDDE872BF27C",'1');
des_test(X"E5C7CDDE872BF27C",X"23456789ABCDEF01",X"EDFA50E493DBFECC",'0');
des_test(X"EDFA50E493DBFECC",X"456789ABCDEF0123",X"F3C0FF026C023089",'1');
des_test(X"9BA5DF76056F55A9",X"0123456789ABCDEF",X"5A80BE0F562EE625",'1');
des_test(X"5A80BE0F562EE625",X"23456789ABCDEF01",X"B92F8D3BB74CE43D",'0');
des_test(X"B92F8D3BB74CE43D",X"456789ABCDEF0123",X"656FBB169DEF7EDB",'1');
des_test(X"0300C936FC8312FB",X"0123456789ABCDEF",X"F1F58BA6135C2B1E",'1');
des_test(X"F1F58BA6135C2B1E",X"23456789ABCDEF01",X"3374E4F8B29A3026",'0');
des_test(X"3374E4F8B29A3026",X"456789ABCDEF0123",X"30BA36075D6F0176",'1');
des_test(X"F3C0FF026C023089",X"456789ABCDEF0123",X"EDFA50E493DBFECC",'0');
des_test(X"EDFA50E493DBFECC",X"23456789ABCDEF01",X"E5C7CDDE872BF27C",'1');
des_test(X"E5C7CDDE872BF27C",X"0123456789ABCDEF",X"5C5B2158F9D8ED9B",'0');
des_test(X"656FBB169DEF7EDB",X"456789ABCDEF0123",X"B92F8D3BB74CE43D",'0');
des_test(X"B92F8D3BB74CE43D",X"23456789ABCDEF01",X"5A80BE0F562EE625",'1');
des_test(X"5A80BE0F562EE625",X"0123456789ABCDEF",X"9BA5DF76056F55A9",'0');
des_test(X"30BA36075D6F0176",X"456789ABCDEF0123",X"3374E4F8B29A3026",'0');
des_test(X"3374E4F8B29A3026",X"23456789ABCDEF01",X"F1F58BA6135C2B1E",'1');
des_test(X"F1F58BA6135C2B1E",X"0123456789ABCDEF",X"0300C936FC8312FB",'0');
des_test(X"4E6F772069767521",X"0123456789ABCDEF",X"4A03D3FEA5A1E37A",'1');
des_test(X"3D3075213C37CF8A",X"0123456789ABCDEF",X"43AF7B6D64CEA313",'1');
des_test(X"4A03D3FEA5A1E37A",X"23456789ABCDEF01",X"FE01E6214328F6D3",'0');
des_test(X"CCC5D88ACBC393DF",X"0123456789ABCDEF",X"DCE191055E0D4CE4",'1');
des_test(X"43AF7B6D64CEA313",X"23456789ABCDEF01",X"0C368689B611CDA0",'0');
des_test(X"FE01E6214328F6D3",X"456789ABCDEF0123",X"0EF198BE0DA40F4D",'1');
des_test(X"699EF7DA2DC96A23",X"0123456789ABCDEF",X"4F0269117C22DCA6",'1');
des_test(X"DCE191055E0D4CE4",X"23456789ABCDEF01",X"475A68D3A3D89D20",'0');
des_test(X"0C368689B611CDA0",X"456789ABCDEF0123",X"A17A95D6EA9AE293",'1');
des_test(X"810EFAF689F58FF6",X"0123456789ABCDEF",X"D75635432DB7BEE6",'1');
des_test(X"4F0269117C22DCA6",X"23456789ABCDEF01",X"E7EF69A22ADAFA7B",'0');
des_test(X"475A68D3A3D89D20",X"456789ABCDEF0123",X"2D4A0E0C423E6695",'1');
des_test(X"0D3E612C365603B5",X"0123456789ABCDEF",X"837FD7A508C21F88",'1');
des_test(X"D75635432DB7BEE6",X"23456789ABCDEF01",X"6B5F8A3E5BD561E4",'0');
des_test(X"E7EF69A22ADAFA7B",X"456789ABCDEF0123",X"1933FB0C744581C1",'1');
des_test(X"837FD7A508C21F88",X"23456789ABCDEF01",X"6E4BC32F763F12CD",'0');
des_test(X"6B5F8A3E5BD561E4",X"456789ABCDEF0123",X"CBA84CBB201F76E0",'1');
des_test(X"6E4BC32F763F12CD",X"456789ABCDEF0123",X"4F55F346236AF664",'1');
des_test(X"0EF198BE0DA40F4D",X"456789ABCDEF0123",X"FE01E6214328F6D3",'0');
des_test(X"A17A95D6EA9AE293",X"456789ABCDEF0123",X"0C368689B611CDA0",'0');
des_test(X"FE01E6214328F6D3",X"23456789ABCDEF01",X"4A03D3FEA5A1E37A",'1');
des_test(X"2D4A0E0C423E6695",X"456789ABCDEF0123",X"475A68D3A3D89D20",'0');
des_test(X"0C368689B611CDA0",X"23456789ABCDEF01",X"43AF7B6D64CEA313",'1');
des_test(X"4A03D3FEA5A1E37A",X"0123456789ABCDEF",X"4E6F772069767521",'0');
des_test(X"1933FB0C744581C1",X"456789ABCDEF0123",X"E7EF69A22ADAFA7B",'0');
des_test(X"475A68D3A3D89D20",X"23456789ABCDEF01",X"DCE191055E0D4CE4",'1');
des_test(X"43AF7B6D64CEA313",X"0123456789ABCDEF",X"3D3075213C37CF8A",'0');
des_test(X"CBA84CBB201F76E0",X"456789ABCDEF0123",X"6B5F8A3E5BD561E4",'0');
des_test(X"E7EF69A22ADAFA7B",X"23456789ABCDEF01",X"4F0269117C22DCA6",'1');
des_test(X"DCE191055E0D4CE4",X"0123456789ABCDEF",X"CCC5D88ACBC393DF",'0');
des_test(X"4F55F346236AF664",X"456789ABCDEF0123",X"6E4BC32F763F12CD",'0');
des_test(X"6B5F8A3E5BD561E4",X"23456789ABCDEF01",X"D75635432DB7BEE6",'1');
des_test(X"4F0269117C22DCA6",X"0123456789ABCDEF",X"699EF7DA2DC96A23",'0');
des_test(X"6E4BC32F763F12CD",X"23456789ABCDEF01",X"837FD7A508C21F88",'1');
des_test(X"D75635432DB7BEE6",X"0123456789ABCDEF",X"810EFAF689F58FF6",'0');
des_test(X"837FD7A508C21F88",X"0123456789ABCDEF",X"0D3E612C365603B5",'0');


    ASSERT erreur='0' REPORT "FINAL REPORT : TEST BENCH FAILED !!"
    SEVERITY error;

    ASSERT erreur='1' REPORT "FINAL REPORT : TEST BENCH SUCCESSFULL !"
    SEVERITY note;
    wait;

end process;

end simple;


