--

-- ****************************************************************************
--                                                                           --
--     Copyright @ 1999                                                      --
--                                                                           --
--     Tetraedre SARL,  chenes 19,   2072 Saint-Blaise,  Switzerland         --
--                                                                           --
-- ****************************************************************************
--                                                                           --
-- Filename  : tctf64_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.     --
--                                                                           --
-- ****************************************************************************







---------- Entity bench_tctf64 ---------- 
library ieee;
use ieee.std_logic_1164.all;
entity tctf64_bench is
end;


---------- Architecture bench_tctf64 ---------- 
library ieee, work;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

architecture simple of tctf64_bench is
    signal iv      : std_logic_vector(63 downto 0);
    signal key1    : std_logic_vector(63 downto 0);
    signal key2    : std_logic_vector(63 downto 0);
    signal key3    : std_logic_vector(63 downto 0);
    signal first   : std_logic;
    signal do_next : std_logic;
    signal crypt   : std_logic;
    signal clk     : std_logic;
    signal d       : std_logic_vector(63 downto 0);
    signal q       : std_logic_vector(63 downto 0);
    signal done    : std_logic;
    signal erreur  : std_logic;
    signal nreset  : std_logic;

    component tctf64 
    port (
        iv      : in  std_logic_vector(63 downto 0);
        key1    : in  std_logic_vector(63 downto 0);
        key2    : in  std_logic_vector(63 downto 0);
        key3    : in  std_logic_vector(63 downto 0);
        first   : in  std_logic;
        do_next : in  std_logic;
        crypt   : in  std_logic;
        clk     : in  std_logic;
        nreset  : in  std_logic;
        d       : in  std_logic_vector(63 downto 0);
        q       : out std_logic_vector(63 downto 0);
        done    : out std_logic
    );
    end component;


begin
    i_tctf64 : tctf64
    port map (
        iv      => iv,
        key1    => key1,
        key2    => key2,
        key3    => key3,
        first   => first,
        do_next => do_next,
        crypt   => crypt,
        clk     => clk,
        nreset  => nreset,
        d       => d,
        q       => q,
        done    => done
    );


    process
    begin
        nreset <= '0';
        wait for 100 ns;
        nreset <= '1';
        wait;
    end process;


    P45 : process
    begin
        clk <= '0';
        wait for 500 ns;
        clk <= '1';
        wait for 500 ns;
    end process;


    -- ********************************************************
    -- ****                TEST PROCEDURE                  ****
    -- ********************************************************
    P46 : process
    procedure tctf_test(constant xdatain   : in  bit_vector(63 downto 0);
                        constant xexpect   : in  bit_vector(63 downto 0);
                        constant xfirst    : in  std_logic;
                        constant xcrypt    : in  std_logic          ) is

        variable expect : std_logic_vector(63 downto 0);
    begin
        crypt   <= xcrypt;
        first   <= xfirst;
        d       <= to_stdlogicvector(xdatain);
        do_next <= '1';
        wait for 1000 ns;
        do_next <= '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 tctf_test;
    -- -----------------------------------------------------------------

    -- ********************************************************
    -- ****                TEST VECTORS                    ****
    -- ********************************************************
    begin
        erreur  <= '0';
        do_next <= '0';
        first   <= '0';
        wait for 2000 ns;

            --------------- **************************************
            key1    <= to_stdlogicvector(X"0123456789ABCDEF");
            key2    <= to_stdlogicvector(X"23456789ABCDEF01");
            key3    <= to_stdlogicvector(X"456789ABCDEF0123");
            iv      <= to_stdlogicvector(X"1234567890ABCDEF");
            
            tctf_test(X"4E6F772069732074",X"EE7EC75C1A101301",'1','1');
            wait for 5 us;
            tctf_test(X"68652074696d6520",X"C4AB2F10462E5DD4",'0','1');
            tctf_test(X"666F7220616C6C20",X"17400B445B5F2A72",'0','1');
            
            tctf_test(X"EE7EC75C1A101301",X"4E6F772069732074",'1','0');
            tctf_test(X"C4AB2F10462E5DD4",X"68652074696d6520",'0','0');
            tctf_test(X"17400B445B5F2A72",X"666F7220616C6C20",'0','0');



            --------------- **************************************
            key1    <= to_stdlogicvector(X"B63ADFD042D8A232");
            key2    <= to_stdlogicvector(X"71549DAE7248ECAF");
            key3    <= to_stdlogicvector(X"44A19D427A54CAED");
            iv      <= to_stdlogicvector(X"9F76DC32BF32BD06");
            
            tctf_test(X"45F483C0018945F4",X"2413B8DEB54C9CEB",'1','1');
            tctf_test(X"837DF4087D69C745",X"1635B70075A48FD1",'0','1');
            tctf_test(X"F800000000C745F0",X"10E10A5865A68F45",'0','1');
            tctf_test(X"00000000EB098B4D",X"7A5C9854363C6347",'0','1');
            tctf_test(X"F083C101894DF083",X"EF954A243EC7E208",'0','1');
            tctf_test(X"7DF0087D318B55F8",X"2B853AA7A87DC7AF",'0','1');
            tctf_test(X"D1E28955F88B45F4",X"7A60EEADEC63368F",'0','1');
            tctf_test(X"8B4DF08D54C10152",X"4F12C0F2661A1DFD",'0','1');
            tctf_test(X"8B450C50E8B7B3FF",X"B0D746849BF92E18",'0','1');
            tctf_test(X"FF83C4080FBEC885",X"061F7D8CE06137BF",'0','1');
            tctf_test(X"C974098B55F883C2",X"BB670F5D195BCAAC",'0','1');
            tctf_test(X"018955F8EBC08A45",X"8CEFEC1245AD6D8E",'0','1');
            tctf_test(X"F88845FC8B4D088A",X"2E00EAD1BB3B6473",'0','1');
            tctf_test(X"55FC88118B450883",X"1625C40E5DC27986",'0','1');
            tctf_test(X"C001894508EB888B",X"BC61B70F880747E4",'0','1');
            tctf_test(X"4D08C601008BE55D",X"32C83909045BD149",'0','1');
            tctf_test(X"C3558BEC8B450803",X"7C138CE2E99108F9",'0','1');
            tctf_test(X"450C0FBE0083E001",X"4C84EF04BF2B6FE5",'0','1');
            tctf_test(X"5DC3558BEC8B4508",X"64975697AA70DC05",'0','1');
            tctf_test(X"03450CC600015DC3",X"428EB3418FFD48B3",'0','1');
            tctf_test(X"558BEC8B45080345",X"3ABDD7BBA7894DE2",'0','1');
            tctf_test(X"0CC600005DC3558B",X"B8169A3872D2783E",'0','1');
            tctf_test(X"EC0FBE451083E001",X"6CD1663E64217F69",'0','1');
            tctf_test(X"8B4D08034D0C8801",X"BCE360116EE4B048",'0','1');
            tctf_test(X"5DC3558BEC5156C7",X"0494503F055BCF8F",'0','1');
            tctf_test(X"45FC00000000837D",X"CF633981540F7BF8",'0','1');
            tctf_test(X"FC407D418B45FC03",X"0D0AB2F55FDF0DFA",'0','1');
            tctf_test(X"450C83F8407F368B",X"2F5FE360CD74723B",'0','1');
            tctf_test(X"4DFC034D1483F940",X"DC23C7664EE36A4C",'0','1');
            tctf_test(X"7F2B8B55FC3B5518",X"B28EE49F838D6FE7",'0','1');
            tctf_test(X"7D238B45FC034514",X"1E0E0689A1771C0A",'0','1');
            tctf_test(X"8B4DFC034D0C8B55",X"DFB1E807DE374DB5",'0','1');

            --------------- **************************************
            key1    <= to_stdlogicvector(X"232A8D240DFDA36B");
            key2    <= to_stdlogicvector(X"FACE8427EAD94517");
            key3    <= to_stdlogicvector(X"4D4EAA1C94D54A27");
            iv      <= to_stdlogicvector(X"92FB7562D3C00396");
            
            tctf_test(X"088B75108A040688",X"C194B193E1D36B52",'1','1');
            tctf_test(X"040A8B4DFC83C101",X"9B76085FD0665D62",'0','1');
            tctf_test(X"894DFCEBB95E8BE5",X"AFE3FB958DC00C2B",'0','1');
            tctf_test(X"5DC3558BEC51C745",X"F54D62F8B96DFECF",'0','1');
            tctf_test(X"FC01000000EB098B",X"EC75FFC1E323B250",'0','1');
            tctf_test(X"45FC83C0018945FC",X"DC34349D121A41F2",'0','1');
            tctf_test(X"8B4DFC3B4D147F21",X"3FB9206545D96A61",'0','1');
            tctf_test(X"8B55FC03551083FA",X"586C6E03964098C0",'0','1');
            tctf_test(X"407D168B45FC0345",X"0EDC15023EAB590B",'0','1');
            tctf_test(X"108B4D08034DFC8B",X"25C2DE8BB2F20EE8",'0','1');
            tctf_test(X"550C8A04028801EB",X"9EE6EA5755A69323",'0','1');
            tctf_test(X"CE8B4D10516A018B",X"9AFCDDB4AB3282A6",'0','1');
            tctf_test(X"550C528B45142B45",X"0DFE8DA1FF2D39CC",'0','1');
            tctf_test(X"1083C001508B4D08",X"0F9FE1C128D135A0",'0','1');
            tctf_test(X"51E8BCB2FFFF83C4",X"6E66488322CE793B",'0','1');
            tctf_test(X"148BE55DC3558BEC",X"0775F2868A8E582E",'0','1');
            tctf_test(X"837D080A7D088B45",X"4E1742CFA4DF1B93",'0','1');
            tctf_test(X"0883C030EB068B45",X"A377CA585A4C299F",'0','1');
            tctf_test(X"0883C0375DC3558B",X"6DAC2347D76BAF84",'0','1');
            tctf_test(X"EC510FBE450883F8",X"85205F08B2B525EF",'0','1');
            tctf_test(X"397F160FBE4D0883",X"7B5D375C28B18A3B",'0','1');
            tctf_test(X"F9307C0D0FBE5508",X"C4BF72CE917C0E94",'0','1');
            tctf_test(X"83EA3083E20F8955",X"C476C7BB24E25832",'0','1');
            tctf_test(X"FC0FBE450883F866",X"855E887E058E2BC3",'0','1');
            tctf_test(X"7F160FBE4D0883F9",X"A7BFFB7E92B62DEB",'0','1');
            tctf_test(X"617C0D0FBE550883",X"90B15C861C8C5C19",'0','1');
            tctf_test(X"EA5783E20F8955FC",X"746513081513A440",'0','1');
            tctf_test(X"0FBE450883F8467F",X"3A7CA7CB740C44FC",'0','1');
            tctf_test(X"160FBE4D0883F941",X"373B0ECDECDCBB15",'0','1');
            tctf_test(X"7C0D0FBE550883EA",X"91AD9050C83D0471",'0','1');
            tctf_test(X"3783E20F8955FC8B",X"738114768C085458",'0','1');
            tctf_test(X"45FC8BE55DC3CCCC",X"FCA03916B9AC053A",'0','1');


            -- //////////////////////////// DECODE //////////////////////////

            key1    <= to_stdlogicvector(X"B63ADFD042D8A232");
            key2    <= to_stdlogicvector(X"71549DAE7248ECAF");
            key3    <= to_stdlogicvector(X"44A19D427A54CAED");
            iv      <= to_stdlogicvector(X"9F76DC32BF32BD06");
            
            tctf_test(X"2413B8DEB54C9CEB",X"45F483C0018945F4",'1','0');
            tctf_test(X"1635B70075A48FD1",X"837DF4087D69C745",'0','0');
            tctf_test(X"10E10A5865A68F45",X"F800000000C745F0",'0','0');
            tctf_test(X"7A5C9854363C6347",X"00000000EB098B4D",'0','0');
            tctf_test(X"EF954A243EC7E208",X"F083C101894DF083",'0','0');
            tctf_test(X"2B853AA7A87DC7AF",X"7DF0087D318B55F8",'0','0');
            tctf_test(X"7A60EEADEC63368F",X"D1E28955F88B45F4",'0','0');
            tctf_test(X"4F12C0F2661A1DFD",X"8B4DF08D54C10152",'0','0');
            tctf_test(X"B0D746849BF92E18",X"8B450C50E8B7B3FF",'0','0');
            tctf_test(X"061F7D8CE06137BF",X"FF83C4080FBEC885",'0','0');
            tctf_test(X"BB670F5D195BCAAC",X"C974098B55F883C2",'0','0');
            tctf_test(X"8CEFEC1245AD6D8E",X"018955F8EBC08A45",'0','0');
            tctf_test(X"2E00EAD1BB3B6473",X"F88845FC8B4D088A",'0','0');
            tctf_test(X"1625C40E5DC27986",X"55FC88118B450883",'0','0');
            tctf_test(X"BC61B70F880747E4",X"C001894508EB888B",'0','0');
            tctf_test(X"32C83909045BD149",X"4D08C601008BE55D",'0','0');
            tctf_test(X"7C138CE2E99108F9",X"C3558BEC8B450803",'0','0');
            tctf_test(X"4C84EF04BF2B6FE5",X"450C0FBE0083E001",'0','0');
            tctf_test(X"64975697AA70DC05",X"5DC3558BEC8B4508",'0','0');
            tctf_test(X"428EB3418FFD48B3",X"03450CC600015DC3",'0','0');
            tctf_test(X"3ABDD7BBA7894DE2",X"558BEC8B45080345",'0','0');
            tctf_test(X"B8169A3872D2783E",X"0CC600005DC3558B",'0','0');
            tctf_test(X"6CD1663E64217F69",X"EC0FBE451083E001",'0','0');
            tctf_test(X"BCE360116EE4B048",X"8B4D08034D0C8801",'0','0');
            tctf_test(X"0494503F055BCF8F",X"5DC3558BEC5156C7",'0','0');
            tctf_test(X"CF633981540F7BF8",X"45FC00000000837D",'0','0');
            tctf_test(X"0D0AB2F55FDF0DFA",X"FC407D418B45FC03",'0','0');
            tctf_test(X"2F5FE360CD74723B",X"450C83F8407F368B",'0','0');
            tctf_test(X"DC23C7664EE36A4C",X"4DFC034D1483F940",'0','0');
            tctf_test(X"B28EE49F838D6FE7",X"7F2B8B55FC3B5518",'0','0');
            tctf_test(X"1E0E0689A1771C0A",X"7D238B45FC034514",'0','0');
            tctf_test(X"DFB1E807DE374DB5",X"8B4DFC034D0C8B55",'0','0');


            --------------- **************************************
            key1    <= to_stdlogicvector(X"232A8D240DFDA36B");
            key2    <= to_stdlogicvector(X"FACE8427EAD94517");
            key3    <= to_stdlogicvector(X"4D4EAA1C94D54A27");
            iv      <= to_stdlogicvector(X"92FB7562D3C00396");
            
            tctf_test(X"C194B193E1D36B52",X"088B75108A040688",'1','0');
            tctf_test(X"9B76085FD0665D62",X"040A8B4DFC83C101",'0','0');
            tctf_test(X"AFE3FB958DC00C2B",X"894DFCEBB95E8BE5",'0','0');
            tctf_test(X"F54D62F8B96DFECF",X"5DC3558BEC51C745",'0','0');
            tctf_test(X"EC75FFC1E323B250",X"FC01000000EB098B",'0','0');
            tctf_test(X"DC34349D121A41F2",X"45FC83C0018945FC",'0','0');
            tctf_test(X"3FB9206545D96A61",X"8B4DFC3B4D147F21",'0','0');
            tctf_test(X"586C6E03964098C0",X"8B55FC03551083FA",'0','0');
            tctf_test(X"0EDC15023EAB590B",X"407D168B45FC0345",'0','0');
            tctf_test(X"25C2DE8BB2F20EE8",X"108B4D08034DFC8B",'0','0');
            tctf_test(X"9EE6EA5755A69323",X"550C8A04028801EB",'0','0');
            tctf_test(X"9AFCDDB4AB3282A6",X"CE8B4D10516A018B",'0','0');
            tctf_test(X"0DFE8DA1FF2D39CC",X"550C528B45142B45",'0','0');
            tctf_test(X"0F9FE1C128D135A0",X"1083C001508B4D08",'0','0');
            tctf_test(X"6E66488322CE793B",X"51E8BCB2FFFF83C4",'0','0');
            tctf_test(X"0775F2868A8E582E",X"148BE55DC3558BEC",'0','0');
            tctf_test(X"4E1742CFA4DF1B93",X"837D080A7D088B45",'0','0');
            tctf_test(X"A377CA585A4C299F",X"0883C030EB068B45",'0','0');
            tctf_test(X"6DAC2347D76BAF84",X"0883C0375DC3558B",'0','0');
            tctf_test(X"85205F08B2B525EF",X"EC510FBE450883F8",'0','0');
            tctf_test(X"7B5D375C28B18A3B",X"397F160FBE4D0883",'0','0');
            tctf_test(X"C4BF72CE917C0E94",X"F9307C0D0FBE5508",'0','0');
            tctf_test(X"C476C7BB24E25832",X"83EA3083E20F8955",'0','0');
            tctf_test(X"855E887E058E2BC3",X"FC0FBE450883F866",'0','0');
            tctf_test(X"A7BFFB7E92B62DEB",X"7F160FBE4D0883F9",'0','0');
            tctf_test(X"90B15C861C8C5C19",X"617C0D0FBE550883",'0','0');
            tctf_test(X"746513081513A440",X"EA5783E20F8955FC",'0','0');
            tctf_test(X"3A7CA7CB740C44FC",X"0FBE450883F8467F",'0','0');
            tctf_test(X"373B0ECDECDCBB15",X"160FBE4D0883F941",'0','0');
            tctf_test(X"91AD9050C83D0471",X"7C0D0FBE550883EA",'0','0');
            tctf_test(X"738114768C085458",X"3783E20F8955FC8B",'0','0');
            tctf_test(X"FCA03916B9AC053A",X"45FC8BE55DC3CCCC",'0','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;

