- 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,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('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("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(0, 0, "00");
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,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,40 @@
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,33 @@
Micron Technology Inc. - Unload Data Array - Bank 0 Row 0
0 : 0 : 0064 0065 0066 0067 0068 0069 006A 006B 0074 0075 006E 006F 0070 0071 0072 0073
0 : 10 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 20 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 30 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 40 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 50 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 60 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 70 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 80 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 90 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : A0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : B0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : C0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : D0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : E0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : F0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 100 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 110 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 120 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 130 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 140 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 150 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 160 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 170 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 180 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 190 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 1A0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 1B0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 1C0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 1D0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 1E0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 : 1F0 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
@@ -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 mt48lc8m16a2.vhd file and the test.vhd file.
3. Simulate the "tb" architecture. This is the testbench for the 128Mb SDRAM.
@@ -0,0 +1,49 @@
# Compile base libraries
vcom util1164.vhd
vcom stdlogar.vhd
vcom io_utils.vhd
vcom mti_pkg.vhd
# Compile test vectors
vcom vec_gen.vhd
vcom ed_comnd.vhd
vsim vector_generate
run -all
# Compile Micron SDRAM model and testbench
vcom mt48lc8m16a2.vhd
vcom test.vhd
vsim -t ps tb
# Add waveform
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 vectors
run -all
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,5 @@
vcom mt48lc8m16a2.vhd
vcom test.vhd
vsim tb
do wave.do
run -all
@@ -0,0 +1,115 @@
0 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
22 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
32 ns 1 0 1 1 1 00 00 0 -100 1 0 0 0
42 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
52 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
62 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
72 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
82 ns 1 0 0 1 0 00 00 1024 -100 0 0 0 0
92 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
102 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
112 ns 1 0 0 0 1 00 00 0 -100 0 0 0 0
122 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
132 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
142 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
152 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
162 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
172 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
182 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
192 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
202 ns 1 0 0 0 1 00 00 0 -100 0 0 0 0
212 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
222 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
232 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
242 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
252 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
262 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
272 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
282 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
292 ns 1 0 0 0 0 00 00 51 -100 0 0 0 0
302 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
312 ns 1 0 0 1 1 00 00 0 -100 0 0 0 0
322 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
332 ns 1 0 1 0 0 00 00 0 100 0 0 0 0
342 ns 1 1 1 1 1 00 00 0 101 0 0 0 0
352 ns 1 0 0 1 1 00 01 0 102 0 0 0 0
362 ns 1 1 1 1 1 00 00 0 103 0 0 0 0
372 ns 1 1 1 1 1 00 00 0 104 0 0 0 0
382 ns 1 1 1 1 1 00 00 0 105 0 0 0 0
392 ns 1 1 1 1 1 00 00 0 106 0 0 0 0
402 ns 1 1 1 1 1 00 00 0 107 0 0 0 0
412 ns 1 0 1 0 0 00 01 0 200 0 0 0 0
422 ns 1 0 0 1 0 00 00 0 201 0 0 0 0
432 ns 1 0 0 1 1 00 10 0 202 0 0 0 0
442 ns 1 1 1 1 1 00 00 0 203 0 0 0 0
452 ns 1 1 1 1 1 00 00 0 204 0 0 0 0
462 ns 1 1 1 1 1 00 00 0 205 0 0 0 0
472 ns 1 1 1 1 1 00 00 0 206 0 0 0 0
482 ns 1 1 1 1 1 00 00 0 207 0 0 0 0
492 ns 1 0 1 0 0 00 10 0 300 0 0 0 0
502 ns 1 0 0 1 0 00 01 0 301 0 0 0 0
512 ns 1 0 0 1 1 00 11 0 302 0 0 0 0
522 ns 1 1 1 1 1 00 00 0 303 0 0 0 0
532 ns 1 1 1 1 1 00 00 0 304 0 0 0 0
542 ns 1 1 1 1 1 00 00 0 305 0 0 0 0
552 ns 1 1 1 1 1 00 00 0 306 0 0 0 0
562 ns 1 1 1 1 1 00 00 0 307 0 0 0 0
572 ns 1 0 1 0 0 00 11 0 400 0 0 0 0
582 ns 1 0 0 1 0 00 10 0 401 0 0 0 0
592 ns 1 0 0 1 1 00 00 0 402 0 0 0 0
602 ns 1 1 1 1 1 00 00 0 403 0 0 0 0
612 ns 1 1 1 1 1 00 00 0 404 0 0 0 0
622 ns 1 1 1 1 1 00 00 0 405 0 0 0 0
632 ns 1 1 1 1 1 00 00 0 406 0 0 0 0
642 ns 1 1 1 1 1 00 00 0 407 0 0 0 0
652 ns 1 0 1 0 1 00 00 0 -100 0 0 0 0
662 ns 1 0 0 1 0 00 11 0 -100 0 0 0 0
672 ns 1 0 0 1 1 00 01 0 -100 0 0 0 0
682 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
692 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
702 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
712 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
722 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
732 ns 1 0 1 0 1 00 01 0 -100 0 0 0 0
742 ns 1 0 0 1 0 00 00 0 -100 0 0 0 0
752 ns 1 0 0 1 1 00 10 0 -100 0 0 0 0
762 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
772 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
782 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
792 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
802 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
812 ns 1 0 1 0 1 00 10 0 -100 0 0 0 0
822 ns 1 0 0 1 0 00 01 0 -100 0 0 0 0
832 ns 1 0 0 1 1 00 11 0 -100 0 0 0 0
842 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
852 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
862 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
872 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
882 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
892 ns 1 0 1 0 1 00 11 0 -100 0 0 0 0
902 ns 1 0 0 1 0 00 10 0 -100 0 0 0 0
912 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
922 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
932 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
942 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
952 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
962 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
972 ns 1 0 0 1 0 00 11 0 -100 0 0 0 0
982 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
992 ns 1 0 0 1 1 00 00 0 -100 0 0 0 0
1002 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
1012 ns 1 0 1 0 0 00 00 1034 110 0 0 0 0
1022 ns 1 1 1 1 1 00 00 0 111 0 0 0 0
1032 ns 1 1 1 1 1 00 00 0 112 0 0 0 0
1042 ns 1 1 1 1 1 00 00 0 113 0 0 0 0
1052 ns 1 1 1 1 1 00 00 0 114 0 0 0 0
1062 ns 1 1 1 1 1 00 00 0 115 0 0 0 0
1072 ns 1 1 1 1 1 00 00 0 116 0 0 0 0
1082 ns 1 1 1 1 1 00 00 0 117 0 0 0 0
1092 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
1102 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
1112 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
1122 ns 1 0 0 1 1 00 00 0 -100 0 0 0 0
1132 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
1142 ns 1 0 1 1 1 00 00 0 -100 0 1 0 0
1152 ns 1 1 1 1 1 00 00 0 -100 0 0 0 0
@@ -0,0 +1,197 @@
LIBRARY ieee;
LIBRARY work;
USE ieee.std_logic_1164.ALL;
USE work.std_logic_arith.ALL;
USE work.util_1164.ALL;
USE std.textio.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 := 16;
CONSTANT clk_start : time := 5 ns;
CONSTANT clk_period : time := 10 ns;
CONSTANT continue_time : time := 10 ns;
COMPONENT mt48lc8m16a2
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';
Unload : IN STD_LOGIC := '0';
Row_start : IN INTEGER := 0;
Row_end : IN INTEGER := 0
);
END COMPONENT;
FOR ALL : mt48lc8m16a2 USE ENTITY work.mt48lc8m16a2 (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 PUnload : STD_LOGIC;
SIGNAL PRow_start : INTEGER;
SIGNAL PRow_end : INTEGER;
SIGNAL stim_done : boolean := false;
SIGNAL clk_done : boolean := false;
BEGIN
u1: mt48lc8m16a2
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_VECTOR (1 DOWNTO 0);
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,364 @@
-------------------------------------------------------------------------------
-- --
-- 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 work;
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_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(load : IN BIT);
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_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
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_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
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_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
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_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
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_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
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_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
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_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
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(load : 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, 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_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
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_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
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,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