git-svn-id: http://moon:8086/svn/vhdl/trunk@1290 cc03376c-175c-47c8-b038-4cd826a8556b
170 lines
6.1 KiB
VHDL
170 lines
6.1 KiB
VHDL
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.ALL;
|
|
USE std.textio.ALL;
|
|
USE work.std_logic_arith.ALL;
|
|
USE work.util_1164.ALL;
|
|
USE work.mti_pkg.ALL;
|
|
|
|
ENTITY tb IS
|
|
END tb;
|
|
|
|
|
|
ARCHITECTURE test OF tb IS
|
|
CONSTANT addr_bits : INTEGER := 12;
|
|
CONSTANT data_bits : INTEGER := 4;
|
|
CONSTANT clk_start : time := 5 ns;
|
|
CONSTANT clk_period : time := 10 ns;
|
|
CONSTANT continue_time : time := 10 ns;
|
|
|
|
COMPONENT mt48lc32m4a2
|
|
PORT (
|
|
Dq : INOUT STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z');
|
|
Addr : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0');
|
|
Ba : IN STD_LOGIC_VECTOR (1 DOWNTO 0) := "00";
|
|
Clk : IN STD_LOGIC := '0';
|
|
Cke : IN STD_LOGIC := '1';
|
|
Cs_n : IN STD_LOGIC := '1';
|
|
Cas_n : IN STD_LOGIC := '1';
|
|
Ras_n : IN STD_LOGIC := '1';
|
|
We_n : IN STD_LOGIC := '1';
|
|
Dqm : IN STD_LOGIC := '0'
|
|
);
|
|
END COMPONENT;
|
|
|
|
FOR ALL : mt48lc32m4a2 USE ENTITY work.mt48lc32m4a2 (behave);
|
|
|
|
SIGNAL pDq : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0);
|
|
SIGNAL pAddr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
|
|
SIGNAL pBa : STD_LOGIC_VECTOR (1 DOWNTO 0);
|
|
SIGNAL pClk : STD_LOGIC;
|
|
SIGNAL pCke : STD_LOGIC;
|
|
SIGNAL pCs : STD_LOGIC;
|
|
SIGNAL pCas : STD_LOGIC;
|
|
SIGNAL pRas : STD_LOGIC;
|
|
SIGNAL pWe : STD_LOGIC;
|
|
SIGNAL pDqm : STD_LOGIC;
|
|
SIGNAL stim_done : boolean := false;
|
|
SIGNAL clk_done : boolean := false;
|
|
|
|
|
|
BEGIN
|
|
u1: mt48lc32m4a2
|
|
PORT MAP(
|
|
Dq => pDq,
|
|
Addr => pAddr,
|
|
Ba => pBa,
|
|
Clk => pClk,
|
|
Cke => pCke,
|
|
Cs_n => pCs,
|
|
Ras_n => pRas,
|
|
Cas_n => pCas,
|
|
We_n => pWe,
|
|
Dqm => pDqm
|
|
);
|
|
|
|
stimulator : PROCESS
|
|
FILE stim_file:text IS IN "test.txt";
|
|
--FILE stim_file:text IS IN "test1.txt";
|
|
VARIABLE l : line;
|
|
VARIABLE time_var : TIME;
|
|
VARIABLE pCke_var : STD_LOGIC;
|
|
VARIABLE pCs_var : STD_LOGIC;
|
|
VARIABLE pRas_var : STD_LOGIC;
|
|
VARIABLE PCas_var : STD_LOGIC;
|
|
VARIABLE pWe_var : STD_LOGIC;
|
|
VARIABLE pDqm_var : STD_LOGIC;
|
|
VARIABLE pBa_var : STD_LOGIC_VECTOR (1 DOWNTO 0);
|
|
VARIABLE pAddr_var : INTEGER;
|
|
VARIABLE pDq_var : INTEGER; -- -100 is converted to hi-Z state
|
|
VARIABLE pMa_var_vect : STD_LOGIC_VECTOR(addr_bits - 1 DOWNTO 0);
|
|
CONSTANT HiZ : STD_LOGIC_VECTOR(data_bits - 1 DOWNTO 0) := (OTHERS => 'Z');
|
|
BEGIN
|
|
WHILE not ENDFILE(stim_file) LOOP
|
|
readline(stim_file,l);
|
|
IF l'length > 0 THEN
|
|
read(l, time_var);
|
|
read(l, pCke_var);
|
|
read(l, pCs_var);
|
|
read(l, pRas_var);
|
|
read(l, pCas_var);
|
|
read(l, pWe_var);
|
|
read(l, pDqm_var);
|
|
read(l, pBa_var);
|
|
read(l, pAddr_var);
|
|
read(l, pDq_var);
|
|
IF now > time_var THEN
|
|
ASSERT false
|
|
REPORT "Detected a time in the stim file that is in the past"
|
|
SEVERITY error;
|
|
ELSE
|
|
WAIT FOR time_var-now;
|
|
IF pWe_var='1' THEN
|
|
pCke <= pCke_var;
|
|
pCs <= pCs_var;
|
|
pRas <= pRas_var;
|
|
pCas <= pCas_var;
|
|
pWe <= pWe_var;
|
|
pDqm <= pDqm_var;
|
|
pBa <= pBa_var;
|
|
pMa_var_vect := CONV_STD_LOGIC_VECTOR(pAddr_var, addr_bits);
|
|
pAddr <= pMa_var_vect;
|
|
IF pDq_var = -100 THEN
|
|
pDq <= HiZ;
|
|
ELSE
|
|
pDq <= CONV_STD_LOGIC_VECTOR(pDq_var, data_bits);
|
|
END IF;
|
|
ELSE
|
|
pCke <= pCke_var;
|
|
pCs <= pCs_var;
|
|
pRas <= pRas_var;
|
|
pCas <= pCas_var;
|
|
pWe <= pWe_var;
|
|
pDqm <= pDqm_var;
|
|
pBa <= pBa_var;
|
|
pMa_var_vect := CONV_STD_LOGIC_VECTOR(pAddr_var, addr_bits);
|
|
pAddr <= pMa_var_vect;
|
|
IF pDq_var = -100 THEN
|
|
pDq <= HiZ;
|
|
ELSE
|
|
pDq <= CONV_STD_LOGIC_VECTOR(pDq_var, data_bits);
|
|
END IF;
|
|
END IF;
|
|
END IF;
|
|
END IF;
|
|
END LOOP;
|
|
ASSERT false
|
|
REPORT "End of Stimulation File Detected!"
|
|
SEVERITY note;
|
|
stim_done <= true;
|
|
WAIT;
|
|
END PROCESS;
|
|
|
|
clock : PROCESS
|
|
VARIABLE done_time : time;
|
|
BEGIN
|
|
pclk <= '0';
|
|
WAIT for clk_start;
|
|
WHILE not stim_done loop
|
|
pclk <= '1';
|
|
WAIT for clk_period/2;
|
|
pclk <= '0';
|
|
WAIT for clk_period/2;
|
|
END LOOP;
|
|
done_time := now+continue_time;
|
|
WHILE now < done_time LOOP --one last clock to finish last command
|
|
pclk <= '1';
|
|
WAIT for clk_period/2;
|
|
pclk <= '0';
|
|
WAIT for clk_period/2;
|
|
END LOOP;
|
|
ASSERT false
|
|
REPORT "Suspending clock activity"
|
|
SEVERITY note;
|
|
clk_done <= true;
|
|
WAIT;
|
|
END PROCESS;
|
|
|
|
END test;
|
|
|
|
|