URL
https://opencores.org/ocsvn/single_port/single_port/trunk
Subversion Repositories single_port
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 2 to Rev 3
- ↔ Reverse comparison
Rev 2 → Rev 3
/tags/REL/doc/single_port.html
0,0 → 1,213
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> |
<html> |
<head> |
|
<meta http-equiv="CONTENT-TYPE" |
content="text/html; charset=iso-8859-1"> |
<title></title> |
|
<meta name="GENERATOR" content="StarOffice/5.2 (Win32)"> |
|
<meta name="AUTHOR" content="Robert Paley"> |
|
<meta name="CREATED" content="20020728;14095738"> |
|
<meta name="CHANGEDBY" content="Robert Paley"> |
|
<meta name="CHANGED" content="20020728;15514460"> |
|
<style> |
|
<!-- |
|
P.sdfootnote { margin-left: 0.2in; text-indent: -0.2in; margin-bottom: 0in; font-size: 10pt } |
|
A.sdfootnoteanc { font-size: 57% } |
|
--> |
|
</style> |
</head> |
<body> |
<p align="right"><font size="3">B"H</font></p> |
<h1 style="text-align: center;"><font size="4" style="font-size: 16pt;">Description |
of single_port memory and test environment.</font></h1> |
<h2>Abstract: </h2> |
<p>A single port memory with testbench is described. The memory is |
implemented as three different architectures.</p> |
<h2>Port Interface:</h2> |
<table width="757" border="1" cellpadding="5" cellspacing="4"> |
<col width="108"> <col width="118"> <col width="483"> <thead> <tr |
valign="top"> |
<th width="108"> |
<p>Port Name</p> |
</th> |
<th width="118"> |
<p>Type</p> |
</th> |
<th width="483"> |
<p>Description</p> |
</th> |
</tr> |
</thead> <tbody> |
<tr valign="top"> |
<td width="108"> |
<p>rnwtQ</p> |
</td> |
<td width="118"> |
<p>Time</p> |
</td> |
<td width="483"> |
<p>Time delay from rnw = read until data appears on q data bus.</p> |
</td> |
</tr> |
<tr valign="top"> |
<td width="108"> |
<p>d</p> |
</td> |
<td width="118"> |
<p>data_inter_typ</p> |
</td> |
<td width="483"> |
<p>Input data bus, type specified in single_port_pkg</p> |
</td> |
</tr> |
<tr valign="top"> |
<td width="108"> |
<p>q</p> |
</td> |
<td width="118"> |
<p>data_inter_typ</p> |
</td> |
<td width="483"> |
<p>Output data bus, type specified in single_port_pkg</p> |
</td> |
</tr> |
<tr valign="top"> |
<td width="108"> |
<p>a</p> |
</td> |
<td width="118"> |
<p>addr_inter_typ</p> |
</td> |
<td width="483"> |
<p>Address bus, type specified in single_port_pkg</p> |
</td> |
</tr> |
<tr valign="top"> |
<td width="108"> |
<p>rnw</p> |
</td> |
<td width="118"> |
<p>STD_LOGIC</p> |
</td> |
<td width="483"> |
<p>Read not write port</p> |
</td> |
</tr> |
<tr valign="top"> |
<td width="108"> |
<p>dealloc_mem</p> |
</td> |
<td width="118"> |
<p>BOOLEAN</p> |
</td> |
<td width="483"> |
<p>When set to true, deallocate linked list memory.</p> |
</td> |
</tr> |
|
</tbody> |
</table> |
<h2>Functional Description:</h2> |
<p>The single_port memory is implemented as three different |
architecures. The first architecture is called ArrayMemNoFlag, and |
implements the memory core as an array of STD_LOGIC_VECTOR. The memory |
is asynchronous and triggered on rnw'transaction. When rnw = '0', the |
data on bus "d" is loaded into the memory at the location specified by |
the addres bus "a". When rnw = '1', the data located in memory address |
"a" is loaded onto the output data bus "q". If a memory location is read |
which was not written to during the current simulation, 'U' are loaded |
onto the memory bus.</p> |
<p>The second architecture is called ArrayMem, and implements the |
memory core as an array of BIT_VECTOR. This arrangement allows less |
workstation memory to be used than the ArrayMemNoFlag architecture. The |
memory is asynchronous and triggered on rnw'transaction. When rnw = '0', |
the data on bus "d" is loaded into the memory at the location specified |
by the addres bus "a". When rnw = '1', the data located in memory |
address "a" is loaded onto the output data bus "q". If a memory location |
is read which was not written to during the current simulation, 'U' are |
loaded onto the memory bus.</p> |
<p>The third architecture is called LinkedList, and implements the |
memory core as a linked list of arrays of BIT_VECTOR. Each array in the |
linked list is a page of memory whose size is specified in |
single_port_pkg. This arrangement allows less workstation memory to be |
used than either the ArrayMemNoFlag or ArrayMem architectures. The |
memory is asynchronous and triggered on rnw'transaction. When rnw = '0', |
the data on bus "d" is loaded into the memory at the location specified |
by the addres bus "a". When rnw = '1', the data located in memory |
address "a" is loaded onto the output data bus "q". If a memory location |
is read which was not written to during the current simulation, 'U' are |
loaded onto the memory bus. To de-allocate the memory in the linked |
list, set dealloc_mem to true. </p> |
<h2>Functional Timing:</h2> |
<p>The single port memory is asynchronous and is triggered on |
rnw'transaction. When rnw is cleared to '0', the write occurs at the |
same time as rnw'transaction. When a read occurs, with rnw = '1' , data |
appears on the Q bus rnwtQ ns after rnw is set to '1'. The below sample |
timing diagram illustrates both a read and write operation.</p> |
<p><img src="../images/timing.jpg" name="Graphic1" align="left" |
width="958" height="251" border="0"><br clear="left"> |
</p> |
<h2>Testbench Description:</h2> |
<p>The test bench is arranged as a client server architecture as |
specified by Bergeron<a class="sdfootnoteanc" name="sdfootnote1anc" |
href="#sdfootnote1sym"><sup>1</sup></a>. A diagram illustrating the |
testbench is given below.<br> |
<br> |
<img src="../images/tbschematic.jpg" name="Graphic2" align="left" |
width="838" height="371" border="0"><br clear="left"> |
Two tests are specified in tc_single_port component. The first test |
writes data to two logical memory pages, and then reads them back |
verifying the correct data. The test case writes an error message to the |
console for every miscompare. The second case verifies that the |
single_port memory model outputs unknowns to the q bus if a read occurs |
for an unwritten memory location. Six configurations are specified in |
the test bench architecture tb_single_port, running both tests for each |
single_port architecture. <br> |
</p> |
<h2>Usage:</h2> |
<p>A Makefile is used to compile and run all of the tests in a Unix or |
like environment, such as Cygwin. The compilation and simulation is |
targetted to the SymphonyEDA tool available at <a |
href="www.symphonyeda.com">www.symphonyeda.com</a> .</p> |
<p>The source files and Makefile are located in {top}/VHDL<br> |
<br> |
To compile: make com</p> |
<p>To simulate all of the tests: make sim<br> |
</p> |
<p>To clean the compiled library: make clean</p> |
<p>The tests are labeled :</p> |
<ul> |
<li>ll_error</li> |
<li>ll_main</li> |
<li>mem_main<br> |
</li> |
<li>mem_error<br> |
</li> |
<li>memnoflag_main<br> |
</li> |
<li>memnoflag_error<br> |
</li> |
</ul> |
<p>To simulate any of these tests, type make {testname}</p> |
<p>Please contact Robert Paley at <a href="mailto:rpaley_yid@yahoo.com">rpaley_yid@opencores.org</a> |
if you have any questions or comments. </p> |
<div id="sdfootnote1"> |
<p class="sdfootnote" style="margin-bottom: 0.2in;"><a |
class="sdfootnotesym" name="sdfootnote1sym" href="#sdfootnote1anc">1</a>Writing |
Testbenches , Functional Verification of HDL Testbenches. Chapter 6 – |
ISBN 0-7923-7766-4</p> |
</div> |
</body> |
</html> |
/tags/REL/images/tbschematic.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
tags/REL/images/tbschematic.jpg
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: tags/REL/images/timing.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: tags/REL/images/timing.jpg
===================================================================
--- tags/REL/images/timing.jpg (nonexistent)
+++ tags/REL/images/timing.jpg (revision 3)
tags/REL/images/timing.jpg
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: tags/REL/VHDL/linked_list_mem_pkg.vhd
===================================================================
--- tags/REL/VHDL/linked_list_mem_pkg.vhd (nonexistent)
+++ tags/REL/VHDL/linked_list_mem_pkg.vhd (revision 3)
@@ -0,0 +1,147 @@
+-- $Author: rpaley_yid $
+-- $Date: 2003-01-14 21:48:10 $
+-- $Header: /home/marcus/revision_ctrl_test/oc_cvs/cvs/single_port/VHDL/linked_list_mem_pkg.vhd,v 1.1.1.1 2003-01-14 21:48:10 rpaley_yid Exp $
+-- $Locker
+-- $Revision: 1.1.1.1 $
+-- $State: Exp $
+
+-- --------------------------------------------------------------------------
+--
+-- Purpose: This package implements functions to allocate, write, read, and
+-- deallocate a linked list based memory.
+--
+--
+-- References:
+-- 1. The Designer's Guide to VHDL by Peter Ashenden
+-- ISBN: 1-55860-270-4 (pbk.)
+-- 2. Writing Testbenches - Functional Verification of HDL models by
+-- Janick Bergeron | ISBN: 0-7923-7766-4
+--
+-- Notes:
+--
+-- --------------------------------------------------------------------------
+
+LIBRARY IEEE;
+LIBRARY WORK;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE WORK.single_port_pkg.all;
+
+PACKAGE linked_list_mem_pkg IS
+ -- data memory array type definition
+ TYPE mem_array_typ IS ARRAY (0 TO PAGEDEPTH-1) OF data_typ;
+ -- Define memory page linked list cell. This cell contains,
+ -- the mem_array, starting page address, valid data array, and
+ -- the pointer to the next element in the linked list.
+ TYPE mem_page_typ;
+ -- pointer to next item in the linked list.
+ TYPE mem_page_ptr IS ACCESS mem_page_typ;
+ TYPE mem_page_typ IS RECORD
+ mem_array : mem_array_typ; -- data memory
+ -- This array is a flag which indicates if the corresponding
+ -- address location inside mem_array contains valid data.
+ data_valid_array : BIT_VECTOR( 0 TO PAGEDEPTH-1);
+ page_address : addr_typ;
+ next_cell : mem_page_ptr;
+ END RECORD mem_page_typ;
+ PROCEDURE rw_mem (
+ VARIABLE data : INOUT data_inter_typ;
+ VARIABLE addr : addr_typ;
+ VARIABLE write_flag : BOOLEAN;
+ VARIABLE next_cell : INOUT mem_page_ptr
+ );
+ PROCEDURE deallocate_mem (
+ VARIABLE next_cell : INOUT mem_page_ptr
+ );
+
+END PACKAGE linked_list_mem_pkg;
+
+PACKAGE BODY LINKED_LIST_MEM_PKG IS
+ -- --------------------------------------------------
+ -- The purpose of this procedure is to write a memory location from
+ -- the linked list, if the particular page does not exist, create it.
+ -- --------------------------------------------------
+ PROCEDURE rw_mem (
+ VARIABLE data : INOUT data_inter_typ;
+ VARIABLE addr : addr_typ;
+ VARIABLE write_flag : BOOLEAN;
+ VARIABLE next_cell : INOUT mem_page_ptr
+ ) IS
+ VARIABLE current_cell_v : mem_page_ptr; -- current page pointer
+ VARIABLE page_address_v : addr_typ; -- calculated page address
+ VARIABLE index_v : INTEGER; -- address within the memory page
+ VARIABLE mem_array_v : mem_array_typ;
+ VARIABLE data_valid_array_v : BIT_VECTOR(0 TO PAGEDEPTH-1);
+ BEGIN
+ -- Copy the top of the linked list pointer to a working pointer
+ current_cell_v := next_cell;
+ -- Calculate the index within the page from the given address
+ index_v := addr MOD PAGEDEPTH;
+ -- Calculate the page address from the given address
+ page_address_v := addr - index_v;
+ -- Search through the memory to determine if the calculated
+ -- memory page exists. Stop searching when reach the end of
+ -- the linked list.
+ WHILE ( current_cell_v /= NULL
+ AND current_cell_v.page_address /= page_address_v) LOOP
+ current_cell_v := current_cell_v.next_cell;
+ END LOOP;
+
+ IF write_flag THEN
+ IF ( current_cell_v /= NULL AND -- Check if address exists in memory.
+ current_cell_v.page_address = page_address_v
+ ) THEN
+ -- Found the memory page the particular address belongs to
+ current_cell_v.mem_array(index_v) := TO_BITVECTOR(data);
+ -- set memory location valid flag
+ current_cell_v.data_valid_array(index_v) := '1';
+ ELSE
+ -- The memory page the address belongs to was not allocated in memory.
+ -- Allocate page here and assign data.
+ mem_array_v(index_v) := TO_BITVECTOR(data);
+ data_valid_array_v(index_v) := '1';
+ next_cell := NEW mem_page_typ'( mem_array => mem_array_v,
+ data_valid_array => data_valid_array_v,
+ page_address => page_address_v,
+ next_cell => next_cell
+ );
+ END IF;
+ ELSE -- Read memory
+ IF ( current_cell_v /= NULL AND -- Check if address exists in memory.
+ current_cell_v.page_address = page_address_v AND
+ current_cell_v.data_valid_array(index_v) = '1'
+ ) THEN
+ -- Found the memory page the particular address belongs to,
+ -- and the memory location has valid data.
+ data := TO_STDLOGICVECTOR(current_cell_v.mem_array(index_v));
+ ELSE
+ -- Trying to read from unwritten or unallocated
+ -- memory location, return 'U';
+ data := (OTHERS => 'U');
+ END IF;
+ END IF;
+ END PROCEDURE rw_mem;
+
+ PROCEDURE deallocate_mem (
+ VARIABLE next_cell : INOUT mem_page_ptr
+ ) IS
+ VARIABLE delete_cell_v : mem_page_ptr;
+ BEGIN
+ -- Deallocate the linked link memory from work station memory.
+ WHILE next_cell /= NULL LOOP -- while not reached the end of the LL
+ delete_cell_v := next_cell; -- Copy pointer to record for deleting
+ next_cell := next_cell.next_cell; -- set pointer to next cell in LL
+ deallocate(delete_cell_v); -- Deallocate current cell from memory.
+ END LOOP;
+ END PROCEDURE deallocate_mem;
+END PACKAGE BODY LINKED_LIST_MEM_PKG;
+
+-- $Log: not supported by cvs2svn $
+-- Revision 1.1 2003/01/14 17:47:32 Default
+-- Initial revision
+--
+-- Revision 1.1 2002/12/24 18:03:50 Default
+-- Initial revision
+--
+
+
+
Index: tags/REL/VHDL/pkg_image.vhd
===================================================================
--- tags/REL/VHDL/pkg_image.vhd (nonexistent)
+++ tags/REL/VHDL/pkg_image.vhd (revision 3)
@@ -0,0 +1,307 @@
+-- $Author: rpaley_yid $
+-- $Date: 2003-01-14 21:48:10 $
+-- $Header: /home/marcus/revision_ctrl_test/oc_cvs/cvs/single_port/VHDL/pkg_image.vhd,v 1.1.1.1 2003-01-14 21:48:10 rpaley_yid Exp $
+-- $Locker
+-- $Revision: 1.1.1.1 $
+-- $State: Exp $
+
+-- Copyright (c) 1997 Ben Cohen. All rights reserved.
+-- This model can be used in conjunction with the Kluwer Academic books
+-- "VHDL Coding Styles and Methodologies", ISBN: 0-7923-9598-0
+-- "VHDL Amswers to Frequently Asked Questions", Kluwer Academic
+-- by Ben Cohen. email: vhdlcohen@aol.com
+--
+-- This source file for the Image Package
+-- may be used and distributed without restriction provided
+-- that this copyright statement is not removed from the file
+-- and that any derivative work contains this copyright notice.
+--
+--
+-- Original Author: Ben Cohen
+-- Description:
+-- Convert VHDL types to string for printing. This is especially useful when
+-- compiling with VHDL-87
+
+---------------------------------------------------------------
+LIBRARY IEEE;
+ USE IEEE.STD_LOGIC_1164.ALL;
+ USE IEEE.STD_LOGIC_TEXTIO.ALL;
+ USE IEEE.NUMERIC_STD.ALL;
+
+LIBRARY STD;
+ USE STD.TEXTIO.ALL;
+
+package pkg_image is
+ function Image(In_Image : Time) return String;
+ function Image(In_Image : Bit) return String;
+ function Image(In_Image : Bit_Vector) return String;
+ function Image(In_Image : Integer) return String;
+ function Image(In_Image : Real) return String;
+ function Image(In_Image : Std_uLogic) return String;
+ function Image(In_Image : Std_uLogic_Vector) return String;
+ function Image(In_Image : Std_Logic_Vector) return String;
+ function Image(In_Image : Signed) return String;
+ function Image(In_Image : UnSigned) return String;
+
+ function HexImage(InStrg : String) return String;
+ function HexImage(In_Image : Bit_Vector) return String;
+ function HexImage(In_Image : Std_uLogic_Vector) return String;
+ function HexImage(In_Image : Std_Logic_Vector) return String;
+ function HexImage(In_Image : Signed) return String;
+ function HexImage(In_Image : UnSigned) return String;
+
+ function DecImage(In_Image : Bit_Vector) return String;
+ function DecImage(In_Image : Std_uLogic_Vector) return String;
+ function DecImage(In_Image : Std_Logic_Vector) return String;
+ function DecImage(In_Image : Signed) return String;
+ function DecImage(In_Image : UnSigned) return String;
+end pkg_image;
+
+package body pkg_image is
+ function Image(In_Image : Time) return String is
+ variable L : Line; -- access type
+ variable W : String(1 to 14) := (others => ' ');
+ -- Long enough to hold a time string
+ begin
+ -- the WRITE procedure creates an object with "NEW".
+ -- L is passed as an output of the procedure.
+ Std.TextIO.WRITE(L, in_image);
+ -- Copy L.all onto W
+ W(L.all'range) := L.all;
+ Deallocate(L);
+ return W;
+ end Image;
+
+ function Image(In_Image : Bit) return String is
+ variable L : Line; -- access type
+ variable W : String(1 to 3) := (others => ' ');
+ begin
+ Std.TextIO.WRITE(L, in_image);
+ W(L.all'range) := L.all;
+ Deallocate(L);
+ return W;
+ end Image;
+
+ function Image(In_Image : Bit_Vector) return String is
+ variable L : Line; -- access type
+ variable W : String(1 to In_Image'length) := (others => ' ');
+ begin
+ Std.TextIO.WRITE(L, in_image);
+ W(L.all'range) := L.all;
+ Deallocate(L);
+ return W;
+ end Image;
+
+ function Image(In_Image : Integer) return String is
+ variable L : Line; -- access type
+ variable W : String(1 to 32) := (others => ' ');
+ -- Long enough to hold a time string
+ begin
+ Std.TextIO.WRITE(L, in_image);
+ W(L.all'range) := L.all;
+ Deallocate(L);
+ return W;
+ end Image;
+
+ function Image(In_Image : Real) return String is
+ variable L : Line; -- access type
+ variable W : String(1 to 32) := (others => ' ');
+ -- Long enough to hold a time string
+ begin
+ Std.TextIO.WRITE(L, in_image);
+ W(L.all'range) := L.all;
+ Deallocate(L);
+ return W;
+ end Image;
+
+ function Image(In_Image : Std_uLogic) return String is
+ variable L : Line; -- access type
+ variable W : String(1 to 3) := (others => ' ');
+ begin
+ IEEE.Std_Logic_Textio.WRITE(L, in_image);
+ W(L.all'range) := L.all;
+ Deallocate(L);
+ return W;
+ end Image;
+
+ function Image(In_Image : Std_uLogic_Vector) return String is
+ variable L : Line; -- access type
+ variable W : String(1 to In_Image'length) := (others => ' ');
+ begin
+ IEEE.Std_Logic_Textio.WRITE(L, in_image);
+ W(L.all'range) := L.all;
+ Deallocate(L);
+ return W;
+ end Image;
+
+ function Image(In_Image : Std_Logic_Vector) return String is
+ variable L : Line; -- access type
+ variable W : String(1 to In_Image'length) := (others => ' ');
+ begin
+ IEEE.Std_Logic_TextIO.WRITE(L, In_Image);
+ W(L.all'range) := L.all;
+ Deallocate(L);
+ return W;
+ end Image;
+
+ function Image(In_Image : Signed) return String is
+ begin
+ return Image(Std_Logic_Vector(In_Image));
+ end Image;
+
+ function Image(In_Image : UnSigned) return String is
+ begin
+ return Image(Std_Logic_Vector(In_Image));
+ end Image;
+
+ function HexImage(InStrg : String) return String is
+ subtype Int03_Typ is Integer range 0 to 3;
+ variable Result : string(1 to ((InStrg'length - 1)/4)+1) :=
+ (others => '0');
+ variable StrTo4 : string(1 to Result'length * 4) :=
+ (others => '0');
+ variable MTspace : Int03_Typ; -- Empty space to fill in
+ variable Str4 : String(1 to 4);
+ variable Group_v : Natural := 0;
+ begin
+ MTspace := Result'length * 4 - InStrg'length;
+ StrTo4(MTspace + 1 to StrTo4'length) := InStrg; -- padded with '0'
+ Cnvrt_Lbl : for I in Result'range loop
+ Group_v := Group_v + 4; -- identifies end of bit # in a group of 4
+ Str4 := StrTo4(Group_v - 3 to Group_v); -- get next 4 characters
+ case Str4 is
+ when "0000" => Result(I) := '0';
+ when "0001" => Result(I) := '1';
+ when "0010" => Result(I) := '2';
+ when "0011" => Result(I) := '3';
+ when "0100" => Result(I) := '4';
+ when "0101" => Result(I) := '5';
+ when "0110" => Result(I) := '6';
+ when "0111" => Result(I) := '7';
+ when "1000" => Result(I) := '8';
+ when "1001" => Result(I) := '9';
+ when "1010" => Result(I) := 'A';
+ when "1011" => Result(I) := 'B';
+ when "1100" => Result(I) := 'C';
+ when "1101" => Result(I) := 'D';
+ when "1110" => Result(I) := 'E';
+ when "1111" => Result(I) := 'F';
+ when others => Result(I) := 'X';
+ end case; -- Str4
+ end loop Cnvrt_Lbl;
+
+ return Result;
+ end HexImage;
+
+
+ function HexImage(In_Image : Bit_Vector) return String is
+ begin
+ return HexImage(Image(In_Image));
+ end HexImage;
+
+ function HexImage(In_Image : Std_uLogic_Vector) return String is
+ begin
+ return HexImage(Image(In_Image));
+ end HexImage;
+
+ function HexImage(In_Image : Std_Logic_Vector) return String is
+ begin
+ return HexImage(Image(In_Image));
+ end HexImage;
+
+ function HexImage(In_Image : Signed) return String is
+ begin
+ return HexImage(Image(In_Image));
+ end HexImage;
+
+ function HexImage(In_Image : UnSigned) return String is
+ begin
+ return HexImage(Image(In_Image));
+ end HexImage;
+
+ function DecImage(In_Image : Bit_Vector) return String is
+ variable In_Image_v : Bit_Vector(In_Image'length downto 1) := In_Image;
+ begin
+ if In_Image'length > 31 then
+ assert False
+ report "Number too large for Integer, clipping to 31 bits"
+ severity Warning;
+ return Image(To_Integer
+ (Unsigned(To_StdLogicVector
+ (In_Image_v(31 downto 1)))));
+ else
+ return Image(To_Integer(Unsigned(To_StdLogicVector(In_Image))));
+ end if;
+ end DecImage;
+
+ function DecImage(In_Image : Std_uLogic_Vector) return String is
+ variable In_Image_v : Std_uLogic_Vector(In_Image'length downto 1)
+ := In_Image;
+ begin
+ if In_Image'length > 31 then
+ assert False
+ report "Number too large for Integer, clipping to 31 bits"
+ severity Warning;
+ return Image(To_Integer(Unsigned(In_Image_v(31 downto 1))));
+ else
+ return Image(To_Integer(Unsigned(In_Image)));
+ end if;
+ end DecImage;
+
+ function DecImage(In_Image : Std_Logic_Vector) return String is
+ variable In_Image_v : Std_Logic_Vector(In_Image'length downto 1)
+ := In_Image;
+ begin
+ if In_Image'length > 31 then
+ assert False
+ report "Number too large for Integer, clipping to 31 bits"
+ severity Warning;
+ return Image(To_Integer(Unsigned(In_Image_v(31 downto 1))));
+ else
+ return Image(To_Integer(Unsigned(In_Image)));
+ end if;
+ end DecImage;
+
+ function DecImage(In_Image : Signed) return String is
+ variable In_Image_v : Signed(In_Image'length downto 1) := In_Image;
+ begin
+ if In_Image'length > 31 then
+ assert False
+ report "Number too large for Integer, clipping to 31 bits"
+ severity Warning;
+ return Image(To_Integer(In_Image_v(31 downto 1)));
+ else
+ return Image(To_Integer(In_Image));
+ end if;
+ end DecImage;
+
+ function DecImage(In_Image : UnSigned) return String is
+ variable In_Image_v : UnSigned(In_Image'length downto 1) := In_Image;
+ begin
+ if In_Image'length > 31 then
+ assert False
+ report "Number too large for Integer, clipping to 31 bits"
+ severity Warning;
+ return Image(To_Integer(In_Image_v(31 downto 1)));
+ else
+ return Image(To_Integer(In_Image));
+ end if;
+ end DecImage;
+
+end pkg_image;
+
+-- $Log: not supported by cvs2svn $
+-- Revision 1.1 2003/01/14 17:48:44 Default
+-- Initial revision
+--
+-- Revision 1.1 2002/12/24 18:07:50 Default
+-- Initial revision
+--
+
+
+
+
+
+
+
+
Index: tags/REL/VHDL/single_port.vhd
===================================================================
--- tags/REL/VHDL/single_port.vhd (nonexistent)
+++ tags/REL/VHDL/single_port.vhd (revision 3)
@@ -0,0 +1,131 @@
+-- $Author: rpaley_yid $
+-- $Date: 2003-01-14 21:48:11 $
+-- $Header: /home/marcus/revision_ctrl_test/oc_cvs/cvs/single_port/VHDL/single_port.vhd,v 1.1.1.1 2003-01-14 21:48:11 rpaley_yid Exp $
+-- $Locker
+-- $Revision: 1.1.1.1 $
+-- $State: Exp $
+
+-- --------------------------------------------------------------------------
+--
+-- Purpose: This is a single port asynchronous memory. This files
+-- describes three architectures. Two architectures are traditional
+-- array based memories. One describes the memory as an array of
+-- STD_LOGIC_VECTOR, and the other describes the ARRAY as BIT_VECTOR.
+-- The third architecture describes the memory arranged as a linked
+-- list in order to conserve computer memory usage. The memory
+-- is organized as a linked list of BIT_VECTOR arrays whose size
+-- is defined PAGEDEPTH in single_port_pkg.vhd.
+--
+--
+-- References:
+-- 1. The Designer's Guide to VHDL by Peter Ashenden
+-- ISBN: 1-55860-270-4 (pbk.)
+-- 2. Writing Testbenches - Functional Verification of HDL models by
+-- Janick Bergeron | ISBN: 0-7923-7766-4
+--
+-- Notes:
+--
+-- --------------------------------------------------------------------------
+LIBRARY IEEE;
+LIBRARY WORK;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+USE WORK.single_port_pkg.ALL;
+USE WORK.linked_list_mem_pkg.ALL;
+
+ENTITY single_port IS
+ GENERIC (
+ rnwtQ : TIME := 1 NS
+ );
+ PORT (
+ d : IN data_inter_typ;
+ q : OUT data_inter_typ;
+ a : IN addr_inter_typ;
+ rnw : IN STD_LOGIC;
+ dealloc_mem : IN BOOLEAN
+ );
+END ENTITY single_port;
+
+ARCHITECTURE ArrayMemNoFlag OF single_port IS
+BEGIN
+
+ mem_proc : PROCESS
+ TYPE mem_typ IS ARRAY ( 0 TO PAGENUM*PAGEDEPTH-1) OF data_inter_typ;
+ VARIABLE mem : mem_typ;
+ BEGIN
+ WAIT on rnw'transaction;
+ IF ( rnw = '0') THEN -- Write
+ mem(TO_INTEGER(unsigned(a))) := d;
+ ELSE -- Read
+ q <= mem(TO_INTEGER(unsigned(a))) AFTER rnwtQ;
+ END IF;
+ END PROCESS mem_proc;
+
+END ArrayMemNoFlag;
+
+ARCHITECTURE ArrayMem OF single_port IS
+BEGIN
+
+ mem_proc : PROCESS
+ TYPE mem_typ IS ARRAY ( 0 TO PAGENUM*PAGEDEPTH-1 ) OF data_typ;
+ TYPE flag_typ IS ARRAY ( 0 TO PAGENUM*PAGEDEPTH-1 ) OF BOOLEAN;
+ VARIABLE mem : mem_typ;
+ VARIABLE flag : flag_typ;
+ BEGIN
+ WAIT ON rnw'transaction;
+ IF ( rnw = '0') THEN -- Write
+ mem(TO_INTEGER(unsigned(a))) := TO_BITVECTOR(d);
+ flag(TO_INTEGER(unsigned(a))) := true; -- set valid memory location flag
+ ELSE -- read data, either valid or 'U'
+ IF ( flag(TO_INTEGER(unsigned(a))) = true ) THEN
+ q <= TO_STDLOGICVECTOR(mem(TO_INTEGER(unsigned(a)))) AFTER rnwtQ;
+ ELSE -- reading invalid memory location
+ q <= (OTHERS => 'U') after rnwtQ;
+ END IF;
+ END IF;
+ END PROCESS mem_proc;
+END ArrayMem;
+
+ARCHITECTURE LinkedList OF single_port IS
+ BEGIN
+
+ mem_proc : PROCESS
+ VARIABLE mem_page_v : mem_page_ptr;
+ VARIABLE d_v : data_inter_typ;
+ VARIABLE a_v : addr_typ;
+ VARIABLE WRITE_MEM_v : BOOLEAN := true;
+ VARIABLE READ_MEM_v : BOOLEAN := false;
+ BEGIN
+ WAIT ON dealloc_mem'transaction , rnw'TRANSACTION;
+ IF NOT dealloc_mem THEN
+ d_v := d;
+ a_v := TO_INTEGER(unsigned(a));
+ IF ( rnw = '0' ) THEN -- write to linked list memory
+ rw_mem( data => d_v,
+ addr => a_v,
+ write_flag => WRITE_MEM_v,
+ next_cell => mem_page_v
+ );
+ ELSE -- read from linked list memory
+ rw_mem( data => d_v,
+ addr => a_v,
+ write_flag => READ_MEM_v,
+ next_cell => mem_page_v
+ );
+ q <= d_v after rnwtQ;
+ END IF;
+ ELSE -- Deallocate memory from work station memory.
+ deallocate_mem(mem_page_v);
+ END IF;
+ END PROCESS mem_proc;
+
+END LinkedList;
+
+-- $Log: not supported by cvs2svn $
+-- Revision 1.1 2003/01/14 17:48:31 Default
+-- Initial revision
+--
+-- Revision 1.1 2002/12/24 18:09:05 Default
+-- Initial revision
+--
+
Index: tags/REL/VHDL/single_port_pkg.vhd
===================================================================
--- tags/REL/VHDL/single_port_pkg.vhd (nonexistent)
+++ tags/REL/VHDL/single_port_pkg.vhd (revision 3)
@@ -0,0 +1,70 @@
+-- $Author: rpaley_yid $
+-- $Date: 2003-01-14 21:48:11 $
+-- $Header: /home/marcus/revision_ctrl_test/oc_cvs/cvs/single_port/VHDL/single_port_pkg.vhd,v 1.1.1.1 2003-01-14 21:48:11 rpaley_yid Exp $
+-- $Locker: $
+-- $Revision: 1.1.1.1 $
+-- $State: Exp $
+
+-- --------------------------------------------------------------------------
+--
+-- Purpose: Package file for single_port memory and testbench
+--
+-- References:
+-- 1. The Designer's Guide to VHDL by Peter Ashenden
+-- ISBN: 1-55860-270-4 (pbk.)
+-- 2. Writing Testbenches - Functional Verification of HDL models by
+-- Janick Bergeron | ISBN: 0-7923-7766-4
+--
+-- Notes:
+--
+-- --------------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+PACKAGE single_port_pkg IS
+CONSTANT PAGEDEPTH : INTEGER := 256; -- memory page depth
+CONSTANT PAGENUM : INTEGER := 4096; -- number of pages in memory.
+CONSTANT DATA_WIDTH : INTEGER := 32; -- memory data bus width
+CONSTANT ADDRESS_WIDTH : INTEGER := 16; -- memory address bus width
+-- Data bus type for memory interface
+SUBTYPE data_inter_typ IS STD_LOGIC_VECTOR(DATA_WIDTH-1 DOWNTO 0);
+-- Data bus type for internal memory
+SUBTYPE data_typ IS BIT_VECTOR(DATA_WIDTH-1 DOWNTO 0);
+-- Address bus type for memory interface
+SUBTYPE addr_inter_typ IS STD_LOGIC_VECTOR(ADDRESS_WIDTH-1 DOWNTO 0);
+-- Address bus type for internal memory
+SUBTYPE addr_typ IS NATURAL;
+-- Operations testbench can do.
+TYPE do_typ IS ( init , read , write , dealloc , end_test );
+
+TYPE to_srv_typ IS RECORD -- Record passed from test case to test bench
+ do : do_typ;
+ addr : addr_inter_typ;
+ data : data_inter_typ;
+ event : BOOLEAN;
+END RECORD to_srv_typ;
+
+TYPE frm_srv_typ IS RECORD -- Record passed from test bench to test case
+ data : data_inter_typ;
+ event : BOOLEAN;
+END RECORD frm_srv_typ;
+
+
+END PACKAGE single_port_pkg;
+
+PACKAGE BODY single_port_pkg IS
+
+END PACKAGE BODY single_port_pkg;
+
+-- $Log: not supported by cvs2svn $
+-- Revision 1.1 2003/01/14 17:48:44 Default
+-- Initial revision
+--
+-- Revision 1.1 2002/12/24 17:58:49 Default
+-- Initial revision
+--
+
+
+
Index: tags/REL/VHDL/tb_single_port.vhd
===================================================================
--- tags/REL/VHDL/tb_single_port.vhd (nonexistent)
+++ tags/REL/VHDL/tb_single_port.vhd (revision 3)
@@ -0,0 +1,191 @@
+-- $Author: rpaley_yid $
+-- $Date: 2003-01-14 21:48:11 $
+-- $Header: /home/marcus/revision_ctrl_test/oc_cvs/cvs/single_port/VHDL/tb_single_port.vhd,v 1.1.1.1 2003-01-14 21:48:11 rpaley_yid Exp $
+-- $Locker
+-- $Revision: 1.1.1.1 $
+-- $State: Exp $
+
+-- --------------------------------------------------------------------------
+--
+-- Purpose: This file specifies test bench harness for the single_port
+-- Memory. It also contains the configuration files for all the
+-- tests.
+--
+--
+-- References:
+-- 1. The Designer's Guide to VHDL by Peter Ashenden
+-- ISBN: 1-55860-270-4 (pbk.)
+-- 2. Writing Testbenches - Functional Verification of HDL models by
+-- Janick Bergeron | ISBN: 0-7923-7766-4
+--
+-- Notes:
+--
+-- --------------------------------------------------------------------------
+LIBRARY IEEE;
+LIBRARY WORK;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+USE WORK.linked_list_mem_pkg.ALL;
+USE WORK.single_port_pkg.all;
+USE STD.TEXTIO.ALL;
+
+ENTITY tb_single_port IS
+END ENTITY tb_single_port;
+
+ARCHITECTURE BHV of tb_single_port IS
+
+COMPONENT single_port IS
+ GENERIC (
+ rnwtQ : TIME := 1 NS
+ );
+ PORT (
+ d : IN data_inter_typ;
+ q : OUT data_inter_typ;
+ a : IN addr_inter_typ;
+ rnw : IN STD_LOGIC;
+ dealloc_mem : BOOLEAN
+);
+END COMPONENT single_port;
+
+COMPONENT tc_single_port IS
+ PORT (
+ to_srv : OUT to_srv_typ;
+ frm_srv : IN frm_srv_typ
+);
+END COMPONENT tc_single_port;
+
+SIGNAL d : data_inter_typ;
+SIGNAL q : data_inter_typ;
+SIGNAL a : addr_inter_typ;
+SIGNAL rnw : STD_LOGIC;
+SIGNAL dealloc_mem : BOOLEAN;
+SIGNAL to_srv : to_srv_typ;
+SIGNAL frm_srv : frm_srv_typ;
+SIGNAL tie_vdd : STD_LOGIC := '1';
+BEGIN
+ dut : single_port
+ PORT MAP (
+ d => d,
+ a => a,
+ q => q,
+ rnw => rnw,
+ dealloc_mem => dealloc_mem
+ );
+
+ tc : tc_single_port
+ PORT MAP (
+ to_srv => to_srv,
+ frm_srv => frm_srv
+ );
+
+ single_port_server : PROCESS
+ VARIABLE frm_srv_v : frm_srv_typ;
+ CONSTANT ACCESS_DELAY : TIME := 5 NS;
+ BEGIN
+ -- Wait until the test case is finished setting up the next memory access.
+ WAIT ON to_srv'TRANSACTION;
+ CASE to_srv.do IS
+ WHEN init =>
+ ASSERT FALSE
+ REPORT "initialized"
+ SEVERITY NOTE;
+ WHEN read => -- perform memory read
+ d <= to_srv.data;
+ a <= to_srv.addr;
+ rnw <= '1';
+ -- Wait for data to appear
+ WAIT FOR ACCESS_DELAY;
+ WHEN write => -- perform memory write
+ d <= to_srv.data;
+ a <= to_srv.addr;
+ rnw <= '0';
+ WAIT FOR ACCESS_DELAY;
+ WHEN dealloc => -- deallocate the linked list for the LL architecture
+ dealloc_mem <= true;
+ WHEN end_test => -- reached the end of the test case
+ WAIT;
+ END CASE;
+ frm_srv_v.data := q;
+ -- Send message to test case to continue the test.
+ frm_srv <= frm_srv_v ; WAIT FOR 0 NS;
+ END PROCESS single_port_server;
+END BHV;
+
+CONFIGURATION ll_main_cfg OF TB_SINGLE_PORT IS
+ FOR BHV
+ FOR dut : single_port
+ USE ENTITY work.single_port(LinkedList);
+ END FOR; -- dut
+ FOR tc : tc_single_port
+ USE ENTITY work.tc_single_port(TC0);
+ END FOR; -- tc;
+ END FOR; -- BHV
+END CONFIGURATION ll_main_cfg;
+
+CONFIGURATION ll_error_cfg OF TB_SINGLE_PORT IS
+ FOR BHV
+ FOR dut : single_port
+ USE ENTITY work.single_port(LinkedList);
+ END FOR; -- dut
+ FOR tc : tc_single_port
+ USE ENTITY work.tc_single_port(TC1);
+ END FOR; -- tc;
+ END FOR; -- BHV
+END CONFIGURATION ll_error_cfg ;
+
+CONFIGURATION mem_main_cfg of TB_SINGLE_PORT IS
+ FOR BHV
+ FOR dut : single_port
+ USE ENTITY work.single_port(ArrayMem);
+ END FOR; -- dut
+ FOR tc : tc_single_port
+ USE ENTITY work.tc_single_port(TC0);
+ END FOR; -- tc;
+ END FOR; -- BHV
+END CONFIGURATION mem_main_cfg;
+
+CONFIGURATION mem_error_cfg of TB_SINGLE_PORT IS
+ FOR BHV
+ FOR dut : single_port
+ USE ENTITY work.single_port(ArrayMem);
+ END FOR; -- dut
+ FOR tc : tc_single_port
+ USE ENTITY work.tc_single_port(TC1);
+ END FOR; -- tc;
+ END FOR; -- BHV
+END CONFIGURATION mem_error_cfg;
+
+CONFIGURATION memnoflag_main_cfg of TB_SINGLE_PORT IS
+ FOR BHV
+ FOR dut : single_port
+ USE ENTITY work.single_port(ArrayMemNoFlag);
+ END FOR; -- dut
+ FOR tc : tc_single_port
+ USE ENTITY work.tc_single_port(TC0);
+ END FOR; -- tc;
+ END FOR; -- BHV
+END CONFIGURATION memnoflag_main_cfg;
+
+CONFIGURATION memnoflag_error_cfg of TB_SINGLE_PORT IS
+ FOR BHV
+ FOR dut : single_port
+ USE ENTITY work.single_port(ArrayMemNoFlag);
+ END FOR; -- dut
+ FOR tc : tc_single_port
+ USE ENTITY work.tc_single_port(TC1);
+ END FOR; -- tc;
+ END FOR; -- BHV
+END CONFIGURATION memnoflag_error_cfg;
+
+-- $Log: not supported by cvs2svn $
+-- Revision 1.1 2003/01/14 17:49:04 Default
+-- Initial revision
+--
+-- Revision 1.2 2002/12/31 19:19:43 Default
+-- Updated 'transaction statements for fixed simulator.
+--
+-- Revision 1.1 2002/12/24 18:10:18 Default
+-- Initial revision
+--
+
+
Index: tags/REL/VHDL/tc_single_port.vhd
===================================================================
--- tags/REL/VHDL/tc_single_port.vhd (nonexistent)
+++ tags/REL/VHDL/tc_single_port.vhd (revision 3)
@@ -0,0 +1,194 @@
+-- $Author: rpaley_yid $
+-- $Date: 2003-01-14 21:48:11 $
+-- $Header: /home/marcus/revision_ctrl_test/oc_cvs/cvs/single_port/VHDL/tc_single_port.vhd,v 1.1.1.1 2003-01-14 21:48:11 rpaley_yid Exp $
+-- $Locker
+-- $Revision: 1.1.1.1 $
+-- $State: Exp $
+
+-- --------------------------------------------------------------------------
+--
+-- Purpose: This file specifies test cases for the single_port
+-- Memory.
+--
+--
+-- References:
+-- 1. The Designer's Guide to VHDL by Peter Ashenden
+-- ISBN: 1-55860-270-4 (pbk.)
+-- 2. Writing Testbenches - Functional Verification of HDL models by
+-- Janick Bergeron | ISBN: 0-7923-7766-4
+--
+-- Notes:
+--
+-- --------------------------------------------------------------------------
+LIBRARY IEEE;
+LIBRARY WORK;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+USE WORK.SINGLE_PORT_PKG.ALL;
+USE WORK.PKG_IMAGE.ALL;
+
+ENTITY tc_single_port IS
+PORT (
+ to_srv : OUT to_srv_typ;
+ frm_srv : IN frm_srv_typ
+);
+END ENTITY tc_single_port;
+
+-- --------------------------------------------------
+-- Test Case TC0
+-- This test case is to check two pages of memory
+-- Starting at physical address 0x0 ,
+-- Write a '1' to bit position 0, leaving all other bits 0.
+-- Increment the address,
+-- Write a '1' to bit position 1, leaving all other bits 0.
+-- Increment the address.
+-- Write a '1' to bit position 2, leaving all other bits 0.
+-- Continue in this fasion, until write a 1 to the MSB.
+-- increment the address,
+-- Write a '1' to bit position 0, leaving all other bits 0.
+-- Continue until the entire page is written to.
+-- Read back all addresses in the page, ensuring the
+-- correct data is read back.
+-- --------------------------------------------------
+
+
+ARCHITECTURE TC0 OF tc_single_port IS
+BEGIN
+ MAIN : PROCESS
+ VARIABLE to_srv_v : to_srv_typ;
+ VARIABLE frm_srv_v : frm_srv_typ;
+ VARIABLE dv : data_inter_typ :=
+ STD_LOGIC_VECTOR(TO_UNSIGNED(1,data_inter_typ'length));
+ VARIABLE offset_v : INTEGER;
+ BEGIN
+ offset_v := 0;
+ -- Run this write/read test 10 times for benchmark
+ -- purposes.
+ for i in 0 to 9 loop
+ for index in 0 to 2*PAGEDEPTH-1 loop
+ -- Specify to testbench server to perform write operation;
+ to_srv_v.do := write;
+ to_srv_v.data := dv; -- specify data to write
+ dv := To_StdLogicVector(TO_BitVector(dv) rol 1); -- ROL 1 for next write
+ -- Specify physical address.
+ to_srv_v.addr := STD_LOGIC_VECTOR(TO_UNSIGNED(index+offset_v,
+ ADDRESS_WIDTH));
+ to_srv <= to_srv_v ; WAIT FOR 0 NS;
+ WAIT ON frm_srv'TRANSACTION;
+ end loop;
+ -- Reset data to 1.
+ dv := STD_LOGIC_VECTOR(TO_UNSIGNED(1,data_inter_typ'length));
+ for index in 0 to 2*PAGEDEPTH-1 loop
+ -- Perform read operation.
+ to_srv_v.do := read;
+ -- Specify physical address.
+ to_srv_v.addr := STD_LOGIC_VECTOR(TO_UNSIGNED(index+offset_v,
+ ADDRESS_WIDTH));
+ to_srv <= to_srv_v ; WAIT FOR 0 NS;
+ WAIT ON frm_srv'TRANSACTION;
+ -- Compare actual with expected read back data, if the
+ -- the expected and actual to not compare, print the
+ -- expected and actual values.
+ ASSERT frm_srv.data = dv
+ REPORT "Expected: " & HexImage(frm_srv.data) &
+ " did not equal Actual: " & HexImage(dv)
+ SEVERITY ERROR;
+ -- Set expected data for next read.
+ dv := TO_STDLOGICVECTOR(TO_BITVECTOR(dv) rol 1);
+ end loop;
+ end loop;
+ to_srv_v.do := dealloc; -- Deallocate memory
+ --
+ to_srv <= to_srv_v ; WAIT FOR 0 NS;
+ -- Tell test bench server process test completed.
+ to_srv_v.do := end_test;
+ to_srv <= to_srv_v;
+ ASSERT FALSE
+ REPORT "Completed Test TC0"
+ SEVERITY NOTE;
+ WAIT;
+ END PROCESS main;
+END TC0;
+
+-- --------------------------------------------------
+-- Test Case TC1
+-- This test case is to check if the test bench will
+-- return 'U' for invalid memory locations for
+-- single_port architectures ArrayMEm and LinkedList
+-- --------------------------------------------------
+ARCHITECTURE TC1 OF tc_single_port IS
+BEGIN
+ MAIN : PROCESS
+ VARIABLE to_srv_v : to_srv_typ;
+ VARIABLE frm_srv_v : frm_srv_typ;
+ VARIABLE dv : data_inter_typ := (OTHERS => 'U');
+ BEGIN
+ -- Perform read operation.
+ to_srv_v.do := read;
+ -- Specify physical address.
+ to_srv_v.addr := STD_LOGIC_VECTOR(TO_UNSIGNED(0,
+ ADDRESS_WIDTH));
+ to_srv <= to_srv_v; WAIT FOR 0 NS;
+ WAIT ON frm_srv'TRANSACTION;
+ -- Compare actual with expected read back data, if the
+ -- the expected and actual to not compare, print the
+ -- expected and actual values.
+ ASSERT frm_srv.data = dv
+ REPORT "Expected: " & HexImage(frm_srv.data) &
+ " did not equal Actual: " & HexImage(dv)
+ SEVERITY ERROR;
+
+ -- Write and read back from same address.
+
+ -- Specify to testbench server to perform write operation;
+ to_srv_v.do := write;
+ dv := X"a5a5a5a5";
+ to_srv_v.data := dv; -- specify data to write
+ -- Specify physical address.
+ to_srv_v.addr := STD_LOGIC_VECTOR(TO_UNSIGNED(0,
+ ADDRESS_WIDTH));
+ to_srv <= to_srv_v; WAIT FOR 0 NS;
+ -- Wait until the test bench server finished with the write.
+ -- WAIT UNTIL frm_srv.event = true;
+ WAIT ON frm_srv'transaction;
+
+ to_srv_v.do := read;
+ -- Specify physical address.
+ to_srv_v.addr := STD_LOGIC_VECTOR(TO_UNSIGNED(0,
+ ADDRESS_WIDTH));
+ to_srv <= to_srv_v; WAIT FOR 0 NS;
+ WAIT ON frm_srv'transaction;
+
+ -- Compare actual with expected read back data, if the
+ -- the expected and actual to not compare, print the
+ -- expected and actual values.
+ ASSERT frm_srv.data = dv
+ REPORT "Expected: " & HexImage(frm_srv.data) &
+ " did not equal Actual: " & HexImage(dv)
+ SEVERITY ERROR;
+
+ to_srv_v.do := dealloc; -- Deallocate memory
+ --
+ to_srv <= to_srv_v; WAIT FOR 0 NS;
+ -- Tell test bench server process test completed.
+ to_srv_v.do := end_test;
+ to_srv <= to_srv_v; WAIT FOR 0 NS;
+
+ ASSERT FALSE
+ REPORT "Completed Test TC1"
+ SEVERITY NOTE;
+ WAIT;
+ END PROCESS main;
+END TC1;
+
+-- $Log: not supported by cvs2svn $
+-- Revision 1.1 2003/01/14 17:49:04 Default
+-- Initial revision
+--
+-- Revision 1.2 2002/12/31 19:19:43 Default
+-- Updated 'transaction statements for fixed simulator.
+--
+-- Revision 1.1 2002/12/24 18:13:50 Default
+-- Initial revision
+--
+
Index: tags/REL/VHDL/Makefile
===================================================================
--- tags/REL/VHDL/Makefile (nonexistent)
+++ tags/REL/VHDL/Makefile (revision 3)
@@ -0,0 +1,161 @@
+#
+# Description: Top level make file for single_port test project.
+# make com to compile
+# make sim to simulate all tests
+# make ll_error to run this test only
+# make ll_main to run this test only
+# make mem_main to run this test only
+# make mem_error to run this test only
+# make memnoflag_main to run this test
+# make memnoflag_error to run this test
+# $Author: rpaley_yid $
+# $Date: 2003-01-14 21:48:11 $
+# $Header: /home/marcus/revision_ctrl_test/oc_cvs/cvs/single_port/VHDL/Makefile,v 1.1.1.1 2003-01-14 21:48:11 rpaley_yid Exp $
+# $Locker: $
+# $Revision: 1.1.1.1 $
+# $State: Exp $
+
+# VCOM , VSIM , and WORK variables are set for Sonata simulator,
+# Change appropriately for your simulator. Ex.for Modeltech,
+# VCOM = vcom
+# VSIM = vsim
+# WORK = work
+
+SHELL = /bin/sh
+VCOM = vhdlp
+VCOMOPT = -s
+VSIM = vhdle
+VSIMOPT =
+WORK = work.sym
+## Need to figure out how to put Bourne shell stuff in Makefile
+## will do so to generate log files in
+## LOGDIR = ../LOG/
+## For now, log files are in VHDL directory.
+
+
+# List of main compiled objects, does not include configurations,
+# which are included in the tb_single_port.vhd file.
+# These targets are for the Sonata simulator, adjust accordingly for
+# your simulator.
+
+SINGLE_PORT_PKG_OBJ = $(WORK)/single_port_pkg/prim.var
+LINKED_LIST_MEM_OBJ = $(WORK)/linked_list_mem_pkg/prim.var
+PKG_IMAGE_OBJ = $(WORK)/pkg_image/prim.var
+SINGLE_PORT_OBJ = $(WORK)/single_port/prim.var
+TC_SINGLE_PORT_OBJ = $(WORK)/tc_single_port/prim.var
+TB_SINGLE_PORT_OBJ = $(WORK)/tb_single_port/prim.var
+LL_ERROR_DEP = $(WORK)/ll_error_cfg/prim.var
+LL_MAIN_DEP = $(WORK)/ll_main_cfg/prim.var
+MEM_MAIN_DEP = $(WORK)/mem_main_cfg/prim.var
+MEM_ERROR_DEP = $(WORK)/mem_error_cfg/prim.var
+MEMNOFLAG_MAIN_DEP = $(WORK)/memnoflag_main_cfg/prim.var
+MEMNOFLAG_ERROR_DEP = $(WORK)/memnoflag_error_cfg/prim.var
+
+LL_ERROR = $(LOGDIR)ll_error.log
+LL_MAIN = ll_main.log
+MEM_MAIN = mem_main.log
+MEM_ERROR = mem_error.log
+MEMNOFLAG_MAIN = memnoflag_main.log
+MEMNOFLAG_ERROR = memnoflag_error.log
+
+OBJS = $(SINGLE_PORT_PKG_OBJ) \
+ $(LINKED_LIST_MEM_OBJ) \
+ $(PKG_IMAGE_OBJ) \
+ $(SINGLE_PORT_OBJ) \
+ $(TC_SINGLE_PORT_OBJ) \
+ $(TB_SINGLE_PORT_OBJ)
+
+SIMOBJS = $(LL_ERROR) \
+ $(LL_MAIN) \
+ $(MEM_MAIN) \
+ $(MEM_ERROR) \
+ $(MEMNOFLAG_MAIN) \
+ $(MEMNOFLAG_ERROR)
+
+# Compile the project
+com: $(OBJS)
+
+# Clean the library
+clean:: $(WORK)
+
+# Simulate all tests
+sim: $(SIMOBJS)
+
+## Run only ll_error test
+ll_error: $(LL_ERROR)
+
+# Run onle ll_main test
+ll_main: $(LL_MAIN)
+
+# Run only mem_main test
+mem_main: $(MEM_MAIN)
+
+# Run only mem_error test
+mem_error: $(MEM_ERROR)
+
+# Run only memnoflag_main test
+memnoflag_main: $(MEMNOFLAG_MAIN)
+
+# Run only memnoflag_error test
+memnoflag_error: $(MEMNOFLAG_ERROR)
+
+# Target dependency rules to run tests
+$(LL_ERROR) : $(LL_ERROR_DEP)
+ $(VSIM) $(VSIMOPT) ll_error_cfg | tee $@
+
+$(LL_MAIN) : $(LL_MAIN_DEP)
+ $(VSIM) $(VSIMOPT) ll_main_cfg | tee $@
+
+$(MEM_MAIN) : $(MEM_MAIN_DEP)
+ $(VSIM) $(VSIMOPT) mem_main_cfg | tee $@
+
+$(MEM_ERROR) : $(MEM_ERROR_DEP)
+ $(VSIM) $(VSIMOPT) mem_error_cfg | tee $@
+
+$(MEMNOFLAG_MAIN) : $(MEMNOFLAG_MAIN_DEP)
+ $(VSIM) $(VSIMOPT) memnoflag_main_cfg | tee $@
+
+$(MEMNOFLAG_ERROR) : $(MEMNOFLAG_ERROR_DEP)
+ $(VSIM) $(VSIMOPT) memnoflag_error_cfg | tee $@
+
+# Target dependency rules to compile tests
+
+$(SINGLE_PORT_PKG_OBJ) : single_port_pkg.vhd
+ $(VCOM) $(VCOMOPT) $<
+
+$(LINKED_LIST_MEM_OBJ) : linked_list_mem_pkg.vhd \
+ $(SINGLE_PORT_PKG_OBJ)
+ $(VCOM) $(VCOMOPT) $<
+
+$(PKG_IMAGE_OBJ) : pkg_image.vhd
+ $(VCOM) $(VCOMOPT) $<
+
+$(SINGLE_PORT_OBJ) : single_port.vhd \
+ $(SINGLE_PORT_PKG_OBJ) \
+ $(LINKED_LIST_MEM_OBJ)
+ $(VCOM) $(VCOMOPT) $<
+
+$(TC_SINGLE_PORT_OBJ) : tc_single_port.vhd \
+ $(SINGLE_PORT_PKG_OBJ) \
+ $(PKG_IMAGE_OBJ) \
+ $(SINGLE_PORT_OBJ)
+ $(VCOM) $(VCOMOPT) $<
+
+$(TB_SINGLE_PORT_OBJ) : tb_single_port.vhd \
+ $(SINGLE_PORT_PKG_OBJ) \
+ $(LINKED_LIST_MEM_OBJ) \
+ $(SINGLE_PORT_OBJ) \
+ $(TC_SINGLE_PORT_OBJ)
+ $(VCOM) $(VCOMOPT) $<
+
+$(WORK) ::
+ rm -rf $(WORK)/*
+
+
+####################################################################
+# $Log: not supported by cvs2svn $
+# Revision 1.1 2002/12/31 19:21:59 Default
+# Initial revision
+#
+#
+