head 1.4; access; symbols rel_0_2_beta:1.4; locks; strict; comment @# @; 1.4 date 2004.10.10.20.19.49; author arniml; state Exp; branches; next 1.3; 1.3 date 2004.10.10.17.27.44; author arniml; state Exp; branches; next 1.2; 1.2 date 2004.10.09.17.05.59; author arniml; state Exp; branches; next 1.1; 1.1 date 2004.10.07.21.24.06; author arniml; state Exp; branches; next ; desc @@ 1.4 log @gcpad_full and second pad model now tested completely @ text @------------------------------------------------------------------------------- -- -- Testbench for the -- GCpad controller core -- -- $Id: tb.vhd,v 1.3 2004/10/10 17:27:44 arniml Exp $ -- -- Copyright (c) 2004, Arnim Laeuger (arniml@@opencores.org) -- -- All rights reserved -- -- Redistribution and use in source and synthezised forms, with or without -- modification, are permitted provided that the following conditions are met: -- -- Redistributions of source code must retain the above copyright notice, -- this list of conditions and the following disclaimer. -- -- Redistributions in synthesized form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- -- Neither the name of the author nor the names of other contributors may -- be used to endorse or promote products derived from this software without -- specific prior written permission. -- -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE -- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -- POSSIBILITY OF SUCH DAMAGE. -- -- Please report bugs to the author, but before you do so, please -- make sure that this is not a derivative work and that -- you have the latest version of this file. -- -- The latest version of this file can be found at: -- http://www.opencores.org/cvsweb.shtml/gamepads/ -- -- The project homepage is located at: -- http://www.opencores.org/projects.cgi/web/gamepads/overview -- ------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; entity tb is end tb; use work.gcpad_pack.all; use work.gcpad_comp.gcpad_basic; use work.gcpad_comp.gcpad_full; architecture behav of tb is ----------------------------------------------------------------------------- -- Some known commands for the GC controller ----------------------------------------------------------------------------- constant cmd_get_id_c : std_logic_vector(7 downto 0) := "00000000"; constant cmd_poll_c : std_logic_vector(7 downto 0) := "01000000"; component gcpad_mod generic ( clocks_per_1us_g : natural := 2 ); port ( clk_i : in std_logic; pad_data_io : inout std_logic; rx_data_i : in std_logic_vector(63 downto 0) ); end component; constant period_c : time := 100 ns; constant reset_level_c : natural := 0; constant clocks_per_1us_c : natural := 10; signal clk_s : std_logic; signal reset_s : std_logic; -- signals for basic gcpad signal stimuli_1_end_s : boolean; signal pad_data_1_s : std_logic; signal buttons_1_s : std_logic_vector(64 downto 0); signal pad_request_1_s : std_logic; signal pad_avail_1_s : std_logic; signal pad_model_data_1_s : std_logic_vector(63 downto 0); -- signals for full gcpad signal stimuli_2_end_s : boolean; signal pad_data_2_s : std_logic; signal pad_request_2_s : std_logic; signal pad_avail_2_s : std_logic; signal pad_timeout_2_s : std_logic; signal tx_size_2_s : std_logic_vector( 1 downto 0); signal tx_command_2_s : std_logic_vector(23 downto 0); signal rx_size_2_s : std_logic_vector( 3 downto 0); signal rx_data_2_s : std_logic_vector(63 downto 0); signal pad_model_data_2_s : std_logic_vector(63 downto 0); begin basic_b : gcpad_basic generic map ( reset_level_g => reset_level_c, clocks_per_1us_g => clocks_per_1us_c ) port map ( clk_i => clk_s, reset_i => reset_s, pad_request_i => pad_request_1_s, pad_avail_o => pad_avail_1_s, pad_data_io => pad_data_1_s, but_a_o => buttons_1_s(56), but_b_o => buttons_1_s(57), but_x_o => buttons_1_s(58), but_y_o => buttons_1_s(59), but_z_o => buttons_1_s(52), but_start_o => buttons_1_s(60), but_tl_o => buttons_1_s(54), but_tr_o => buttons_1_s(53), but_left_o => buttons_1_s(48), but_right_o => buttons_1_s(49), but_up_o => buttons_1_s(51), but_down_o => buttons_1_s(50), ana_joy_x_o => buttons_1_s(47 downto 40), ana_joy_y_o => buttons_1_s(39 downto 32), ana_c_x_o => buttons_1_s(31 downto 24), ana_c_y_o => buttons_1_s(23 downto 16), ana_l_o => buttons_1_s(15 downto 8), ana_r_o => buttons_1_s( 7 downto 0) ); buttons_1_s(64) <= '0'; buttons_1_s(63 downto 61) <= (others => '0'); buttons_1_s(55) <= '1'; full_b: gcpad_full generic map ( reset_level_g => reset_level_c, clocks_per_1us_g => clocks_per_1us_c ) port map ( clk_i => clk_s, reset_i => reset_s, pad_request_i => pad_request_2_s, pad_avail_o => pad_avail_2_s, pad_timeout_o => pad_timeout_2_s, tx_size_i => tx_size_2_s, tx_command_i => tx_command_2_s, rx_size_i => rx_size_2_s, rx_data_o => rx_data_2_s, pad_data_io => pad_data_2_s ); pad_1 : gcpad_mod generic map ( clocks_per_1us_g => clocks_per_1us_c ) port map ( clk_i => clk_s, pad_data_io => pad_data_1_s, rx_data_i => pad_model_data_1_s ); ----------------------------------------------------------------------------- -- Process stimuli_pad_1 -- -- Executes test stimuli with Pad 1, the gcpad_basic flavour. -- stimuli_pad_1: process --------------------------------------------------------------------------- -- Procedure poll_pad -- -- Requests the status of Pad 1 and checks the received data. -- procedure poll_pad(packet : in std_logic_vector(63 downto 0)) is begin wait until clk_s'event and clk_s = '1'; wait for 1 ns; pad_model_data_1_s <= packet; -- send request; pad_request_1_s <= '1'; wait for 1 * period_c; pad_request_1_s <= '0'; wait for 10 * 40 * period_c; wait until pad_avail_1_s = '1'; wait for 10 * period_c; -- check result for i in 0 to packet'high loop assert packet(i) = buttons_1_s(i) report "Button mismatch on Pad 1!" severity error; end loop; end poll_pad; -- --------------------------------------------------------------------------- --------------------------------------------------------------------------- -- Procedure timeout_gcpad -- -- Generates a timeout in gcpad_basic by disturbing the communication. -- procedure timeout_gcpad is begin wait until clk_s'event and clk_s = '1'; wait for 1 ns; -- send request; pad_request_1_s <= '1'; wait for 1 * period_c; pad_request_1_s <= '0'; wait for 2 * period_c; -- disturb communication pad_data_1_s <= 'X'; wait until pad_avail_1_s = '1'; wait for 10 * period_c; pad_data_1_s <= 'H'; wait for 10 * period_c; end timeout_gcpad; -- --------------------------------------------------------------------------- begin stimuli_1_end_s <= false; pad_data_1_s <= 'H'; pad_request_1_s <= '0'; pad_model_data_1_s <= (others => '0'); wait until reset_s = '1'; wait for period_c * 4; timeout_gcpad; poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000000000"); wait for clocks_per_1us_c * 100 * period_c; poll_pad(packet => "0001111111111111111111111111111111111111111111111111111111111111"); poll_pad(packet => "0001000010000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000100010000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000010010000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000001010000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000110000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000101010101010101010101010101010101010101010101010101010101010"); poll_pad(packet => "0001010111010101010101010101010101010101010101010101010101010101"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000011000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010100000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010010000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010001000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000100000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000010000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000001000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000100000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000010000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000001000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000100000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000010000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000001000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000100000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000010000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000001000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000100000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000010000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000001000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000100000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000010000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000001000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000100000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000010000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000001000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000100000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000010000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000001000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000100000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000010000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000001000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000100000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000010000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000001000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000100000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000010000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000001000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000100000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000010000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000001000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000100000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000010000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000001000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000100000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000010000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000001000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000100000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000010000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000001000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000100000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000010000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000001000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000000100"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000000010"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000000001"); wait for period_c * 2*40; stimuli_1_end_s <= true; wait; end process stimuli_pad_1; -- ----------------------------------------------------------------------------- pad_2 : gcpad_mod generic map ( clocks_per_1us_g => clocks_per_1us_c ) port map ( clk_i => clk_s, pad_data_io => pad_data_2_s, rx_data_i => pad_model_data_2_s ); ----------------------------------------------------------------------------- -- Process stimuli_pad_2 -- -- Executes test stimuli with Pad 2, the gcpad_full flavour. -- stimuli_pad_2: process --------------------------------------------------------------------------- -- Procedure issue_command -- -- Sets the transmitter command for Pad 2 and starts the request. -- procedure issue_command(cmd : in std_logic_vector(23 downto 0); size : in std_logic_vector( 1 downto 0)) is begin wait until clk_s'event and clk_s = '1'; wait for 1 ns; tx_command_2_s <= cmd; tx_size_2_s <= size; -- send request; pad_request_2_s <= '1'; wait for 1 * period_c; pad_request_2_s <= '0'; end issue_command; -- --------------------------------------------------------------------------- --------------------------------------------------------------------------- -- Procedure poll_pad -- -- Requests the status of Pad 2 and checks the received data. -- procedure poll_pad(packet : in std_logic_vector(63 downto 0)) is variable cmd_v : std_logic_vector(23 downto 0); begin wait until clk_s'event and clk_s = '1'; wait for 1 ns; -- set up model answer pad_model_data_2_s <= packet; -- set expected number of bytes for gcpad_full rx_size_2_s <= "1000"; cmd_v(23 downto 16) := cmd_poll_c; cmd_v(15 downto 0) := "0000001100000010"; issue_command(cmd => cmd_v, size => "11"); wait until pad_avail_2_s = '1'; assert pad_timeout_2_s = '0' report "Timout signalled on Pad 2 during status polling!" severity error; -- check result for i in 0 to packet'high loop assert packet(i) = rx_data_2_s(i) report "Data mismatch on Pad 2!" severity error; end loop; end poll_pad; -- --------------------------------------------------------------------------- --------------------------------------------------------------------------- -- Procedure timeout_gcpad_x -- -- Generates a timeout in gcpad_full by disturbing the communication. -- procedure timeout_gcpad_x is variable cmd_v : std_logic_vector(23 downto 0); begin wait until clk_s'event and clk_s = '1'; wait for 1 ns; pad_model_data_2_s <= (others => '0'); rx_size_2_s <= "1000"; cmd_v(23 downto 16) := cmd_poll_c; cmd_v(15 downto 0) := "0000001100000010"; issue_command(cmd => cmd_v, size => "11"); -- disturb communication pad_data_2_s <= 'X'; wait until pad_avail_1_s = '1'; wait for 10 * period_c; pad_data_2_s <= 'H'; wait for 10 * period_c; assert pad_timeout_2_s = '1' report "No timeout indicated on Pad 2 when communication has been disturbed!" severity error; end timeout_gcpad_x; -- --------------------------------------------------------------------------- --------------------------------------------------------------------------- -- Procedure timeout_gcpad_short -- -- Generates a timeout in gcpad_full by requesting too many bytes for -- a "get id" command. -- procedure timeout_gcpad_short is variable cmd_v : std_logic_vector(23 downto 0); begin wait until clk_s'event and clk_s = '1'; wait for 1 ns; -- expect too many number of bytes -- command is "get id", will yield 3 bytes, but 8 bytes are requested rx_size_2_s <= "1000"; cmd_v(23 downto 16) := cmd_get_id_c; cmd_v(15 downto 0) := (others => '1'); issue_command(cmd => cmd_v, size => "01"); wait until pad_avail_2_s = '1'; assert pad_timeout_2_s = '1' report "No timout indicated on Pad 2 when too many bytes requested!" severity error; end timeout_gcpad_short; -- --------------------------------------------------------------------------- --------------------------------------------------------------------------- -- Procedure get_id -- -- Requests the ID information from the GC controller model. -- procedure get_id is variable cmd_v : std_logic_vector(23 downto 0); constant id_c : std_logic_vector(23 downto 0) := "000010010000000000000000"; begin wait until clk_s'event and clk_s = '1'; wait for 1 ns; rx_size_2_s <= "0011"; cmd_v(23 downto 16) := cmd_get_id_c; cmd_v(15 downto 0) := (others => '1'); issue_command(cmd => cmd_v, size => "01"); wait until pad_avail_2_s = '1'; assert pad_timeout_2_s = '0' report "Timout signalled on Pad 2 during get id!" severity error; -- check result for i in 0 to id_c'high loop assert id_c(i) = rx_data_2_s(i) report "ID mismatch on Pad 2!" severity error; end loop; end get_id; -- --------------------------------------------------------------------------- begin stimuli_2_end_s <= false; pad_data_2_s <= 'H'; pad_request_2_s <= '0'; tx_size_2_s <= (others => '0'); tx_command_2_s <= (others => '0'); rx_size_2_s <= (others => '0'); pad_model_data_2_s <= (others => '0'); wait until reset_s = '1'; wait for period_c * 4; get_id; timeout_gcpad_x; poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000000000"); wait for clocks_per_1us_c * 100 * period_c; poll_pad(packet => "0001111111111111111111111111111111111111111111111111111111111111"); timeout_gcpad_short; poll_pad(packet => "0001000010000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000100010000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000010010000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000001010000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000110000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000101010101010101010101010101010101010101010101010101010101010"); poll_pad(packet => "0001010111010101010101010101010101010101010101010101010101010101"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000011000000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010100000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010010000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010001000000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000100000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000010000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000001000000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000100000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000010000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000001000000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000100000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000010000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000001000000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000100000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000010000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000001000000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000100000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000010000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000001000000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000100000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000010000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000001000000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000100000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000010000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000001000000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000100000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000010000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000001000000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000100000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000010000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000001000000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000100000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000010000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000001000000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000100000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000010000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000001000000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000100000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000010000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000001000000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000100000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000010000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000001000000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000100000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000010000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000001000000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000100000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000010000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000001000000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000100000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000010000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000001000"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000000100"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000000010"); poll_pad(packet => "0000000010000000000000000000000000000000000000000000000000000001"); wait for period_c * 2*40; stimuli_2_end_s <= true; wait; end process stimuli_pad_2; -- ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -- Clock Generator ----------------------------------------------------------------------------- clk: process begin clk_s <= '0'; wait for period_c / 2; clk_s <= '1'; wait for period_c / 2; end process clk; ----------------------------------------------------------------------------- -- Reset Generator ----------------------------------------------------------------------------- reset: process begin if reset_level_c = 0 then reset_s <= '0'; else reset_s <= '1'; end if; wait for period_c * 4 + 10 ns; reset_s <= not reset_s; wait; end process reset; ----------------------------------------------------------------------------- -- End of simulation detection ----------------------------------------------------------------------------- eos: process (stimuli_1_end_s, stimuli_2_end_s) begin if stimuli_1_end_s and stimuli_2_end_s then assert false report "End of simulation reached." severity failure; end if; end process eos; end behav; ------------------------------------------------------------------------------- -- File History: -- -- $Log: tb.vhd,v $ -- Revision 1.3 2004/10/10 17:27:44 arniml -- added second pad -- introduced testbench model for GC controller -- -- Revision 1.2 2004/10/09 17:05:59 arniml -- delay assertion of request signal by real time (instead of delta cycles) -- -- Revision 1.1 2004/10/07 21:24:06 arniml -- initial check-in -- ------------------------------------------------------------------------------- @ 1.3 log @added second pad introduced testbench model for GC controller @ text @d6 1 a6 1 -- $Id: tb.vhd,v 1.2 2004/10/09 17:05:59 arniml Exp $ d64 7 d90 6 a95 6 signal stimuli_1_end_s : boolean; signal pad_data_1_s : std_logic; signal buttons_1_s : std_logic_vector(64 downto 0); signal pad_request_1_s : std_logic; signal pad_avail_1_s : std_logic; signal rx_data_1_s : std_logic_vector(63 downto 0); d98 10 a107 9 signal stimuli_2_end_s : boolean; signal pad_data_2_s : std_logic; signal pad_request_2_s : std_logic; signal pad_avail_2_s : std_logic; signal pad_timeout_2_s : std_logic; signal tx_size_2_s : std_logic_vector( 1 downto 0); signal tx_command_2_s : std_logic_vector(23 downto 0); signal rx_size_2_s : std_logic_vector( 3 downto 0); signal rx_data_2_s : std_logic_vector(63 downto 0); d173 1 a173 1 rx_data_i => rx_data_1_s d176 1 d184 6 a189 2 procedure send_packet(packet : in std_logic_vector(64 downto 0)) is d194 1 a194 1 rx_data_1_s <= packet(64 downto 1); d207 3 a209 3 for i in 1 to packet'high loop assert packet(i) = buttons_1_s(i-1) report "Button mismatch!" d213 3 a215 1 end send_packet; d218 5 d225 3 d244 2 d250 3 a252 3 pad_data_1_s <= 'H'; pad_request_1_s <= '0'; rx_data_1_s <= (others => '0'); d258 1 a258 1 send_packet(packet => "00000000100000000000000000000000000000000000000000000000000000001"); d260 64 a323 64 send_packet(packet => "00011111111111111111111111111111111111111111111111111111111111111"); send_packet(packet => "00010000100000000000000000000000000000000000000000000000000000001"); send_packet(packet => "00001000100000000000000000000000000000000000000000000000000000001"); send_packet(packet => "00000100100000000000000000000000000000000000000000000000000000001"); send_packet(packet => "00000010100000000000000000000000000000000000000000000000000000001"); send_packet(packet => "00000001100000000000000000000000000000000000000000000000000000001"); send_packet(packet => "00001010101010101010101010101010101010101010101010101010101010101"); send_packet(packet => "00010101110101010101010101010101010101010101010101010101010101011"); send_packet(packet => "00000000100000000000000000000000000000000000000000000000000000001"); send_packet(packet => "00000000110000000000000000000000000000000000000000000000000000001"); send_packet(packet => "00000000101000000000000000000000000000000000000000000000000000001"); send_packet(packet => "00000000100100000000000000000000000000000000000000000000000000001"); send_packet(packet => "00000000100010000000000000000000000000000000000000000000000000001"); send_packet(packet => "00000000100001000000000000000000000000000000000000000000000000001"); send_packet(packet => "00000000100000100000000000000000000000000000000000000000000000001"); send_packet(packet => "00000000100000010000000000000000000000000000000000000000000000001"); send_packet(packet => "00000000100000001000000000000000000000000000000000000000000000001"); send_packet(packet => "00000000100000000100000000000000000000000000000000000000000000001"); send_packet(packet => "00000000100000000010000000000000000000000000000000000000000000001"); send_packet(packet => "00000000100000000001000000000000000000000000000000000000000000001"); send_packet(packet => "00000000100000000000100000000000000000000000000000000000000000001"); send_packet(packet => "00000000100000000000010000000000000000000000000000000000000000001"); send_packet(packet => "00000000100000000000001000000000000000000000000000000000000000001"); send_packet(packet => "00000000100000000000000100000000000000000000000000000000000000001"); send_packet(packet => "00000000100000000000000010000000000000000000000000000000000000001"); send_packet(packet => "00000000100000000000000001000000000000000000000000000000000000001"); send_packet(packet => "00000000100000000000000000100000000000000000000000000000000000001"); send_packet(packet => "00000000100000000000000000010000000000000000000000000000000000001"); send_packet(packet => "00000000100000000000000000001000000000000000000000000000000000001"); send_packet(packet => "00000000100000000000000000000100000000000000000000000000000000001"); send_packet(packet => "00000000100000000000000000000010000000000000000000000000000000001"); send_packet(packet => "00000000100000000000000000000001000000000000000000000000000000001"); send_packet(packet => "00000000100000000000000000000000100000000000000000000000000000001"); send_packet(packet => "00000000100000000000000000000000010000000000000000000000000000001"); send_packet(packet => "00000000100000000000000000000000001000000000000000000000000000001"); send_packet(packet => "00000000100000000000000000000000000100000000000000000000000000001"); send_packet(packet => "00000000100000000000000000000000000010000000000000000000000000001"); send_packet(packet => "00000000100000000000000000000000000001000000000000000000000000001"); send_packet(packet => "00000000100000000000000000000000000000100000000000000000000000001"); send_packet(packet => "00000000100000000000000000000000000000010000000000000000000000001"); send_packet(packet => "00000000100000000000000000000000000000001000000000000000000000001"); send_packet(packet => "00000000100000000000000000000000000000000100000000000000000000001"); send_packet(packet => "00000000100000000000000000000000000000000010000000000000000000001"); send_packet(packet => "00000000100000000000000000000000000000000001000000000000000000001"); send_packet(packet => "00000000100000000000000000000000000000000000100000000000000000001"); send_packet(packet => "00000000100000000000000000000000000000000000010000000000000000001"); send_packet(packet => "00000000100000000000000000000000000000000000001000000000000000001"); send_packet(packet => "00000000100000000000000000000000000000000000000100000000000000001"); send_packet(packet => "00000000100000000000000000000000000000000000000010000000000000001"); send_packet(packet => "00000000100000000000000000000000000000000000000001000000000000001"); send_packet(packet => "00000000100000000000000000000000000000000000000000100000000000001"); send_packet(packet => "00000000100000000000000000000000000000000000000000010000000000001"); send_packet(packet => "00000000100000000000000000000000000000000000000000001000000000001"); send_packet(packet => "00000000100000000000000000000000000000000000000000000100000000001"); send_packet(packet => "00000000100000000000000000000000000000000000000000000010000000001"); send_packet(packet => "00000000100000000000000000000000000000000000000000000001000000001"); send_packet(packet => "00000000100000000000000000000000000000000000000000000000100000001"); send_packet(packet => "00000000100000000000000000000000000000000000000000000000010000001"); send_packet(packet => "00000000100000000000000000000000000000000000000000000000001000001"); send_packet(packet => "00000000100000000000000000000000000000000000000000000000000100001"); send_packet(packet => "00000000100000000000000000000000000000000000000000000000000010001"); send_packet(packet => "00000000100000000000000000000000000000000000000000000000000001001"); send_packet(packet => "00000000100000000000000000000000000000000000000000000000000000101"); send_packet(packet => "00000000100000000000000000000000000000000000000000000000000000011"); d342 1 a342 1 rx_data_i => rx_data_2_s d345 1 d353 5 d371 54 d426 95 a520 1 end issue_command; d522 1 a522 1 begin d525 6 a530 5 pad_data_2_s <= 'H'; pad_request_2_s <= '0'; tx_size_2_s <= (others => '0'); tx_command_2_s <= (others => '0'); rx_size_2_s <= (others => '0'); d536 69 a604 2 issue_command(cmd => "010000000000001100000010", size => "11"); d666 4 @ 1.2 log @delay assertion of request signal by real time (instead of delta cycles) @ text @d6 1 a6 1 -- $Id: tb.vhd,v 1.1 2004/10/07 21:24:06 arniml Exp $ d59 2 d64 1 a64 5 constant period_c : time := 100 ns; constant reset_level_c : natural := 0; constant clocks_per_1us_c : natural := 10; component gcpad_basic d66 1 a66 2 reset_level_g : integer := 0; clocks_per_1us_g : integer := 2 a69 3 reset_i : in std_logic; pad_request_i : in std_logic; pad_avail_o : out std_logic; d71 1 a71 18 but_a_o : out std_logic; but_b_o : out std_logic; but_x_o : out std_logic; but_y_o : out std_logic; but_z_o : out std_logic; but_start_o : out std_logic; but_tl_o : out std_logic; but_tr_o : out std_logic; but_left_o : out std_logic; but_right_o : out std_logic; but_up_o : out std_logic; but_down_o : out std_logic; ana_joy_x_o : out std_logic_vector(7 downto 0); ana_joy_y_o : out std_logic_vector(7 downto 0); ana_c_x_o : out std_logic_vector(7 downto 0); ana_c_y_o : out std_logic_vector(7 downto 0); ana_l_o : out std_logic_vector(7 downto 0); ana_r_o : out std_logic_vector(7 downto 0) d75 4 d82 18 a99 6 signal pad_data_s : std_logic; signal buttons_s : std_logic_vector(64 downto 0); signal pad_request_s : std_logic; signal pad_avail_s : std_logic; d111 21 a131 21 pad_request_i => pad_request_s, pad_avail_o => pad_avail_s, pad_data_io => pad_data_s, but_a_o => buttons_s(56), but_b_o => buttons_s(57), but_x_o => buttons_s(58), but_y_o => buttons_s(59), but_z_o => buttons_s(52), but_start_o => buttons_s(60), but_tl_o => buttons_s(54), but_tr_o => buttons_s(53), but_left_o => buttons_s(48), but_right_o => buttons_s(49), but_up_o => buttons_s(51), but_down_o => buttons_s(50), ana_joy_x_o => buttons_s(47 downto 40), ana_joy_y_o => buttons_s(39 downto 32), ana_c_x_o => buttons_s(31 downto 24), ana_c_y_o => buttons_s(23 downto 16), ana_l_o => buttons_s(15 downto 8), ana_r_o => buttons_s( 7 downto 0) d134 3 a136 3 buttons_s(64) <= '0'; buttons_s(63 downto 61) <= (others => '0'); buttons_s(55) <= '1'; d139 17 a155 2 -- pullup on pad_data -- pad_data_s <= 'H'; d158 9 a166 1 stimuli: process d168 6 a173 16 procedure check_request is constant request_c : std_logic_vector(24 downto 0) := "H0H000000HH000000000000H0"; begin -- read 25 bits from pad_data_s for i in 0 to 24 loop wait until pad_data_s = '0'; wait for 2 * clocks_per_1us_c * period_c; if pad_data_s /= request_c(i) then assert false report "Found wrong level on pad_data_s while checking request packet!" severity error; end if; wait for 2 * clocks_per_1us_c * period_c; a174 4 end loop; end check_request; a176 1 variable time_low_v, time_high_v : time; d180 3 d184 1 a184 1 pad_request_s <= '1'; d186 1 a186 3 pad_request_s <= '0'; check_request; d190 1 a190 18 for i in packet'high downto 0 loop if packet(i) = '0' then time_low_v := 3 us; time_high_v := 1 us; else time_low_v := 1 us; time_high_v := 3 us; end if; pad_data_s <= '0'; wait for time_low_v; pad_data_s <= 'H'; wait for time_high_v; end loop; wait until pad_avail_s = '1'; d195 1 a195 1 assert packet(i) = buttons_s(i-1) d206 1 a206 1 pad_request_s <= '1'; d208 3 a210 1 pad_request_s <= '0'; d212 2 a213 1 check_request; d215 3 a217 1 wait until pad_avail_s = '1'; d223 5 a227 2 pad_data_s <= 'H'; pad_request_s <= '0'; d302 2 a303 3 assert false report "End of simulation reached." severity failure; d305 3 a307 1 end process stimuli; d310 58 d399 13 d419 3 @ 1.1 log @initial check-in @ text @d6 1 a6 1 -- $Id$ d177 2 d353 4 a356 1 -- $Log$ @