git-svn-id: http://moon:8086/svn/vhdl/trunk@1290 cc03376c-175c-47c8-b038-4cd826a8556b
314 lines
12 KiB
VHDL
314 lines
12 KiB
VHDL
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.ALL;
|
|
|
|
ENTITY tb IS
|
|
END tb;
|
|
|
|
ARCHITECTURE test OF tb IS
|
|
COMPONENT mt48lc16m8a2
|
|
GENERIC (
|
|
tCK : TIME := 10 ns;
|
|
addr_bits : INTEGER := 12;
|
|
data_bits : INTEGER := 8
|
|
);
|
|
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 := '0';
|
|
Cs_n : IN STD_LOGIC := '1';
|
|
Cas_n : IN STD_LOGIC := '0';
|
|
Ras_n : IN STD_LOGIC := '0';
|
|
We_n : IN STD_LOGIC := '0';
|
|
Dqm : IN STD_LOGIC := '0'
|
|
);
|
|
END COMPONENT;
|
|
|
|
FOR ALL : mt48lc16m8a2 USE ENTITY work.mt48lc16m8a2 (behave);
|
|
|
|
CONSTANT tCK : TIME := 10 ns;
|
|
CONSTANT addr_bits : INTEGER := 12;
|
|
CONSTANT data_bits : INTEGER := 8;
|
|
|
|
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_n : STD_LOGIC;
|
|
SIGNAL pCas_n : STD_LOGIC;
|
|
SIGNAL pRas_n : STD_LOGIC;
|
|
SIGNAL pWe_n : STD_LOGIC;
|
|
SIGNAL pDqm : STD_LOGIC;
|
|
SIGNAL stim_done : boolean := false;
|
|
SIGNAL clk_done : boolean := false;
|
|
|
|
|
|
BEGIN
|
|
u1: mt48lc16m8a2
|
|
PORT MAP(
|
|
Dq => pDq,
|
|
Addr => pAddr,
|
|
Ba => pBa,
|
|
Clk => pClk,
|
|
Cke => pCke,
|
|
Cs_n => pCs_n,
|
|
Ras_n => pRas_n,
|
|
Cas_n => pCas_n,
|
|
We_n => pWe_n,
|
|
Dqm => pDqm
|
|
);
|
|
|
|
stimulator : PROCESS
|
|
PROCEDURE ACTIVE (Ba_in : STD_LOGIC_VECTOR (1 DOWNTO 0);
|
|
Addr_in : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
|
|
Dq_in : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0)) IS
|
|
BEGIN
|
|
pCke <= '1';
|
|
pCs_n <= '0';
|
|
pRas_n <= '0';
|
|
pCas_n <= '1';
|
|
pWe_n <= '1';
|
|
pDqm <= '0';
|
|
pBa <= Ba_in;
|
|
pAddr <= Addr_in;
|
|
pDq <= Dq_in;
|
|
WAIT FOR tCK;
|
|
END;
|
|
|
|
PROCEDURE AUTO_REFRESH IS
|
|
BEGIN
|
|
pCke <= '1';
|
|
pCs_n <= '0';
|
|
pRas_n <= '0';
|
|
pCas_n <= '0';
|
|
pWe_n <= '1';
|
|
pDqm <= '0';
|
|
--pBa <= "00";
|
|
--pAddr <= (OTHERS => '0');
|
|
pDq <= (OTHERS => 'Z');
|
|
WAIT FOR tCK;
|
|
END;
|
|
|
|
PROCEDURE BURST_TERM IS
|
|
BEGIN
|
|
pCke <= '1';
|
|
pCs_n <= '0';
|
|
pRas_n <= '1';
|
|
pCas_n <= '1';
|
|
pWe_n <= '0';
|
|
pDqm <= '0';
|
|
--pBa <= "00";
|
|
--pAddr <= (OTHERS => '0');
|
|
pDq <= (OTHERS => 'Z');
|
|
WAIT FOR tCK;
|
|
END;
|
|
|
|
PROCEDURE LOAD_MODE_REG (Ba_in : STD_LOGIC_VECTOR (1 DOWNTO 0);
|
|
Addr_in : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0)) IS
|
|
BEGIN
|
|
pCke <= '1';
|
|
pCs_n <= '0';
|
|
pRas_n <= '0';
|
|
pCas_n <= '0';
|
|
pWe_n <= '0';
|
|
pDqm <= '0';
|
|
pBa <= Ba_in;
|
|
pAddr <= Addr_in;
|
|
pDq <= (OTHERS => 'Z');
|
|
WAIT FOR tCK;
|
|
END;
|
|
|
|
PROCEDURE NOP (Dq_in : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0)) IS
|
|
BEGIN
|
|
pCke <= '1';
|
|
pCs_n <= '0';
|
|
pRas_n <= '1';
|
|
pCas_n <= '1';
|
|
pWe_n <= '1';
|
|
pDqm <= '0';
|
|
--pBa <= "00";
|
|
--pAddr <= (OTHERS => '0');
|
|
pDq <= Dq_in;
|
|
WAIT FOR tCK;
|
|
END;
|
|
|
|
PROCEDURE PRECHARGE (Ba_in : STD_LOGIC_VECTOR (1 DOWNTO 0);
|
|
Addr_in : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
|
|
Dq_in : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0)) IS
|
|
BEGIN
|
|
pCke <= '1';
|
|
pCs_n <= '0';
|
|
pRas_n <= '0';
|
|
pCas_n <= '1';
|
|
pWe_n <= '0';
|
|
pDqm <= '0';
|
|
pBa <= Ba_in;
|
|
pAddr <= Addr_in;
|
|
pDq <= Dq_in;
|
|
WAIT FOR tCK;
|
|
END;
|
|
|
|
PROCEDURE READ (Ba_in : STD_LOGIC_VECTOR (1 DOWNTO 0);
|
|
Addr_in : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
|
|
Dq_in : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0)) IS
|
|
BEGIN
|
|
pCke <= '1';
|
|
pCs_n <= '0';
|
|
pRas_n <= '1';
|
|
pCas_n <= '0';
|
|
pWe_n <= '1';
|
|
pDqm <= '0';
|
|
pBa <= Ba_in;
|
|
pAddr <= Addr_in;
|
|
pDq <= Dq_in;
|
|
WAIT FOR tCK;
|
|
END;
|
|
|
|
-- Write
|
|
PROCEDURE WRITE (Ba_in : STD_LOGIC_VECTOR (1 DOWNTO 0);
|
|
Addr_in : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
|
|
Dq_in : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0)) IS
|
|
BEGIN
|
|
pCke <= '1';
|
|
pCs_n <= '0';
|
|
pRas_n <= '1';
|
|
pCas_n <= '0';
|
|
pWe_n <= '0';
|
|
pDqm <= '0';
|
|
pBa <= Ba_in;
|
|
pAddr <= Addr_in;
|
|
pDq <= Dq_in;
|
|
WAIT FOR tCK;
|
|
END;
|
|
BEGIN
|
|
-- COMMAND BA ADDR DQ
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
-- We need 100 us power up sequence. I use 10 NOPs here as a required example.
|
|
PRECHARGE ("00", "010000000000", "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
AUTO_REFRESH;
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
AUTO_REFRESH;
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
LOAD_MODE_REG ("00", "000000100010");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
ACTIVE ("00", "000000000000", "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
ACTIVE ("01", "000000000000", "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
ACTIVE ("10", "000000000000", "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
ACTIVE ("11", "000000000000", "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
WRITE ("00", "000000000000", "00000000");
|
|
NOP ( "00000001");
|
|
NOP ( "00000010");
|
|
NOP ( "00000011");
|
|
|
|
WRITE ("01", "000000000000", "00000100");
|
|
NOP ( "00000101");
|
|
NOP ( "00000110");
|
|
NOP ( "00000111");
|
|
|
|
WRITE ("10", "000000000000", "00001000");
|
|
NOP ( "00001001");
|
|
NOP ( "00001010");
|
|
NOP ( "00001011");
|
|
|
|
WRITE ("11", "000000000000", "00001100");
|
|
NOP ( "00001101");
|
|
NOP ( "00001110");
|
|
NOP ( "00001111");
|
|
|
|
READ ("00", "000000000000", "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
READ ("01", "000000000000", "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
READ ("10", "000000000000", "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
READ ("11", "000000000000", "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
NOP ( "ZZZZZZZZ");
|
|
NOP ( "ZZZZZZZZ");
|
|
|
|
ASSERT false
|
|
REPORT "End of Stimulation Detected!"
|
|
SEVERITY note;
|
|
stim_done <= true;
|
|
WAIT;
|
|
END PROCESS;
|
|
|
|
clock : PROCESS
|
|
VARIABLE done_time : time;
|
|
BEGIN
|
|
pclk <= '0';
|
|
WAIT for tCK/2;
|
|
WHILE not stim_done loop
|
|
pclk <= '1';
|
|
WAIT for tCK/2;
|
|
pclk <= '0';
|
|
WAIT for tCK/2;
|
|
END LOOP;
|
|
done_time := now + tCK;
|
|
WHILE now < done_time LOOP -- one last clock to finish last command
|
|
pclk <= '1';
|
|
WAIT for tCK/2;
|
|
pclk <= '0';
|
|
WAIT for tCK/2;
|
|
END LOOP;
|
|
ASSERT false
|
|
REPORT "Suspending clock activity"
|
|
SEVERITY note;
|
|
clk_done <= true;
|
|
WAIT;
|
|
END PROCESS;
|
|
END test;
|