- 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,5 @@
vcom util1164.vhd
vcom stdlogar.vhd
vcom io_utils.vhd
vcom mti_pkg.vhd
@@ -0,0 +1,370 @@
--------------------------------------------------------------------------------------------------
-- 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)); --
-- burst_term(data bus(integer), dqm(bit), 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 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, '0', '1'); --Always begin with one nop when using Micron's testbench
next_cycle(clk);
load_array;
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
precharge("00", 1024, Z, '0', '1');
FOR i IN 1 to 2 LOOP
next_cycle(clk);
nop(Z, '0', '1');
END LOOP;
next_cycle(clk);
auto_refresh;
FOR i IN 1 TO 8 LOOP
next_cycle(clk);
nop(Z, '0', '1');
END LOOP;
next_cycle(clk);
auto_refresh;
FOR i IN 1 TO 8 LOOP
next_cycle(clk);
nop(Z, '0', '1');
END LOOP;
next_cycle(clk);
load_mode_reg(49, '1'); -- 19 / 35 / 51 -> lat=3,bl=8,mode=seq
next_cycle(clk);
nop(Z, '0', '1');
-- Write Section
next_cycle(clk);
active(0, "00", Z, '0', '1'); -- Activate Bank 0
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
--write(0, "00", 10, '0', '1'); -- Write Bank 0
write(1024, "00", 10, '0', '1'); -- Write Bank 0 Auto Precharge
next_cycle(clk);
nop(11, '0', '1');
next_cycle(clk);
active(0, "01", 12, '0', '1'); -- Activate Bank 1
next_cycle(clk);
nop(13, '0', '1');
next_cycle(clk);
nop(14, '0', '1');
next_cycle(clk);
nop(15, '0', '1');
next_cycle(clk);
nop(16, '0', '1');
next_cycle(clk);
nop(17, '0', '1');
next_cycle(clk);
--write(0, "01", 20, '0', '1'); -- Write Bank 1
write(1024, "01", 20, '0', '1'); -- Write Bank 1 Auto Precharge
next_cycle(clk);
--precharge("00", 0, 21, '0', '1'); -- Precharge Bank 0
nop(21, '0', '1');
next_cycle(clk);
active(0, "10", 22, '0', '1'); -- Activate Bank 2
next_cycle(clk);
nop(23, '0', '1');
next_cycle(clk);
nop(24, '0', '1');
next_cycle(clk);
nop(25, '0', '1');
next_cycle(clk);
nop(26, '0', '1');
next_cycle(clk);
nop(27, '0', '1');
next_cycle(clk);
--write(0, "10", 30, '0', '1'); -- Write Bank 2
write(1024, "10", 30, '0', '1'); -- Write Bank 2 Auto Precharge
next_cycle(clk);
--precharge("01", 0, 31, '0', '1'); -- Precharge Bank 1
nop(31, '0', '1');
next_cycle(clk);
active(0, "11", 32, '0', '1'); -- Activate Bank 3
next_cycle(clk);
nop(33, '0', '1');
next_cycle(clk);
nop(34, '0', '1');
next_cycle(clk);
nop(35, '0', '1');
next_cycle(clk);
nop(36, '0', '1');
next_cycle(clk);
nop(37, '0', '1');
next_cycle(clk);
--write(0, "11", 40, '0', '1'); -- Write Bank 3
write(1024, "11", 40, '0', '1'); -- Write Bank 3 Auto Precharge
next_cycle(clk);
--precharge("10", 0, 41, '0', '1'); -- Precharge Bank 2
nop(41, '0', '1');
next_cycle(clk);
active(0, "00", 42, '0', '1'); -- Activate Bank 0
next_cycle(clk);
nop(43, '0', '1');
next_cycle(clk);
nop(44, '0', '1');
next_cycle(clk);
nop(45, '0', '1');
next_cycle(clk);
nop(46, '0', '1');
next_cycle(clk);
nop(47, '0', '1');
-- Read Section
next_cycle(clk);
--read(0, "00", '0', '1'); -- Read Bank 0
read(1024, "00", '0', '1'); -- Read Bank 0 Auto Precharge
next_cycle(clk);
--precharge("11", 0, Z, '0', '1'); -- Precharge Bank 3
nop(Z, '0', '1');
next_cycle(clk);
active(0, "01", Z, '0', '1'); -- Activate Bank 1
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
--read(0, "01", '0', '1'); -- Read Bank 1
read(1024, "01", '0', '1'); -- Read Bank 1 Auto Precharge
next_cycle(clk);
--precharge("00", 0, Z, '0', '1'); -- Precharge Bank 0
nop(Z, '0', '1');
next_cycle(clk);
active(0, "10", Z, '0', '1'); -- Activate Bank 2
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
--read(0, "10", '0', '1'); -- Read Bank 2
read(1024, "10", '0', '1'); -- Read Bank 2 Auto Precharge
next_cycle(clk);
--precharge("01", 0, Z, '0', '1'); -- Precharge Bank 1
nop(Z, '0', '1');
next_cycle(clk);
active(0, "11", Z, '0', '1'); -- Activate Bank 3
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
--read(0, "11", '0', '1'); -- Read Bank 3
read(1024, "11", '0', '1'); -- Read Bank 3 Auto Precharge
next_cycle(clk);
--precharge("10", 0, Z, '0', '1'); -- Precharge Bank 2
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
--precharge("11", 0, Z, '0', '1'); -- Precharge Bank 3
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
nop(Z, '0', '1');
next_cycle(clk);
unload_array(0, 1, "00"); -- Unload From Row 0-1, Bank 00
next_cycle(clk);
unload_array(0, 1, "01"); -- Unload From Row 0-1, Bank 10
next_cycle(clk);
unload_array(0, 1, "10"); -- Unload From Row 0-1, Bank 01
next_cycle(clk);
unload_array(0, 1, "11"); -- Unload From Row 0-1, Bank 11
next_cycle(clk);
nop(Z, '0', '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,266 @@
LIBRARY ieee;
USE std.textio.ALL;
USE ieee.std_logic_1164.ALL;
PACKAGE io_utils IS
PROCEDURE write_string(l : INOUT line;
value : IN string;
justified : IN side := right;
field : IN width := 0);
TYPE radix IS (binary, octal, decimal, hex);
-- read a number from the line
-- use this if you have hex numbers that are not in VHDL pound-sign format
PROCEDURE read(l : INOUT line; value : OUT integer; radix : IN positive);
-- read a number that might be in VHDL pound-sign format
PROCEDURE read_based(l : INOUT line; value : OUT integer);
PROCEDURE write(l : INOUT line;
value : IN std_logic_vector;
justified : IN side := right;
field : IN width := 0;
base : IN radix;
use_pound : boolean := false);
PROCEDURE write(l : INOUT line;
value : IN integer;
justified : IN side := right;
field : IN width := 0;
base : IN radix;
use_pound : boolean := false);
END io_utils;
PACKAGE BODY io_utils IS
PROCEDURE write_string(l : INOUT line;
value : IN string;
justified : IN side := right;
field : IN width := 0)
IS
BEGIN
write(l, value, justified, field);
END;
PROCEDURE shrink_line(l : INOUT line; pos : integer) IS
VARIABLE tmpl : line;
BEGIN
tmpl := l;
l := NEW string'(tmpl(pos TO tmpl'high));
deallocate(tmpl);
END;
PROCEDURE read(l : INOUT line;
value : OUT integer;
radix : IN positive)
IS
CONSTANT not_digit : integer := -999;
-- convert a character to a value from 0 to 15
FUNCTION digit_value(c : character) RETURN integer IS
BEGIN
IF (c >= '0') AND (c <= '9') THEN
RETURN (character'pos(c) - character'pos('0'));
ELSIF (c >= 'a') AND (c <= 'f') THEN
RETURN (character'pos(c) - character'pos('a') + 10);
ELSIF (c >= 'A') AND (c <= 'F') THEN
RETURN (character'pos(c) - character'pos('A') + 10);
ELSE
RETURN not_digit;
END IF;
END;
-- skip leading white space in the line
PROCEDURE skip_white(VARIABLE l : IN line; pos : OUT integer) IS
BEGIN
pos := l'low;
FOR i IN l'low TO l'high LOOP
CASE l(i) IS
WHEN ' ' | ht =>
pos := i + 1;
WHEN OTHERS =>
EXIT;
END CASE;
END LOOP;
END;
VARIABLE digit : integer;
VARIABLE result : integer := 0;
VARIABLE pos : integer;
BEGIN
-- skip white space
skip_white(l, pos);
-- calculate the value
FOR i IN pos TO l'right LOOP
digit := digit_value(l(i));
EXIT WHEN (digit = not_digit) OR (digit >= radix);
result := result * radix + digit;
pos := i + 1;
END LOOP;
value := result;
-- remove the "used" characters from the line
shrink_line(l, pos);
END;
PROCEDURE read_based(l : INOUT line; value : OUT integer) IS
VARIABLE digit : integer;
VARIABLE num : integer;
VARIABLE base : integer;
BEGIN
read(l, num, 10);
IF (l'length > 1) AND (l(l'left) = '#') THEN
shrink_line(l, l'left+1);
base := num;
read(l, num, base);
IF (l'length >= 1) AND (l(l'left) = '#') THEN
shrink_line(l, l'left+1);
END IF;
END IF;
value := num;
END;
PROCEDURE write(l : INOUT line;
value : IN std_logic_vector;
justified : IN side := right;
field : IN width := 0;
base : IN radix;
use_pound : boolean := false)
IS
FUNCTION to_int(bv : std_logic_vector) RETURN integer
IS
VARIABLE result : integer := 0;
BEGIN
FOR i IN bv'RANGE LOOP
result := result * 2;
IF (bv(i) = '1') THEN
result := result + 1;
END IF;
END LOOP;
RETURN result;
END;
TYPE array_of_widths IS ARRAY(radix) OF natural;
CONSTANT nibble_widths : array_of_widths := (
binary => 1,
octal => 3,
hex => 4,
decimal=> 32);
CONSTANT hex_digit : string(1 TO 16) := "0123456789ABCDEF";
ALIAS input_val : std_logic_vector(value'length DOWNTO 1) IS value;
CONSTANT nibble_width : natural := nibble_widths(base);
CONSTANT result_width : natural := (value'length + nibble_width - 1)/nibble_width;
VARIABLE result : string(1 TO result_width); -- longest possible value
VARIABLE result_pos : positive := 1;
VARIABLE nibble_val : integer;
VARIABLE bitcnt : integer;
BEGIN
IF base = decimal THEN
write(l, to_int(value), justified, field, base, use_pound);
RETURN;
END IF;
bitcnt := value'length MOD nibble_width;
IF (bitcnt = 0) THEN
bitcnt := nibble_width;
END IF;
FOR i IN input_val'RANGE LOOP
nibble_val := nibble_val * 2;
IF (input_val(i) = '1') THEN
nibble_val := nibble_val + 1;
END IF;
bitcnt := bitcnt - 1;
IF (bitcnt = 0) THEN
result(result_pos) := hex_digit(nibble_val + 1);
result_pos := result_pos + 1;
nibble_val := 0;
bitcnt := nibble_width;
END IF;
END LOOP;
write(l, result, justified, field);
END;
PROCEDURE write(l : INOUT line;
value : IN integer;
justified : IN side := right;
field : IN width := 0;
base : IN radix;
use_pound : boolean := false)
IS
FUNCTION to_bv(int : integer) RETURN std_logic_vector
IS
VARIABLE bv : std_logic_vector(32 DOWNTO 1) := (OTHERS => '0');
VARIABLE pos : integer := 0;
VARIABLE tmpval : integer := int;
BEGIN
FOR i IN 1 TO 32 LOOP
pos := pos + 1;
IF (tmpval MOD 2) = 1 THEN
bv(i) := '1';
END IF;
tmpval := tmpval / 2;
EXIT WHEN tmpval = 0;
END LOOP;
RETURN bv(pos DOWNTO 1);
END;
VARIABLE tmp : line;
BEGIN
IF (base = decimal) THEN
IF (use_pound) THEN
write_string(tmp, "10#");
END IF;
write(tmp, value);
IF (use_pound) THEN
write_string(tmp, "#");
END IF;
write(l, tmp.ALL, justified, field);
deallocate(tmp);
ELSE
write(l, to_bv(value), justified, field, base, use_pound);
END IF;
END;
END io_utils;
-- test the hex number reader
--ENTITY test IS END;
--USE std.textio.ALL;
--USE work.io_utils.ALL;
--ARCHITECTURE hex_test OF test IS
--BEGIN
-- PROCESS
-- VARIABLE val : integer;
-- FILE myfile : text IS IN "values";
-- VARIABLE inline : line;
-- VARIABLE outline : line;
-- BEGIN
-- WHILE NOT endfile(myfile) LOOP
-- readline(myfile, inline);
-- write(outline, inline.ALL);
--
-- read_based(inline, val);
-- write_string(outline, " binary: ");
-- write(outline, val, base => binary);
-- write_string(outline, " octal: ");
-- write(outline, val, base => octal);
-- write_string(outline, " decimal: ");
-- write(outline, val, base => decimal);
-- write_string(outline, " hex: ");
-- write(outline, val, base => hex);
-- writeline(output, outline);
-- END LOOP;
-- WAIT;
-- END PROCESS;
--END;
@@ -0,0 +1,41 @@
0 0 00 0 -- ROW (HEX), COL (HEX), BANK (BIN), DATA (HEX)
0 1 00 1
0 2 00 2
0 3 00 3
0 4 00 4
0 5 00 5
0 6 00 6
0 7 00 7
0 8 00 8
0 9 00 9
0 0 01 10
0 1 01 11
0 2 01 12
0 3 01 13
0 4 01 14
0 5 01 15
0 6 01 16
0 7 01 17
0 8 01 18
0 9 01 19
0 0 10 20
0 1 10 21
0 2 10 22
0 3 10 23
0 4 10 24
0 5 10 25
0 6 10 26
0 7 10 27
0 8 10 28
0 9 10 29
0 0 11 30
0 1 11 31
0 2 11 32
0 3 11 33
0 4 11 34
0 5 11 35
0 6 11 36
0 7 11 37
0 8 11 38
0 9 11 39
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,129 @@
--*****************************************************************************
--
-- Micron Semiconductor Products, Inc.
--
-- Copyright 1997, Micron Semiconductor Products, Inc.
-- All rights reserved.
--
--*****************************************************************************
LIBRARY work;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
PACKAGE mti_pkg IS
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 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,35 @@
Micron Technology Inc. - Unload Data Array - Bank 0 Row 0
0 : 0 : 0A 0B 02 03 04 05 06 07 08 09 00 00 00 00 00 00
0 : 10 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 20 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 30 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 40 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 50 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 60 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 70 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 80 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 90 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : A0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 100 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 110 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 120 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 130 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 140 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 150 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 160 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 170 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 180 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 190 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1A0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Micron Technology Inc. - Unload Data Array - Bank 0 Row 1
1 : 0 : Row 1 is empty.
@@ -0,0 +1,35 @@
Micron Technology Inc. - Unload Data Array - Bank 1 Row 0
0 : 0 : 14 15 12 13 14 15 16 17 18 19 00 00 00 00 00 00
0 : 10 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 20 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 30 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 40 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 50 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 60 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 70 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 80 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 90 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : A0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 100 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 110 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 120 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 130 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 140 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 150 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 160 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 170 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 180 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 190 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1A0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Micron Technology Inc. - Unload Data Array - Bank 1 Row 1
1 : 0 : Row 1 is empty.
@@ -0,0 +1,35 @@
Micron Technology Inc. - Unload Data Array - Bank 2 Row 0
0 : 0 : 1E 1F 22 23 24 25 26 27 28 29 00 00 00 00 00 00
0 : 10 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 20 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 30 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 40 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 50 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 60 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 70 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 80 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 90 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : A0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 100 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 110 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 120 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 130 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 140 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 150 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 160 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 170 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 180 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 190 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1A0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Micron Technology Inc. - Unload Data Array - Bank 2 Row 1
1 : 0 : Row 1 is empty.
@@ -0,0 +1,35 @@
Micron Technology Inc. - Unload Data Array - Bank 3 Row 0
0 : 0 : 28 29 32 33 34 35 36 37 38 39 00 00 00 00 00 00
0 : 10 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 20 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 30 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 40 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 50 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 60 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 70 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 80 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 90 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : A0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 100 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 110 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 120 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 130 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 140 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 150 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 160 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 170 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 180 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 190 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1A0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0 : 1F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Micron Technology Inc. - Unload Data Array - Bank 3 Row 1
1 : 0 : Row 1 is empty.
@@ -0,0 +1,14 @@
To operate the test bench for the Micron SDRAM VHDL model, follow the directions
given below:
1. Be sure all supporting files for the SDRAM are compiled into your library:
util1164.vhd
stdlogar.vhd
io_utils.vhd
mti_pkg.vhd
2. Next, compile the mt48lc8m8a2.vhd file and the test.vhd file.
3. Simulate the "tb" architecture. This is the testbench for the 64Mb SDRAM.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,5 @@
vcom mt48lc8m8a2.vhd
vcom test.vhd
vsim tb
do wave.do
run -all
@@ -0,0 +1,103 @@
0 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
22 ns 1 0 1 1 1 0 00 0 -100 1 0 0 0
32 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
42 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
52 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
62 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
72 ns 1 0 0 1 0 0 00 1024 -100 0 0 0 0
82 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
92 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
102 ns 1 0 0 0 1 0 00 0 -100 0 0 0 0
112 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
122 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
132 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
142 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
152 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
162 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
172 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
182 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
192 ns 1 0 0 0 1 0 00 0 -100 0 0 0 0
202 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
212 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
222 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
232 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
242 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
252 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
262 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
272 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
282 ns 1 0 0 0 0 0 00 49 -100 0 0 0 0
292 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
302 ns 1 0 0 1 1 0 00 0 -100 0 0 0 0
312 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
322 ns 1 0 1 0 0 0 00 1024 10 0 0 0 0
332 ns 1 0 1 1 1 0 00 0 11 0 0 0 0
342 ns 1 0 0 1 1 0 01 0 12 0 0 0 0
352 ns 1 0 1 1 1 0 00 0 13 0 0 0 0
362 ns 1 0 1 1 1 0 00 0 14 0 0 0 0
372 ns 1 0 1 1 1 0 00 0 15 0 0 0 0
382 ns 1 0 1 1 1 0 00 0 16 0 0 0 0
392 ns 1 0 1 1 1 0 00 0 17 0 0 0 0
402 ns 1 0 1 0 0 0 01 1024 20 0 0 0 0
412 ns 1 0 1 1 1 0 00 0 21 0 0 0 0
422 ns 1 0 0 1 1 0 10 0 22 0 0 0 0
432 ns 1 0 1 1 1 0 00 0 23 0 0 0 0
442 ns 1 0 1 1 1 0 00 0 24 0 0 0 0
452 ns 1 0 1 1 1 0 00 0 25 0 0 0 0
462 ns 1 0 1 1 1 0 00 0 26 0 0 0 0
472 ns 1 0 1 1 1 0 00 0 27 0 0 0 0
482 ns 1 0 1 0 0 0 10 1024 30 0 0 0 0
492 ns 1 0 1 1 1 0 00 0 31 0 0 0 0
502 ns 1 0 0 1 1 0 11 0 32 0 0 0 0
512 ns 1 0 1 1 1 0 00 0 33 0 0 0 0
522 ns 1 0 1 1 1 0 00 0 34 0 0 0 0
532 ns 1 0 1 1 1 0 00 0 35 0 0 0 0
542 ns 1 0 1 1 1 0 00 0 36 0 0 0 0
552 ns 1 0 1 1 1 0 00 0 37 0 0 0 0
562 ns 1 0 1 0 0 0 11 1024 40 0 0 0 0
572 ns 1 0 1 1 1 0 00 0 41 0 0 0 0
582 ns 1 0 0 1 1 0 00 0 42 0 0 0 0
592 ns 1 0 1 1 1 0 00 0 43 0 0 0 0
602 ns 1 0 1 1 1 0 00 0 44 0 0 0 0
612 ns 1 0 1 1 1 0 00 0 45 0 0 0 0
622 ns 1 0 1 1 1 0 00 0 46 0 0 0 0
632 ns 1 0 1 1 1 0 00 0 47 0 0 0 0
642 ns 1 0 1 0 1 0 00 1024 -100 0 0 0 0
652 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
662 ns 1 0 0 1 1 0 01 0 -100 0 0 0 0
672 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
682 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
692 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
702 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
712 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
722 ns 1 0 1 0 1 0 01 1024 -100 0 0 0 0
732 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
742 ns 1 0 0 1 1 0 10 0 -100 0 0 0 0
752 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
762 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
772 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
782 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
792 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
802 ns 1 0 1 0 1 0 10 1024 -100 0 0 0 0
812 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
822 ns 1 0 0 1 1 0 11 0 -100 0 0 0 0
832 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
842 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
852 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
862 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
872 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
882 ns 1 0 1 0 1 0 11 1024 -100 0 0 0 0
892 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
902 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
912 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
922 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
932 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
942 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
952 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
962 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
972 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
982 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
992 ns 1 0 1 1 1 0 00 0 -100 0 1 0 1
1002 ns 1 0 1 1 1 0 01 0 -100 0 1 0 1
1012 ns 1 0 1 1 1 0 10 0 -100 0 1 0 1
1022 ns 1 0 1 1 1 0 11 0 -100 0 1 0 1
1032 ns 1 0 1 1 1 0 00 0 -100 0 0 0 0
@@ -0,0 +1,196 @@
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 := 8;
CONSTANT clk_start : time := 5 ns;
CONSTANT clk_period : time := 10 ns;
CONSTANT continue_time : time := 10 ns;
COMPONENT mt48lc8m8a2
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';
Load : IN STD_LOGIC := '0';
Unload : IN STD_LOGIC := '0';
Row_start : IN INTEGER := 0;
Row_end : IN INTEGER := 0
);
END COMPONENT;
FOR ALL : mt48lc8m8a2 USE ENTITY work.mt48lc8m8a2 (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 PLoad : STD_LOGIC;
SIGNAL PUnload : STD_LOGIC;
SIGNAL PRow_start : INTEGER;
SIGNAL PRow_end : INTEGER;
SIGNAL stim_done : boolean := false;
SIGNAL clk_done : boolean := false;
BEGIN
u1: mt48lc8m8a2
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,
Unload => pUnload,
Row_start => PRow_start,
Row_end => PRow_end
);
stimulator : PROCESS
FILE stim_file:text IS IN "test.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 pLoad_var : STD_LOGIC;
VARIABLE pUnload_var : STD_LOGIC;
VARIABLE pRow_start_var : INTEGER;
VARIABLE pRow_end_var : INTEGER;
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, pUnload_var);
read (l, pRow_start_var);
read (l, pRow_end_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;
pLoad <= pLoad_var;
pUnload <= pUnload_var;
pRow_start <= pRow_start_var;
pRow_end <= pRow_end_var;
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;
pLoad <= pLoad_var;
pUnload <= pUnload_var;
pRow_start <= pRow_start_var;
pRow_end <= pRow_end_var;
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;
@@ -0,0 +1,124 @@
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE STD.textio.ALL;
PACKAGE util_1164 IS
PROCEDURE read(l: INOUT line; value: OUT std_logic);
PROCEDURE read(l: INOUT line; value: OUT std_logic_vector);
PROCEDURE write(l: INOUT line; value: IN std_logic_vector;
JUSTIFIED: IN SIDE := right;
FIELD: IN WIDTH := 0);
PROCEDURE Grow_line(L : inout LINE; incr : in integer);
END util_1164;
PACKAGE BODY util_1164 IS
FUNCTION white_space(value:character) RETURN boolean IS
VARIABLE result:boolean;
BEGIN
IF (value = ' ') OR (value = HT) THEN
RETURN true;
ELSE
RETURN false;
END IF;
END white_space;
PROCEDURE read(l: INOUT line; value: OUT std_logic) IS
VARIABLE char_var: character:= ' ';
BEGIN
WHILE l'LENGTH > 0 LOOP
read(l,char_var);
IF NOT white_space(char_var) THEN
EXIT;
END IF;
END LOOP;
IF white_space(char_var) THEN
ASSERT false REPORT "No std_logic value found in file"
SEVERITY error;
value := 'X';
RETURN;
END IF;
CASE char_var IS
WHEN 'U'|'u' => value := 'U';
WHEN '0' => value := '0';
WHEN '1' => value := '1';
WHEN 'X'|'x' => value := 'X';
WHEN 'L'|'l' => value := 'L';
WHEN 'H'|'h' => value := 'H';
WHEN 'W'|'w' => value := 'W';
WHEN 'Z'|'z' => value := 'Z';
WHEN '-' => value := '-';
WHEN OTHERS =>
ASSERT false REPORT "Unrecognized value read for std_logic"
SEVERITY error;
value := 'X';
END CASE;
END read;
PROCEDURE read(l: INOUT line; value: OUT std_logic_vector) IS
BEGIN
FOR i IN value'HIGH DOWNTO value'LOW LOOP
IF l'LENGTH > 0 THEN
read(l,value(i));
ELSE
ASSERT false REPORT "Not enough values for std_logic_vector in file"
SEVERITY error;
RETURN;
END IF;
END LOOP;
END read;
procedure Grow_line(L : inout LINE; incr : in integer)
is
variable old_L : LINE := L;
variable bfp: integer; -- Blank fill pointer.
begin
assert incr > 0
report "Textio: Grow_line called with zero increment."
severity error;
if L = null then
bfp := 0;
L := new string(1 to incr);
else
bfp := old_L'high;
L := new string(old_L'low to old_L'high + incr);
L(old_L'low to old_L'high) := old_L.all;
Deallocate(old_L);
end if;
for i in 1 to incr loop
L(bfp + i) := ' ';
end loop;
end;
PROCEDURE write(l: INOUT line; value: IN std_logic_vector;
JUSTIFIED: IN SIDE := right;
FIELD: IN WIDTH := 0) IS
variable fw: integer := VALUE'length;
variable bp: integer;
variable offset: integer := 0;
alias normal : std_logic_vector(0 to value'length - 1) is value;
begin
if L /= null then
bp := L'high + 1;
else bp := 1;
end if;
if FIELD > VALUE'length then
fw := FIELD;
if JUSTIFIED = right then
offset := fw - VALUE'length;
end if;
end if;
Grow_line(L, fw);
for i in normal'range loop
L(bp + i + offset) := character'val(
std_logic'pos(normal(i)) + character'pos('0'));
end loop;
end;
END util_1164;
@@ -0,0 +1,319 @@
-------------------------------------------------------------------------------
-- --
-- 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;
USE std.textio.all;
USE work.io_utils.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; cke : IN BIT);
PROCEDURE read (col_address : IN INTEGER; bank : IN BIT_VECTOR(1 DOWNTO 0); dqm : IN BIT; cke : IN BIT);
PROCEDURE active (row_address : IN INTEGER; bank : IN BIT_VECTOR(1 DOWNTO 0); data_bus : IN INTEGER; dqm : IN BIT; cke : IN BIT);
PROCEDURE precharge (bank : IN BIT_VECTOR(1 DOWNTO 0); address : IN INTEGER; data_bus: IN INTEGER; dqm : IN BIT; cke : IN BIT);
PROCEDURE nop (data_bus : IN INTEGER; dqm : IN BIT; cke : IN BIT);
PROCEDURE burst_term (data_bus : IN INTEGER; dqm : IN BIT; 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(row_start : IN INTEGER; row_end : IN INTEGER; bank : IN BIT_VECTOR(1 DOWNTO 0));
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; 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
write(l, 0, right, 6); --row_address_start
write(l, 0, right, 6); --row_address_end
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; 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
write(l, 0, right, 6); --row_address_start
write(l, 0, right, 6); --row_address_end
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; 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
write(l, 0, right, 6); --row_address_start
write(l, 0, right, 6); --row_address_end
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; 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
write(l, 0, right, 6); --row_address_start
write(l, 0, right, 6); --row_address_end
writeline(output_file,l); --write vector to file
END;
PROCEDURE nop(data_bus : IN INTEGER; dqm : IN BIT; 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, 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
write(l, 0, right, 6); --row_address_start
write(l, 0, right, 6); --row_address_end
writeline(output_file,l); --write vector to file
END;
PROCEDURE burst_term(data_bus : IN INTEGER; dqm : IN BIT; 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
write(l, 0, right, 6); --row_address_start
write(l, 0, right, 6); --row_address_end
writeline(output_file,l); --write vector to file
END;
PROCEDURE auto_refresh IS
VARIABLE l : LINE;
VARIABLE dqm : BIT := '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, 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
write(l, 0, right, 6); --row_address_start
write(l, 0, right, 6); --row_address_end
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 := '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, 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
write(l, 0, right, 6); --row_address_start
write(l, 0, right, 6); --row_address_end
writeline(output_file,l); --write vector to file
END;
PROCEDURE unload_array(row_start : IN INTEGER; row_end : IN INTEGER; bank : IN BIT_VECTOR(1 DOWNTO 0)) IS
VARIABLE l : LINE;
VARIABLE dqm : BIT := '0';
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
write(l, row_start, right, 6); --row_address_start
write(l, row_end, right, 6); --row_address_end
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 := '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, 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
write(l, 0, right, 6); --row_address_start
write(l, 0, right, 6); --row_address_end
writeline(output_file,l); --write vector to file
END;
END generate_vectors;
@@ -0,0 +1,4 @@
vcom vec_gen.vhd
vcom ed_comnd.vhd
vsim vector_generate
run -all
@@ -0,0 +1,31 @@
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 -logic /tb/u1/dqm
add wave -literal -decimal /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 -binary /tb/u1/pre_chk
add wave -literal -binary /tb/u1/act_chk
add wave -literal -unsigned /tb/u1/bank_chk
add wave -literal -decimal /tb/u1/row_chk
add wave -literal -decimal /tb/u1/col_chk