##// END OF EJS Templates
Fusion
Fusion

File last commit:

r191:cfe9287a48ea JC
r636:a3dd504c9783 merge simu_with_Leon3
Show More
tb.vhd
369 lines | 11.4 KiB | text/x-vhdl | VhdlLexer
--***************************************************************************************
--
-- File Name: tb.vhd
-- Version: 1.0
-- Date: Aug 8th, 2005
-- Simulator: Modelsim
--
--
-- Queries: MPD Applications
-- Website: www.cypress.com/support
-- Company: Cypress Semiconductor
-- Part #: testbench for CY7C1360C (256K x 36)
--
--
-- Disclaimer: THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY
-- WHATSOEVER AND CYPRESS SPECIFICALLY DISCLAIMS ANY
-- IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
-- A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT.
--
-- Copyright(c) Cypress Semiconductor, 2004
-- All rights reserved
--
-- Rev Date Changes
-- --- ---------- ---------------------------------------
-- 1.0 12/22/2004 - New Model
-- - New Test Bench
-- - New Test Vectors
--
--***************************************************************************************
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE std.textio.ALL;
USE ieee.std_logic_textio.ALL;
ENTITY tb IS
END tb;
architecture tb_arch of tb is
CONSTANT addr_bits : INTEGER := 18;
CONSTANT data_bits : INTEGER := 36;
CONSTANT tx01 : TIME := 2.2 ns; -- 0.0 ns to 1.8 ns
COMPONENT CY7C1360C
PORT (iZZ : IN STD_LOGIC;
iMode : IN STD_LOGIC;
iADDR : IN STD_LOGIC_VECTOR ((addr_bits -1) downto 0);
inGW : IN STD_LOGIC;
inBWE : IN STD_LOGIC;
inBWd : IN STD_LOGIC;
inBWc : IN STD_LOGIC;
inBWb : IN STD_LOGIC;
inBWa : IN STD_LOGIC;
inCE1 : IN STD_LOGIC;
iCE2 : IN STD_LOGIC;
inCE3 : IN STD_LOGIC;
inADSP : IN STD_LOGIC;
inADSC : IN STD_LOGIC;
inADV : IN STD_LOGIC;
inOE : IN STD_LOGIC;
ioDQ : INOUT STD_LOGIC_VECTOR ((data_bits-1) downto 0);
iCLK : IN STD_LOGIC);
END COMPONENT;
--------------------------------------------------------------------------
-- Function: to_slv
--
-- Description: Converts string to std_logic_vector
--------------------------------------------------------------------------
function to_slv(value : in string) return std_logic_vector is
variable outvec : std_logic_vector(value'length -1 downto 0);
variable i : integer;
variable temp : character;
begin
for i in 1 to value'length loop
temp := value(i);
case temp is
when '0' => outvec(i-1) := '0';
when '1' => outvec(i-1) := '1';
when 'X' => outvec(i-1) := 'X';
when 'Z' => outvec(i-1) := 'Z';
when others =>
assert false report "Illegal characters" severity note;
end case;
end loop;
return outvec;
end to_slv;
--------------------------------------------------------------------------
-- Function: to_slv_char
--
-- Description: Converts character to std_logic_vector
--------------------------------------------------------------------------
function to_slv_char(value : in character) return std_logic is
variable outvec_char : std_logic;
begin
case value is
when '0' => outvec_char := '0';
when '1' => outvec_char := '1';
when 'X' => outvec_char := 'X';
when 'Z' => outvec_char := 'Z';
when others =>
assert false report "Illegal characters" severity note;
end case;
return outvec_char;
end to_slv_char;
--------------------------------------------------------------------------
--------------------------------------------------------------------------
-- Function: to_string
--
-- Description: Converts time to string
--------------------------------------------------------------------------
function to_string (value : in integer) return string is
variable L : line;
begin
write(L, value, RIGHT, 10);
return L.all;
end to_string;
--------------------------------------------------------------------------
FOR ALL: CY7C1360C USE ENTITY WORK.CY7C1360C(CY7C1360C_arch);
SIGNAL DQ : STD_LOGIC_VECTOR((data_bits-1) DOWNTO 0);
SIGNAL Addr : STD_LOGIC_VECTOR((addr_bits-1) DOWNTO 0) := (OTHERS => '0');
SIGNAL ZZ, clk : STD_LOGIC := '0';
SIGNAL Mode : STD_LOGIC := '0';
SIGNAL BWE_n : STD_LOGIC := '1';
SIGNAL BWd_n : STD_LOGIC := '1';
SIGNAL BWc_n : STD_LOGIC := '1';
SIGNAL BWb_n : STD_LOGIC := '1';
SIGNAL BWa_n : STD_LOGIC := '1';
SIGNAL GW_n : STD_LOGIC := '1';
signal CE1_n : STD_LOGIC := '1';
signal CE2 : STD_LOGIC := '0';
SIGNAL CE3_n : STD_LOGIC := '1';
signal ADSP_n : STD_LOGIC := '1';
signal ADSC_n : STD_LOGIC := '1';
signal ADV_n : STD_LOGIC := '1';
signal OE_n : STD_LOGIC := '1';
signal count : integer := 0;
signal chkout : std_logic := '0';
signal testin_tmp_slv : std_logic_vector ((data_bits-1) downto 0) := (others => '0');
signal strb : std_logic := '0';
signal temp : std_logic := '1';
signal D : STD_LOGIC_VECTOR((data_bits-1) DOWNTO 0) := (OTHERS => '0');
signal read_write : std_logic;
signal trigger : std_logic := '0';
begin
-- Unit Under Test port map
UUT : CY7C1360C
PORT MAP (ioDq => Dq,
iAddr => Addr,
iClk => Clk,
iMode => Mode,
inAdv => Adv_n,
inBwa => Bwa_n,
inBwb => Bwb_n,
inBwc => Bwc_n,
inBwd => Bwd_n,
inOE => OE_n,
inCE1 => CE1_n,
inCE3 => CE3_n,
iCE2 => CE2,
inADSP => ADSP_n,
inADSC => ADSC_n,
inGW => GW_n,
inBWE => BWE_n,
iZZ => Zz
);
Process
begin
trigger <= '1' after 4 ns;
wait;
end process;
with trigger select
strb <= not strb after 4.4 ns when '1',
'0' when others; --clock
process(strb)
begin
clk <= strb after tx01;
end process;
process
variable l : line;
variable A_tmp : string (5 downto 1);
variable zz_tmp : character;
variable mode_tmp : character;
variable gw_tmp : character;
variable bwe_tmp : character;
variable bw_tmp : string (4 downto 1);
variable ce1_n_tmp : character;
variable ce2_tmp : character;
variable ce3_n_tmp : character;
variable adsp_n_tmp : character;
variable adsc_n_tmp : character;
variable adv_n_tmp : character;
variable oeb_tmp : character;
variable testout_tmp1, testout_tmp2, testout_tmp3, testout_tmp4 : string (9 downto 1);
variable testin_tmp1, testin_tmp2, testin_tmp3, testin_tmp4 : string (9 downto 1);
variable A_tmp_slv : STD_LOGIC_VECTOR (4 downto 0);
variable zz_tmp_slv : STD_LOGIC;
variable mode_tmp_slv : STD_LOGIC;
variable gw_tmp_slv : STD_LOGIC;
variable bwe_tmp_slv : STD_LOGIC;
variable bw_tmp_slv : STD_LOGIC_VECTOR (3 downto 0);
variable ce1_n_tmp_slv : STD_LOGIC;
variable ce2_tmp_slv : STD_LOGIC;
variable ce3_n_tmp_slv : STD_LOGIC;
variable adsp_n_tmp_slv : STD_LOGIC;
variable adsc_n_tmp_slv : STD_LOGIC;
variable adv_n_tmp_slv : STD_LOGIC;
variable oeb_tmp_slv : STD_LOGIC;
variable testout_tmp1_slv,testout_tmp2_slv,testout_tmp3_slv,testout_tmp4_slv : STD_LOGIC_VECTOR (8 downto 0);
variable US: character;
variable linecount: integer;
FILE test_vectors : text is in "SS_PL_SCD_X36_vect.txt"; -- preload file
begin
while not endfile(test_vectors) loop
assert false report "Line no" &to_string(count) severity note;
wait until strb = '1';
readline (test_vectors,l);
read(l,zz_tmp);
read(l,US);
read(l,mode_tmp);
read(l,US);
read(l,A_tmp);
read(l,US);
read(l,gw_tmp);
read(l,US);
read(l,bwe_tmp);
read(l,US);
read(l,bw_tmp);
read(l,US);
read(l,ce1_n_tmp);
read(l,US);
read(l,ce2_tmp);
read(l,US);
read(l,ce3_n_tmp);
read(l,US);
read(l,ADSP_n_tmp);
read(l,US);
read(l,ADSC_n_tmp);
read(l,US);
read(l,ADV_n_tmp);
read(l,US);
read(l,oeb_tmp);
read(l,US);
read(l,testout_tmp1);
read(l,US);
read(l,testout_tmp2);
read(l,US);
read(l,testout_tmp3);
read(l,US);
read(l,testout_tmp4);
read(l,US);
read(l,testin_tmp1);
read(l,US);
read(l,testin_tmp2);
read(l,US);
read(l,testin_tmp3);
read(l,US);
read(l,testin_tmp4);
A_tmp_slv (4 downto 0) := to_slv(A_tmp);
zz_tmp_slv := to_slv_char(zz_tmp);
mode_tmp_slv := to_slv_char(mode_tmp);
gw_tmp_slv := to_slv_char(gw_tmp);
bwe_tmp_slv := to_slv_char(bwe_tmp);
bw_tmp_slv (3 downto 0) := to_slv(bw_tmp);
ce1_n_tmp_slv := to_slv_char(ce1_n_tmp);
ce2_tmp_slv := to_slv_char(ce2_tmp);
ce3_n_tmp_slv := to_slv_char(ce3_n_tmp);
ADSP_n_tmp_slv := to_slv_char(ADSP_n_tmp);
ADSC_n_tmp_slv := to_slv_char(ADSC_n_tmp);
ADV_n_tmp_slv := to_slv_char(ADV_n_tmp);
oeb_tmp_slv := to_slv_char(oeb_tmp);
testin_tmp_slv (8 downto 0) <= to_slv(testin_tmp4);
testout_tmp1_slv (8 downto 0) := to_slv(testout_tmp1);
testin_tmp_slv (17 downto 9) <= to_slv(testin_tmp3);
testout_tmp2_slv (8 downto 0) := to_slv(testout_tmp2);
testin_tmp_slv (26 downto 18) <= to_slv(testin_tmp2);
testout_tmp3_slv (8 downto 0) := to_slv(testout_tmp3);
testin_tmp_slv (35 downto 27) <= to_slv(testin_tmp1);
testout_tmp4_slv (8 downto 0) := to_slv(testout_tmp4);
Addr <= "0000000000000" & A_tmp_slv;
Mode <= mode_tmp_slv;
Adv_n <= Adv_n_tmp_slv;
Bwa_n <= Bw_tmp_slv (0);
Bwb_n <= Bw_tmp_slv (1);
Bwc_n <= Bw_tmp_slv (2);
Bwd_n <= Bw_tmp_slv (3);
OE_n <= OEb_tmp_slv;
CE1_n <= CE1_n_tmp_slv;
CE3_n <= CE3_n_tmp_slv;
CE2 <= CE2_tmp_slv;
ADSP_n <= ADSP_n_tmp_slv;
ADSC_n <= ADSC_n_tmp_slv;
GW_n <= GW_tmp_slv;
BWE_n <= BWE_tmp_slv;
ZZ <= zz_tmp_slv;
D (35 downto 27) <= testout_tmp1_slv;
D (26 downto 18) <= testout_tmp2_slv;
D (17 downto 9) <= testout_tmp3_slv;
D (8 downto 0) <= testout_tmp4_slv;
count <= count +1;
end loop;
chkout <= '1';
wait;
end process;
read_write <= '0' when D = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" else '1'; --1 means write
DQ <= D when read_write = '1' else "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
Process (clk)
begin
if rising_edge (clk) then
if (chkout = '0') then
if (D /= "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ") then
assert false report "Write Cycle" severity note;
else
if (DQ(35 downto 0) = testin_tmp_slv(35 downto 0)) then
assert false report "OK" severity note;
else
assert false report "ERROR" severity note;
end if;
end if;
else
assert false report "TEST COMPLETE" severity note;
end if;
end if;
end process;
end tb_arch;