- added models

git-svn-id: http://moon:8086/svn/vhdl/trunk@1290 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
2015-06-10 19:27:35 +00:00
parent 8eb6b3ff9e
commit 2edaa4d7cb
217 changed files with 152127 additions and 0 deletions
@@ -0,0 +1,47 @@
# Micron Technology, Inc. (FILE DUMP / MEMORY DUMP)
# BA ROWS COLS DQ
# -- ------------- --------- ----------------
00 0000000000000 000000000 0000000001100100
00 0000000000000 000000001 0000000001100101
00 0000000000000 000000010 0000000001100110
00 0000000000000 000000011 0000000001100111
00 0000000000000 000000100 0000000001101000
00 0000000000000 000000101 0000000001101001
00 0000000000000 000000110 0000000001101010
00 0000000000000 000000111 0000000001101011
00 0000000000000 000001000 0011111111111110
00 0000000000000 000001001 0011111111111110
00 0000000000000 000001010 0011111111111110
01 0000000000000 000000000 0000000011001000
01 0000000000000 000000001 0000000011001001
01 0000000000000 000000010 0000000011001010
01 0000000000000 000000011 0000000011001011
01 0000000000000 000000100 0000000011001100
01 0000000000000 000000101 0000000011001101
01 0000000000000 000000110 0000000011001110
01 0000000000000 000000111 0000000011001111
01 0000000000000 000001000 0111111111111101
01 0000000000000 000001001 0111111111111101
01 0000000000000 000001010 0111111111111101
10 0000000000000 000000000 0000000100101100
10 0000000000000 000000001 0000000100101101
10 0000000000000 000000010 0000000100101110
10 0000000000000 000000011 0000000100101111
10 0000000000000 000000100 0000000100110000
10 0000000000000 000000101 0000000100110001
10 0000000000000 000000110 0000000100110010
10 0000000000000 000000111 0000000100110011
10 0000000000000 000001000 1011111111111011
10 0000000000000 000001001 1011111111111011
10 0000000000000 000001010 1011111111111011
11 0000000000000 000000000 0000000110010000
11 0000000000000 000000001 0000000110010001
11 0000000000000 000000010 0000000110010010
11 0000000000000 000000011 0000000110010011
11 0000000000000 000000100 0000000110010100
11 0000000000000 000000101 0000000110010101
11 0000000000000 000000110 0000000110010110
11 0000000000000 000000111 0000000110010111
11 0000000000000 000001000 1111111111110111
11 0000000000000 000001001 1111111111110111
11 0000000000000 000001010 1111111111110111
@@ -0,0 +1,349 @@
---------------------------------------------------------------------------------
--COMMAND FORMAT --
-- --
-- write(column address(integer), bank(bit_vector), first data(integer), dqm(bit), cke(bit));--
-- read(column address(integer), bank(bit_vector), dqm(bit), cke(bit)); --
-- active(row address(integer), bank(bit_vector), data bus (integer), dqm(bit), cke(bit));--
-- precharge(bank(bit_vector), address (integer), data bus(integer), dqm(bit), cke(bit)); --
-- nop(data bus(integer), dqm(bit), cke(bit), cs(bit)); --
-- burst_term(data bus(integer), dqm(bit_vector), cke(bit)); --
-- load_array('1'); --
-- load_mode_reg(register(integer), cke(bit)); --
-- next_cycle(clk); This is used after every command(incl. nop) to clock --
-- at the correct clock frequency entered in the clock --
-- period constant below --
-- unload_array(row_start(integer), row_end(integer), bank(bit_vector)) --
-- load_mode_reg(op_code(integer)) --
-- --
---------------------------------------------------------------------------------
LIBRARY work;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE std.textio.all;
USE work.generate_vectors.all;
ENTITY vector_generate IS
END vector_generate;
ARCHITECTURE vector_generate OF vector_generate IS
SIGNAL stim_done : BOOLEAN := FALSE;
SIGNAL clk : BIT := '0';
CONSTANT clk_start : time := 15 ns;
CONSTANT clk_period : time := 10 ns;
CONSTANT Z : INTEGER := -100;
BEGIN
PROCESS
BEGIN
WAIT UNTIL clk = '1' AND clk'EVENT;
--------------------ENTER COMMANDS BELOW THIS LINE-----------------------------
--******************DO NOT USE -100 FOR A DQ VALUE*************************----
--*******************Z WILL PLACE HI-Z ON THE BUS**************************----
--*******USE next_cycle(clk) FOR ADVANCING TO NEXT CLOCK CYCLE*************----
nop(Z, "00", '1', '1'); --Always begin with one nop when using Micron's testbench
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
load_array;
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
precharge("00", 1024, Z, "00", '1');
FOR i IN 1 to 2 LOOP
next_cycle(clk);
nop(Z, "00", '1', '1');
END LOOP;
next_cycle(clk);
auto_refresh;
FOR i IN 1 TO 8 LOOP
next_cycle(clk);
nop(Z, "00", '1', '1');
END LOOP;
next_cycle(clk);
auto_refresh;
FOR i IN 1 TO 8 LOOP
next_cycle(clk);
nop(Z, "00", '1', '1');
END LOOP;
next_cycle(clk);
load_mode_reg(51, '1'); -- 19 / 35 / 51 -> lat=3,bl=8,mode=seq
next_cycle(clk);
nop(Z, "00", '1', '1');
-- Write Section
next_cycle(clk);
active(0, "00", Z, "00", '1'); -- Activate Bank 0
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk); -- Write Bank 0
write(0, "00", 100, "00", '1');
next_cycle(clk);
nop(101, "00", '1', '1');
next_cycle(clk);
active(0, "01", 102, "00", '1'); -- Activate Bank 1
next_cycle(clk);
nop(103, "00", '1', '1');
next_cycle(clk);
nop(104, "00", '1', '1');
next_cycle(clk);
nop(105, "00", '1', '1');
next_cycle(clk);
nop(106, "00", '1', '1');
next_cycle(clk);
nop(107, "00", '1', '1');
next_cycle(clk);
write(0, "01", 200, "00", '1'); -- Write Bank 1
next_cycle(clk);
precharge("00", 0, 201, "00", '1'); -- Precharge Bank 0
next_cycle(clk);
active(0, "10", 202, "00", '1'); -- Activate Bank 2
next_cycle(clk);
nop(203, "00", '1', '1');
next_cycle(clk);
nop(204, "00", '1', '1');
next_cycle(clk);
nop(205, "00", '1', '1');
next_cycle(clk);
nop(206, "00", '1', '1');
next_cycle(clk);
nop(207, "00", '1', '1');
next_cycle(clk);
write(0, "10", 300, "00", '1'); -- Write Bank 2
next_cycle(clk);
precharge("01", 0, 301, "00", '1'); -- Precharge Bank 1
next_cycle(clk);
active(0, "11", 302, "00", '1'); -- Activate Bank 3
next_cycle(clk);
nop(303, "00", '1', '1');
next_cycle(clk);
nop(304, "00", '1', '1');
next_cycle(clk);
nop(305, "00", '1', '1');
next_cycle(clk);
nop(306, "00", '1', '1');
next_cycle(clk);
nop(307, "00", '1', '1');
next_cycle(clk);
write(0, "11", 400, "00", '1'); -- Write Bank 3
next_cycle(clk);
precharge("10", 0, 401, "00", '1'); -- Precharge Bank 2
next_cycle(clk);
active(0, "00", 402, "00", '1'); -- Activate Bank 0
next_cycle(clk);
nop(403, "00", '1', '1');
next_cycle(clk);
nop(404, "00", '1', '1');
next_cycle(clk);
nop(405, "00", '1', '1');
next_cycle(clk);
nop(406, "00", '1', '1');
next_cycle(clk);
nop(407, "00", '1', '1');
-- Read Section
next_cycle(clk);
read(0, "00", "00", '1'); -- Read Bank 0
next_cycle(clk);
precharge("11", 0, Z, "00", '1'); -- Precharge Bank 3
next_cycle(clk);
active(0, "01", Z, "00", '1'); -- Activate Bank 1
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
read(0, "01", "00", '1'); -- Read Bank 1
next_cycle(clk);
precharge("00", 0, Z, "00", '1'); -- Precharge Bank 0
next_cycle(clk);
active(0, "10", Z, "00", '1'); -- Activate Bank 2
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
read(0, "10", "00", '1'); -- Read Bank 2
next_cycle(clk);
precharge("01", 0, Z, "00", '1'); -- Precharge Bank 1
next_cycle(clk);
active(0, "11", Z, "00", '1'); -- Activate Bank 3
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
read(0, "11", "00", '1'); -- Read Bank 3
next_cycle(clk);
precharge("10", 0, Z, "00", '1'); -- Precharge Bank 2
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
precharge("11", 0, Z, "00", '1'); -- Precharge Bank 3
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
nop(Z, "00", '1', '1');
next_cycle(clk);
unload_array;
next_cycle(clk);
nop(Z, "00", '1', '1');
stim_done <= TRUE; --always include this line at the end of your stimulus
-------------------------------------------------------------------------------
--*************************************************************************----
END PROCESS;
clock:
PROCESS
VARIABLE done_time : time;
VARIABLE cycle_var : integer := 0;
BEGIN
cycle <= 0;
clk <= '0';
WAIT for clk_start;
WHILE not stim_done loop
clk <= '1';
cycle <= cycle_var;
WAIT for clk_period/2;
cycle_var := cycle_var + 1;
clk <= '0';
WAIT for clk_period/2;
END LOOP;
ASSERT (FALSE)
REPORT "Test Vectors Generated"
SEVERITY note;
WAIT;
END PROCESS;
END;
@@ -0,0 +1,50 @@
# Micron Technology, Inc. (FILE LOAD / MEMORY INITIALIZE)
# BA ROWS COLS DQ
# -- ------------- --------- ----------------
00 0000000000000 000000000 0011111111111110
00 0000000000000 000000001 0011111111111110
00 0000000000000 000000010 0011111111111110
00 0000000000000 000000011 0011111111111110
00 0000000000000 000000100 0011111111111110
00 0000000000000 000000101 0011111111111110
00 0000000000000 000000110 0011111111111110
00 0000000000000 000000111 0011111111111110
00 0000000000000 000001000 0011111111111110
00 0000000000000 000001001 0011111111111110
00 0000000000000 000001010 0011111111111110
01 0000000000000 000000000 0111111111111101
01 0000000000000 000000001 0111111111111101
01 0000000000000 000000010 0111111111111101
01 0000000000000 000000011 0111111111111101
01 0000000000000 000000100 0111111111111101
01 0000000000000 000000101 0111111111111101
01 0000000000000 000000110 0111111111111101
01 0000000000000 000000111 0111111111111101
01 0000000000000 000001000 0111111111111101
01 0000000000000 000001001 0111111111111101
01 0000000000000 000001010 0111111111111101
10 0000000000000 000000000 1011111111111011
10 0000000000000 000000001 1011111111111011
10 0000000000000 000000010 1011111111111011
10 0000000000000 000000011 1011111111111011
10 0000000000000 000000100 1011111111111011
10 0000000000000 000000101 1011111111111011
10 0000000000000 000000110 1011111111111011
10 0000000000000 000000111 1011111111111011
10 0000000000000 000001000 1011111111111011
10 0000000000000 000001001 1011111111111011
10 0000000000000 000001010 1011111111111011
11 0000000000000 000000000 1111111111110111
11 0000000000000 000000001 1111111111110111
11 0000000000000 000000010 1111111111110111
11 0000000000000 000000011 1111111111110111
11 0000000000000 000000100 1111111111110111
11 0000000000000 000000101 1111111111110111
11 0000000000000 000000110 1111111111110111
11 0000000000000 000000111 1111111111110111
11 0000000000000 000001000 1111111111110111
11 0000000000000 000001001 1111111111110111
11 0000000000000 000001010 1111111111110111
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,139 @@
--*****************************************************************************
--
-- Micron Semiconductor Products, Inc.
--
-- Copyright 1997, Micron Semiconductor Products, Inc.
-- All rights reserved.
--
--*****************************************************************************
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
PACKAGE mti_pkg IS
FUNCTION To_StdLogic (s : BIT) RETURN STD_LOGIC;
FUNCTION TO_INTEGER (input : STD_LOGIC) RETURN INTEGER;
FUNCTION TO_INTEGER (input : BIT_VECTOR) RETURN INTEGER;
FUNCTION TO_INTEGER (input : STD_LOGIC_VECTOR) RETURN INTEGER;
PROCEDURE TO_BITVECTOR (VARIABLE input : IN INTEGER; VARIABLE output : OUT BIT_VECTOR);
END mti_pkg;
PACKAGE BODY mti_pkg IS
-- Convert BIT to STD_LOGIC
FUNCTION To_StdLogic (s : BIT) RETURN STD_LOGIC IS
BEGIN
CASE s IS
WHEN '0' => RETURN ('0');
WHEN '1' => RETURN ('1');
WHEN OTHERS => RETURN ('0');
END CASE;
END;
-- Convert STD_LOGIC to INTEGER
FUNCTION TO_INTEGER (input : STD_LOGIC) RETURN INTEGER IS
VARIABLE result : INTEGER := 0;
VARIABLE weight : INTEGER := 1;
BEGIN
IF input = '1' THEN
result := weight;
ELSE
result := 0; -- if unknowns, default to logic 0
END IF;
RETURN result;
END TO_INTEGER;
-- Convert BIT_VECTOR to INTEGER
FUNCTION TO_INTEGER (input : BIT_VECTOR) RETURN INTEGER IS
VARIABLE result : INTEGER := 0;
VARIABLE weight : INTEGER := 1;
BEGIN
FOR i IN input'LOW TO input'HIGH LOOP
IF input(i) = '1' THEN
result := result + weight;
ELSE
result := result + 0; -- if unknowns, default to logic 0
END IF;
weight := weight * 2;
END LOOP;
RETURN result;
END TO_INTEGER;
-- Convert STD_LOGIC_VECTOR to INTEGER
FUNCTION TO_INTEGER (input : STD_LOGIC_VECTOR) RETURN INTEGER IS
VARIABLE result : INTEGER := 0;
VARIABLE weight : INTEGER := 1;
BEGIN
FOR i IN input'LOW TO input'HIGH LOOP
IF input(i) = '1' THEN
result := result + weight;
ELSE
result := result + 0; -- if unknowns, default to logic 0
END IF;
weight := weight * 2;
END LOOP;
RETURN result;
END TO_INTEGER;
-- Conver INTEGER to BIT_VECTOR
PROCEDURE TO_BITVECTOR (VARIABLE input : IN INTEGER; VARIABLE output : OUT BIT_VECTOR) IS
VARIABLE work,offset,outputlen,j : INTEGER := 0;
BEGIN
--length of vector
IF output'LENGTH > 32 THEN
outputlen := 32;
offset := output'LENGTH - 32;
IF input >= 0 THEN
FOR i IN offset-1 DOWNTO 0 LOOP
output(output'HIGH - i) := '0';
END LOOP;
ELSE
FOR i IN offset-1 DOWNTO 0 LOOP
output(output'HIGH - i) := '1';
END LOOP;
END IF;
ELSE
outputlen := output'LENGTH;
END IF;
--positive value
IF (input >= 0) THEN
work := input;
j := outputlen - 1;
FOR i IN 1 to 32 LOOP
IF j >= 0 then
IF (work MOD 2) = 0 THEN
output(output'HIGH-j-offset) := '0';
ELSE
output(output'HIGH-j-offset) := '1';
END IF;
END IF;
work := work / 2;
j := j - 1;
END LOOP;
IF outputlen = 32 THEN
output(output'HIGH) := '0';
END IF;
--negative value
ELSE
work := (-input) - 1;
j := outputlen - 1;
FOR i IN 1 TO 32 LOOP
IF j>= 0 THEN
IF (work MOD 2) = 0 THEN
output(output'HIGH-j-offset) := '1';
ELSE
output(output'HIGH-j-offset) := '0';
END IF;
END IF;
work := work / 2;
j := j - 1;
END LOOP;
IF outputlen = 32 THEN
output(output'HIGH) := '1';
END IF;
END IF;
END TO_BITVECTOR;
END mti_pkg;
@@ -0,0 +1,57 @@
# Macro for running Micron SDRAM VHDL model
#
# Compile Package Library (Require)
vcom mti_pkg.vhd
# Compile Micron Test Vector Generator (optional or use your own test)
vcom vec_gen.vhd
vcom ed_comnd.vhd
vsim vector_generate
run -all
# Compile Micron SDRAM
vcom mt48lc16m16a2.vhd
# Compile Micron Testbench (optional or use your own test bench)
vcom test.vhd
# Simulate Test
vsim tb
# Display waveform
onerror {resume}
add wave -logic /tb/u1/clk
add wave -logic /tb/u1/cke
add wave -logic /tb/u1/cs_n
add wave -logic /tb/u1/ras_n
add wave -logic /tb/u1/cas_n
add wave -logic /tb/u1/we_n
add wave -literal -decimal /tb/u1/addr
add wave -literal -unsigned /tb/u1/ba
add wave -literal -decimal /tb/u1/dq
add wave -literal /tb/u1/dqm
add wave -literal /tb/u1/operation
add wave -literal -decimal /tb/u1/mode_reg
add wave -logic /tb/u1/active_enable
add wave -logic /tb/u1/aref_enable
add wave -logic /tb/u1/burst_term
add wave -logic /tb/u1/mode_reg_enable
add wave -logic /tb/u1/prech_enable
add wave -logic /tb/u1/read_enable
add wave -logic /tb/u1/write_enable
add wave -logic /tb/u1/burst_length_1
add wave -logic /tb/u1/burst_length_2
add wave -logic /tb/u1/burst_length_4
add wave -logic /tb/u1/burst_length_8
add wave -logic /tb/u1/cas_latency_2
add wave -logic /tb/u1/cas_latency_3
add wave -literal /tb/u1/pre_chk
add wave -literal /tb/u1/act_chk
add wave -literal /tb/u1/bank_chk
add wave -literal -decimal /tb/u1/row_chk
add wave -literal -decimal /tb/u1/col_chk
add wave -logic /tb/u1/dq_in_chk
add wave -logic /tb/u1/dq_out_chk
# Run all test
run -all
@@ -0,0 +1,101 @@
0 ns 1 1 1 1 1 00 00 0 -100 0 0
22 ns 1 1 1 1 1 00 00 0 -100 0 0
32 ns 1 0 1 1 1 00 00 0 -100 1 0
42 ns 1 1 1 1 1 00 00 0 -100 0 0
52 ns 1 1 1 1 1 00 00 0 -100 0 0
62 ns 1 1 1 1 1 00 00 0 -100 0 0
72 ns 1 1 1 1 1 00 00 0 -100 0 0
82 ns 1 0 0 1 0 00 00 1024 -100 0 0
92 ns 1 1 1 1 1 00 00 0 -100 0 0
102 ns 1 1 1 1 1 00 00 0 -100 0 0
112 ns 1 0 0 0 1 00 00 0 -100 0 0
122 ns 1 1 1 1 1 00 00 0 -100 0 0
132 ns 1 1 1 1 1 00 00 0 -100 0 0
142 ns 1 1 1 1 1 00 00 0 -100 0 0
152 ns 1 1 1 1 1 00 00 0 -100 0 0
162 ns 1 1 1 1 1 00 00 0 -100 0 0
172 ns 1 1 1 1 1 00 00 0 -100 0 0
182 ns 1 1 1 1 1 00 00 0 -100 0 0
192 ns 1 1 1 1 1 00 00 0 -100 0 0
202 ns 1 0 0 0 1 00 00 0 -100 0 0
212 ns 1 1 1 1 1 00 00 0 -100 0 0
222 ns 1 1 1 1 1 00 00 0 -100 0 0
232 ns 1 1 1 1 1 00 00 0 -100 0 0
242 ns 1 1 1 1 1 00 00 0 -100 0 0
252 ns 1 1 1 1 1 00 00 0 -100 0 0
262 ns 1 1 1 1 1 00 00 0 -100 0 0
272 ns 1 1 1 1 1 00 00 0 -100 0 0
282 ns 1 1 1 1 1 00 00 0 -100 0 0
292 ns 1 0 0 0 0 00 00 51 -100 0 0
302 ns 1 1 1 1 1 00 00 0 -100 0 0
312 ns 1 0 0 1 1 00 00 0 -100 0 0
322 ns 1 1 1 1 1 00 00 0 -100 0 0
332 ns 1 0 1 0 0 00 00 0 100 0 0
342 ns 1 1 1 1 1 00 00 0 101 0 0
352 ns 1 0 0 1 1 00 01 0 102 0 0
362 ns 1 1 1 1 1 00 00 0 103 0 0
372 ns 1 1 1 1 1 00 00 0 104 0 0
382 ns 1 1 1 1 1 00 00 0 105 0 0
392 ns 1 1 1 1 1 00 00 0 106 0 0
402 ns 1 1 1 1 1 00 00 0 107 0 0
412 ns 1 0 1 0 0 00 01 0 200 0 0
422 ns 1 0 0 1 0 00 00 0 201 0 0
432 ns 1 0 0 1 1 00 10 0 202 0 0
442 ns 1 1 1 1 1 00 00 0 203 0 0
452 ns 1 1 1 1 1 00 00 0 204 0 0
462 ns 1 1 1 1 1 00 00 0 205 0 0
472 ns 1 1 1 1 1 00 00 0 206 0 0
482 ns 1 1 1 1 1 00 00 0 207 0 0
492 ns 1 0 1 0 0 00 10 0 300 0 0
502 ns 1 0 0 1 0 00 01 0 301 0 0
512 ns 1 0 0 1 1 00 11 0 302 0 0
522 ns 1 1 1 1 1 00 00 0 303 0 0
532 ns 1 1 1 1 1 00 00 0 304 0 0
542 ns 1 1 1 1 1 00 00 0 305 0 0
552 ns 1 1 1 1 1 00 00 0 306 0 0
562 ns 1 1 1 1 1 00 00 0 307 0 0
572 ns 1 0 1 0 0 00 11 0 400 0 0
582 ns 1 0 0 1 0 00 10 0 401 0 0
592 ns 1 0 0 1 1 00 00 0 402 0 0
602 ns 1 1 1 1 1 00 00 0 403 0 0
612 ns 1 1 1 1 1 00 00 0 404 0 0
622 ns 1 1 1 1 1 00 00 0 405 0 0
632 ns 1 1 1 1 1 00 00 0 406 0 0
642 ns 1 1 1 1 1 00 00 0 407 0 0
652 ns 1 0 1 0 1 00 00 0 -100 0 0
662 ns 1 0 0 1 0 00 11 0 -100 0 0
672 ns 1 0 0 1 1 00 01 0 -100 0 0
682 ns 1 1 1 1 1 00 00 0 -100 0 0
692 ns 1 1 1 1 1 00 00 0 -100 0 0
702 ns 1 1 1 1 1 00 00 0 -100 0 0
712 ns 1 1 1 1 1 00 00 0 -100 0 0
722 ns 1 1 1 1 1 00 00 0 -100 0 0
732 ns 1 0 1 0 1 00 01 0 -100 0 0
742 ns 1 0 0 1 0 00 00 0 -100 0 0
752 ns 1 0 0 1 1 00 10 0 -100 0 0
762 ns 1 1 1 1 1 00 00 0 -100 0 0
772 ns 1 1 1 1 1 00 00 0 -100 0 0
782 ns 1 1 1 1 1 00 00 0 -100 0 0
792 ns 1 1 1 1 1 00 00 0 -100 0 0
802 ns 1 1 1 1 1 00 00 0 -100 0 0
812 ns 1 0 1 0 1 00 10 0 -100 0 0
822 ns 1 0 0 1 0 00 01 0 -100 0 0
832 ns 1 0 0 1 1 00 11 0 -100 0 0
842 ns 1 1 1 1 1 00 00 0 -100 0 0
852 ns 1 1 1 1 1 00 00 0 -100 0 0
862 ns 1 1 1 1 1 00 00 0 -100 0 0
872 ns 1 1 1 1 1 00 00 0 -100 0 0
882 ns 1 1 1 1 1 00 00 0 -100 0 0
892 ns 1 0 1 0 1 00 11 0 -100 0 0
902 ns 1 0 0 1 0 00 10 0 -100 0 0
912 ns 1 1 1 1 1 00 00 0 -100 0 0
922 ns 1 1 1 1 1 00 00 0 -100 0 0
932 ns 1 1 1 1 1 00 00 0 -100 0 0
942 ns 1 1 1 1 1 00 00 0 -100 0 0
952 ns 1 1 1 1 1 00 00 0 -100 0 0
962 ns 1 1 1 1 1 00 00 0 -100 0 0
972 ns 1 0 0 1 0 00 11 0 -100 0 0
982 ns 1 1 1 1 1 00 00 0 -100 0 0
992 ns 1 1 1 1 1 00 00 0 -100 0 0
1002 ns 1 0 1 1 1 00 00 0 -100 0 1
1012 ns 1 1 1 1 1 00 00 0 -100 0 0
@@ -0,0 +1,164 @@
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
LIBRARY STD;
USE std.textio.ALL;
LIBRARY work;
USE work.mti_pkg.ALL;
ENTITY tb IS
END tb;
ARCHITECTURE test OF tb IS
CONSTANT addr_bits : INTEGER := 13;
CONSTANT data_bits : INTEGER := 16;
CONSTANT clk_start : time := 5 ns;
CONSTANT clk_period : time := 10 ns;
CONSTANT continue_time : time := 10 ns;
COMPONENT mt48lc16m16a2
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_VECTOR (1 DOWNTO 0) := (OTHERS => '0');
Load : IN STD_LOGIC := '0'; -- FOR LOADING MEMORY ARRAY
Dump : IN STD_LOGIC := '0' -- FOR DUMPING MEMORY ARRAY
);
END COMPONENT;
FOR ALL : mt48lc16m16a2 USE ENTITY work.mt48lc16m16a2 (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_VECTOR (1 DOWNTO 0);
SIGNAL pLoad : STD_LOGIC;
SIGNAL pDump : STD_LOGIC;
SIGNAL stim_done : boolean := false;
SIGNAL clk_done : boolean := false;
BEGIN
u1: mt48lc16m16a2
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,
Load => pLoad,
Dump => pDump
);
stimulator : PROCESS
FILE stim_file:text IS IN "test.txt";
VARIABLE l : line;
VARIABLE time_var : TIME;
VARIABLE pCke_var : bit;
VARIABLE pCs_var : bit;
VARIABLE pRas_var : bit;
VARIABLE PCas_var : bit;
VARIABLE pWe_var : bit;
VARIABLE pDqm_var : bit_vector (1 DOWNTO 0);
VARIABLE pBa_var : bit_vector (1 DOWNTO 0);
VARIABLE pAddr_var : INTEGER;
VARIABLE pDq_var : INTEGER; -- -100 is converted to hi-Z state
VARIABLE PLoad_var : bit;
VARIABLE pDump_var : bit;
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);
read(l, PLoad_var);
read(l, pDump_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;
pCke <= TO_StdLogic(pCke_var);
pCs <= TO_StdLogic(pCs_var);
pRas <= TO_StdLogic(pRas_var);
pCas <= TO_StdLogic(pCas_var);
pWe <= TO_StdLogic(pWe_var);
pDqm <= TO_StdLogicVector(pDqm_var);
pBa <= TO_StdLogicVector(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;
pLoad <= TO_StdLogic(PLoad_var);
pDump <= TO_StdLogic(pDump_var);
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;
@@ -0,0 +1,353 @@
-------------------------------------------------------------------------------
-- --
-- This is a data generator for the testbench for Micron's Synchronous --
-- DRAM. This generator reads a text file line-by-line and generates --
-- a file of test vectors that is then read by the testbench and --
-- applied to the part. --
-- --
-- This VHDL program creates a text file of test vectors that is used by the --
-- test bench. Place your commands in a file (a copy of VEC_GEN.VHD) and run --
-- VEC_GEN.VHD in your VHDL simulator (make sure you have compiled this --
-- package prior to running the program VEC_GEN.VHD). This will produce the --
-- vectors that are required to run the included testbench. Change the name --
-- of the vector file to save your vectors in separate files. The default --
-- file name for the output vectors generated from this pacakage is --
-- "test.txt." --
-- --
-- Now compile and run the testbench program embedtb.vhd. The testbench uses --
-- the default test.txt as input vectors. --
-- --
-- --
-- Copyright 1997 Micron Technology, Inc. --
-- --
-------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY STD;
USE std.textio.all;
PACKAGE generate_vectors IS
CONSTANT set_up : TIME;
CONSTANT hold : TIME;
CONSTANT cycle_start : TIME;
SIGNAL cycle : INTEGER := 0;
SIGNAL sim_time : TIME := 0 ns;
FILE output_file:TEXT IS OUT "test.txt";
PROCEDURE write(col_address : IN INTEGER; bank : IN BIT_VECTOR(1 DOWNTO 0);
first_data : IN INTEGER; dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT);
PROCEDURE read(col_address : IN INTEGER; bank : IN BIT_VECTOR(1 DOWNTO 0); dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT);
PROCEDURE active(row_address : IN INTEGER; bank : IN BIT_VECTOR(1 DOWNTO 0); data_bus : IN INTEGER; dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT);
PROCEDURE precharge(bank : IN BIT_VECTOR(1 DOWNTO 0); address : IN INTEGER; data_bus: IN INTEGER; dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT);
PROCEDURE nop(data_bus : IN INTEGER; dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT; cs : IN BIT);
PROCEDURE burst_term(data_bus : IN INTEGER; dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT);
PROCEDURE auto_refresh;
PROCEDURE next_cycle(SIGNAL clk : IN BIT);
PROCEDURE load_array;
PROCEDURE load_mode_reg(op_code : IN INTEGER; cke : IN BIT);
PROCEDURE unload_array;
END generate_vectors;
PACKAGE BODY generate_vectors IS
CONSTANT set_up : TIME := 3 ns;
CONSTANT hold : TIME := 1 ns;
CONSTANT cycle_start : TIME := 0 ns;
PROCEDURE write(col_address : IN INTEGER; bank : IN BIT_VECTOR(1 DOWNTO 0); first_data : IN INTEGER;
dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT) IS
VARIABLE l : LINE;
BEGIN
IF cycle = 0 THEN
write(l, cycle_start, left, 4, ns);
ELSE
write(l, now-set_up, left, 4, ns);
END IF;
write(l, Cke, right, 4); --Cke
write(l, 0, right, 4); --Cs
write(l, 1, right, 4); --Ras
write(l, 0, right, 4); --Cas
write(l, 0, right, 4); --We
write(l, dqm, right, 4); --Dqm
write(l, bank, right, 4); --Ba
write(l, col_address, right, 6); --address
write(l, first_data, right, 6); --first data location
write(l, 0, right, 4); --load
write(l, 0, right, 4); --unload
writeline(output_file,l); --write vector to file
END;
PROCEDURE read(col_address : IN INTEGER; bank : IN BIT_VECTOR(1 DOWNTO 0); dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT) IS
VARIABLE l : LINE;
BEGIN
IF cycle = 0 THEN
write(l, cycle_start, left, 4, ns);
ELSE
write(l, now-set_up, left, 4, ns);
END IF;
write(l, Cke, right, 4); --Cke
write(l, 0, right, 4); --Cs
write(l, 1, right, 4); --Ras
write(l, 0, right, 4); --Cas
write(l, 1, right, 4); --We
write(l, dqm, right, 4); --Dqm
write(l, bank, right, 4); --Ba
write(l, col_address, right, 6); --address
write(l, -100, right, 6); --first data location
write(l, 0, right, 4); --load
write(l, 0, right, 4); --unload
writeline(output_file,l); --write vector to file
END;
PROCEDURE active(row_address : IN INTEGER; bank : IN BIT_VECTOR(1 DOWNTO 0); data_bus : IN INTEGER; dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT) IS
VARIABLE l : LINE;
BEGIN
IF cycle = 0 THEN
write(l, cycle_start, left, 4, ns);
ELSE
write(l, now-set_up, left, 4, ns);
END IF;
write(l, Cke, right, 4); --Cke
write(l, 0, right, 4); --Cs
write(l, 0, right, 4); --Ras
write(l, 1, right, 4); --Cas
write(l, 1, right, 4); --We
write(l, dqm, right, 4); --Dqm
write(l, bank, right, 4); --Ba
write(l, row_address, right, 6); --address
write(l, data_bus, right, 6); --first data location
write(l, 0, right, 4); --load
write(l, 0, right, 4); --unload
writeline(output_file,l); --write vector to file
END;
PROCEDURE precharge(bank : IN BIT_VECTOR(1 DOWNTO 0); address : IN INTEGER; data_bus: IN INTEGER; dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT) IS
VARIABLE l : LINE;
BEGIN
IF cycle = 0 THEN
write(l, cycle_start, left, 4, ns);
ELSE
write(l, now-set_up, left, 4, ns);
END IF;
write(l, Cke, right, 4); --Cke
write(l, 0, right, 4); --Cs
write(l, 0, right, 4); --Ras
write(l, 1, right, 4); --Cas
write(l, 0, right, 4); --We
write(l, dqm, right, 4); --Dqm
write(l, bank, right, 4); --Ba
write(l, address, right, 6); --address
write(l, data_bus, right, 6); --first data location
write(l, 0, right, 4); --load
write(l, 0, right, 4); --unload
writeline(output_file,l); --write vector to file
END;
PROCEDURE nop(data_bus : IN INTEGER; dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT; cs : IN BIT) IS
VARIABLE l : LINE;
VARIABLE col_address : INTEGER := 0;
VARIABLE bank : BIT_VECTOR(1 DOWNTO 0) := "00";
BEGIN
IF cycle = 0 THEN
write(l, cycle_start, left, 4, ns);
ELSE
write(l, now-set_up, left, 4, ns);
END IF;
write(l, cke, right, 4); --Cke
write(l, cs, right, 4); --Cs
write(l, 1, right, 4); --Ras
write(l, 1, right, 4); --Cas
write(l, 1, right, 4); --We
write(l, dqm, right, 4); --Dqm
write(l, bank, right, 4); --Ba
write(l, col_address, right, 6); --address
write(l, data_bus, right, 6); --first data location
write(l, 0, right, 4); --load
write(l, 0, right, 4); --unload
writeline(output_file,l); --write vector to file
END;
PROCEDURE burst_term(data_bus : IN INTEGER; dqm : IN BIT_VECTOR(1 DOWNTO 0); cke : IN BIT) IS
VARIABLE l : LINE;
VARIABLE col_address : INTEGER := 0;
VARIABLE bank : BIT_VECTOR(1 DOWNTO 0) := "00";
BEGIN
IF cycle = 0 THEN
write(l, cycle_start, left, 4, ns);
ELSE
write(l, now-set_up, left, 4, ns);
END IF;
write(l, cke, right, 4); --Cke
write(l, 0, right, 4); --Cs
write(l, 1, right, 4); --Ras
write(l, 1, right, 4); --Cas
write(l, 0, right, 4); --We
write(l, dqm, right, 4); --Dqm
write(l, bank, right, 4); --Ba
write(l, col_address, right, 6); --address
write(l, data_bus, right, 6); --first data location
write(l, 0, right, 4); --load
write(l, 0, right, 4); --unload
writeline(output_file,l); --write vector to file
END;
PROCEDURE auto_refresh IS
VARIABLE l : LINE;
VARIABLE dqm : BIT_VECTOR(1 DOWNTO 0) := "00";
VARIABLE bank : BIT_VECTOR(1 DOWNTO 0) := "00";
BEGIN
IF cycle = 0 THEN
write(l, cycle_start, left, 4, ns);
ELSE
write(l, now-set_up, left, 4, ns);
END IF;
write(l, 1, right, 4); --Cke
write(l, 0, right, 4); --Cs
write(l, 0, right, 4); --Ras
write(l, 0, right, 4); --Cas
write(l, 1, right, 4); --We
write(l, dqm, right, 4); --Dqm
write(l, bank, right, 4); --Ba
write(l, 0, right, 6); --address
write(l, -100, right, 6); --first data location
write(l, 0, right, 4); --load
write(l, 0, right, 4); --unload
writeline(output_file,l); --write vector to file
END;
PROCEDURE next_cycle(SIGNAL clk : IN BIT) IS
BEGIN
WAIT UNTIL clk = '1';
END;
PROCEDURE load_array IS
VARIABLE l : LINE;
VARIABLE dqm : BIT_VECTOR(1 DOWNTO 0) := "00";
VARIABLE bank : BIT_VECTOR(1 DOWNTO 0) := "00";
BEGIN
IF cycle = 0 THEN
write(l, cycle_start, left, 4, ns);
ELSE
write(l, now-set_up, left, 4, ns);
END IF;
write(l, 1, right, 4); --Cke
write(l, 0, right, 4); --Cs
write(l, 1, right, 4); --Ras
write(l, 1, right, 4); --Cas
write(l, 1, right, 4); --We
write(l, dqm, right, 4); --Dqm
write(l, bank, right, 4); --Ba
write(l, 0, right, 6); --address
write(l, -100, right, 6); --first data location
write(l, 1, right, 4); --load
write(l, 0, right, 4); --unload
writeline(output_file,l); --write vector to file
END;
PROCEDURE unload_array IS
VARIABLE l : LINE;
VARIABLE dqm : BIT_VECTOR(1 DOWNTO 0) := "00";
VARIABLE bank : BIT_VECTOR(1 DOWNTO 0) := "00";
BEGIN
IF cycle = 0 THEN
write(l, cycle_start, left, 4, ns);
ELSE
write(l, now-set_up, left, 4, ns);
END IF;
write(l, 1, right, 4); --Cke
write(l, 0, right, 4); --Cs
write(l, 1, right, 4); --Ras
write(l, 1, right, 4); --Cas
write(l, 1, right, 4); --We
write(l, dqm, right, 4); --Dqm
write(l, bank, right, 4); --Ba
write(l, 0, right, 6); --address
write(l, -100, right, 6); --first data location
write(l, 0, right, 4); --load
write(l, 1, right, 4); --unload
writeline(output_file,l); --write vector to file
END;
PROCEDURE load_mode_reg(op_code : IN INTEGER; cke : IN BIT) IS
VARIABLE l : LINE;
VARIABLE dqm : BIT_VECTOR(1 DOWNTO 0) := "00";
VARIABLE bank : BIT_VECTOR(1 DOWNTO 0) := "00";
BEGIN
IF cycle = 0 THEN
write(l, cycle_start, left, 4, ns);
ELSE
write(l, now-set_up, left, 4, ns);
END IF;
write(l, cke, right, 4); --Cke
write(l, 0, right, 4); --Cs
write(l, 0, right, 4); --Ras
write(l, 0, right, 4); --Cas
write(l, 0, right, 4); --We
write(l, dqm, right, 4); --Dqm
write(l, bank, right, 4); --Ba
write(l, op_code, right, 6); --address
write(l, -100, right, 6); --first data location
write(l, 0, right, 4); --load
write(l, 0, right, 4); --unload
writeline(output_file,l); --write vector to file
END;
END generate_vectors;
@@ -0,0 +1,33 @@
onerror {resume}
add wave -logic /tb/u1/clk
add wave -logic /tb/u1/cke
add wave -logic /tb/u1/cs_n
add wave -logic /tb/u1/ras_n
add wave -logic /tb/u1/cas_n
add wave -logic /tb/u1/we_n
add wave -literal -decimal /tb/u1/addr
add wave -literal -unsigned /tb/u1/ba
add wave -literal -decimal /tb/u1/dq
add wave -literal /tb/u1/dqm
add wave -literal /tb/u1/operation
add wave -literal -decimal /tb/u1/mode_reg
add wave -logic /tb/u1/active_enable
add wave -logic /tb/u1/aref_enable
add wave -logic /tb/u1/burst_term
add wave -logic /tb/u1/mode_reg_enable
add wave -logic /tb/u1/prech_enable
add wave -logic /tb/u1/read_enable
add wave -logic /tb/u1/write_enable
add wave -logic /tb/u1/burst_length_1
add wave -logic /tb/u1/burst_length_2
add wave -logic /tb/u1/burst_length_4
add wave -logic /tb/u1/burst_length_8
add wave -logic /tb/u1/cas_latency_2
add wave -logic /tb/u1/cas_latency_3
add wave -literal /tb/u1/pre_chk
add wave -literal /tb/u1/act_chk
add wave -literal /tb/u1/bank_chk
add wave -literal -decimal /tb/u1/row_chk
add wave -literal -decimal /tb/u1/col_chk
add wave -logic /tb/u1/dq_in_chk
add wave -logic /tb/u1/dq_out_chk