tb.vhd
369 lines
| 11.4 KiB
| text/x-vhdl
|
VhdlLexer
pellion
|
r191 | --*************************************************************************************** | ||
-- | ||||
-- 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; | ||||