OpenCores
URL https://opencores.org/ocsvn/versatile_mem_ctrl/versatile_mem_ctrl/trunk

Subversion Repositories versatile_mem_ctrl

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 108 to Rev 109
    Reverse comparison

Rev 108 → Rev 109

/versatile_mem_ctrl/tags/Rev2/doc/versatile_mem_ctrl.pdf Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
versatile_mem_ctrl/tags/Rev2/doc/versatile_mem_ctrl.pdf Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/tRCD.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/tRCD.png =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/tRCD.png (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/tRCD.png (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/tRCD.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/versatile_mem_ctrl.texi =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/versatile_mem_ctrl.texi (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/versatile_mem_ctrl.texi (revision 109) @@ -0,0 +1,323 @@ +\input texinfo +@c -*-texinfo-*- +@c %**start of header +@setfilename versatile_mem_ctrl +@include version.texi +@settitle Versatile memory controller @value{VERSION} + +@c %**end of header + +@set DESIGN Versatile memory controller +@copying +This file documents the @value{DESIGN}. + +Copyright @copyright{} 2011 ORSoC + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with no +Invariant Sections, with no Front-Cover Texts, and with no Back-Cover +Texts. A copy of the license is included in the section entitled ``GNU +Free Documentation License''. +@end quotation +@end copying + +@afourpaper + +@titlepage +@title @value{DESIGN} User Guide +@c @subtitle subtitle-if-any +@c @subtitle second-subtitle +@author Michael Unneback +@author ORSoC + +@c The following two commands +@c start the copyright page. +@page +@vskip 0pt plus 1filll +@insertcopying + +Published by ORSoC +@end titlepage + +@c So the toc is printed at the start. +@contents + +@ifnottex +@node Top +@top Scope of this Document + +This document is the user guide for @value{DESIGN}. + +@end ifnottex + +@node Document Introduction +@chapter Introduction + +@cindex Introduction to this @value{DESIGN} + +This design implements a versatile memory controller. If used in combination with the versitale library, available from OpenCores, +different types of system can easily be designed, including use cases where the system bus is in one clock domain and the memory + controller in an other. + +@section Dependencies to other IP cores + +This design uses the following IP coreas available from OpenCores project verstile library. +@itemize @bullet +@item vl_cnt_shreg_ce_clear +@item vl_dff_ce_clear +@item vl_cnt_lfsr_zq +@item vl_dff +@item vl_o_dff +@item vl_io_dff_oe +@end itemize + +@node Block diagram +@chapter Block Diagram +@cindex Block diagram + +@section Synchronous design +@image{block-sdram} +Synchronous design where wishbone clock domain is equal to SDRAM and SDRAM controller clock domain. + +@section Asynchronous design +@image{block-sdram-wbwb} +Asynchronous design where wishbone and SDRAM clock domain are independant. A wishbone rev B3 compatilble bridge +is available in project versatile_library from OpenCores, http://www.opencores.org. + +@section Asynchronous design with multiple wishbone interfaces +@image{block-sdram-wbwb-arbiter} +Asynchronous design where wishbone and SDRAM clock domain are independant. Multiple wishbone port with use of a wishbone arbiter. + +@node SDR SDRAM controller +@chapter SDR SDRAM controller + +@section Module defines +@multitable @columnfractions .2 .8 +@headitem Name @tab Description +@item NO_BURST @tab Define if burst cycles not used +@item WRAP4 @tab Define to support 4 word wrap burst +@item WRAP8 @tab Define to support 8 word wrap burst +@item WRAP16 @tab Define to support 16 word wrap burst +@end multitable + +@section Module parameters + +@multitable @columnfractions .2 .1 .7 +@headitem Name @tab Default value @tab Description +@item ba_size @tab 2 @tab Bank adress vector size +@item row_size @tab 13 @tab Row adress vector size +@item col_size @tab 9 @tab Column adress vector size +@item cl @tab 2 @tab CAS latency +@end multitable + +Parameters ba_size, col_size and row_size should be set depending on memory configuration. The following +table holds figures for some SDRAM memories. + +@multitable @columnfractions .15 .25 .1 .1 .1 .3 +@headitem Manufacturer @tab Partnumber @tab ba_size @tab row_size @tab col_size @tab Memory size +@item Micron @tab MT48LC4M16 @tab 2 @tab 12 @tab 8 @tab 8Mbyte +@item Micron @tab MT48LC8M16 @tab 2 @tab 12 @tab 9 @tab 16Mbyte +@item Micron @tab MT48LC16M16 @tab 2 @tab 13 @tab 9 @tab 32Mbyte +@item Micron @tab MT48LC32M16 @tab 2 @tab 13 @tab 10 @tab 64Mbyte +@end multitable + +Parameter cl should be set to either 2 or 3 depending on SDRAM clock. + +@section Module IO signals +@subsection Wishbone signals +@multitable @columnfractions .2 .1 .1 .6 +@headitem Name @tab Dir @tab Width @tab Description +@item dat_i @tab I @tab 32 @tab Input data vector +@item adr_i @tab I @tab @tab Adress vector +@item sel_i @tab I @tab 4 @tab Byte select signals +@item bte_i @tab I @tab 2 @tab Bus tag identifier +@item we_i @tab I @tab 1 @tab Write enable +@item cyc_i @tab I @tab 1 @tab Active cycle indicator +@item stb_i @tab I @tab 1 @tab Strobe +@item dat_o @tab O @tab 32 @tab Output data vector +@item ack_o @tab O @tab 1 @tab Acknowledge signal +@end multitable + +Wishbone signal bte_i is optional and is only used for designs supporting burst transfer. +@subsection SDRAM signals +@multitable @columnfractions .2 .1 .1 .6 +@headitem Name @tab Dir @tab Width @tab Description +@item ba @tab O @tab ba_size @tab Bank adress vector +@item a @tab O @tab 13 @tab Adress vector +@item cmd @tab O @tab 3 @tab SDRAM command, {ras_n, cas_n, we_n} +@item cke @tab O @tab 1 @tab Clock enable +@item cs_n @tab O @tab 1 @tab Chip select, active low +@item dqm @tab O @tab 2 @tab Data mask +@item dq_i @tab I @tab 16 @tab Data input vector +@item dq_o @tab O @tab 16 @tab Data output vector +@item dq_oe @tab O @tab 1 @tab Data output enable +@end multitable + +@subsection System signals +@multitable @columnfractions .2 .1 .1 .6 +@headitem Name @tab Dir @tab Width @tab Description +@item clk @tab I @tab 1 @tab SDRAM system clock +@item rst @tab I @tab 1 @tab Asynchronous reset, active hig +@end multitable + +@node SDR SDRAM 16 bit data bus controller +@chapter SDR SDRAM 16 bit data bus controller +@cindex SDR SDRAM 16 bit data bus controller + +@section State machine implementation + +Design is based on a state machine as described below. + +@image{sdr_sdram_16,14cm,16cm,,.png} + +A counter is incremented on each cycle the state machine reside in any given state. +When changing state a counter clear is issued. The counter state vector is used for +two things +@itemize +@item controlling outputs, ie defining cmd and other control signals +@item to make sure timing reqiurements are fulfilled, ie define time from precharge to activate +@end itemize + +@subsection State - init + +The init state is responsible to make sure that a proper start-up and initialization of the SDRAM is +performed. The following sequence should be applied: +@enumerate +@item assert CKE low +@item provide stable clock +@item bring CKE high +@item perform PRECHARGE ALL command and wait for tRP +@item issue AUTO RERFESH and wait for tRFC +@item issue AUTO RERFESH and wait for tRFC +@item LOAD MODE REGISTER and wait for tMR +@end enumerate +After this state machine advances to idle state + +@subsection State - idle + +In state idle implementation awaits two different condition, appearing in order of priority +@enumerate +@item refresh request => next state is rfr +@item cyc_i & stb_i => next state is adr +@end enumerate + + +@subsection State - adr + +Depending on status of open bank and open rows choice is taken whether to precharge and activate, activate or go +directly to read write state. Reason for this as a separate state is to be able to have comparison result as a +registered signal to achive an higher clock frequency. + +@subsection State - pch + +Open row in current bank is deactivated. State machine waits in pch state to fulfill tRP. + +@subsection State - act + +Row in current bank is activated. State machine waits in act state to fulfill tRCD. + +@subsection State - rw + +A two word read or write burst is started. If wishbone cycle is of type burst column will get incremented +with possible wrap around and a new burst started for each 32 bit word. + +@section Timing + +The follwoing timing requirements must be fulfilled: + +@itemize +@item tMR - Load Mode Register period +@item tRCD - Active to read/write delay +@item tRP - Precharge command period +@item tRFC - Auto refresh period +@item tREF - refresh period +@end itemize + +In the SDRAM datasheet the above timing figures will be given in ns and should be +converted to number of clock cycles. All of the above timing figures, except tREF, are implemented as parameters +in the design and should be set depending on SDRAM figures and actual clock period. All +parameters have default values of 2 clock cycles. + +@subsection Bank/Row activation - tRCD + +@image{tRCD,15cm,5cm,,.png} + +Minimum time between activation of and read or write command. +@subsection Auto refresh mode + +@image{aref,15cm,15cm,,.png} + +Minumum time between precharge and auto refresh and active command. + +@subsection Refresh period - tREF + +The auto refresh period, tREF must be met. During auto refresh an internal address counter +is used and adress signals are treated as don't care. During the refresh period each row must +be refreshed. @* +For example consider a SDRAM with tREF = 64 ms and row size of 8K. An auto refresh command +should be issued once every 64 ms / 8192 = 7.813 us.@* +The refresh interval counter is implemented as an LFSR style counter for minimal area and maximum +performance. To accurately set the wrap value for this counter use the application VersatileCounter found +in the versatile library project at opencores. This program gives the wrap value for a given vector length. +Assuming an SDRAM clock frequency of 133 MHz which equals a period time of 7.5 ns we should issue an auto +refresh every 7.813 us / 7.5 ns = 1041 cycle. We need a state vector of 11 bits in the counter.@* +To get the wrap value we use the application@* +@command{./VersatileCounter.php 11 1041@*11111110101} + +@node Example: Timing setup +@chapter Example: Timing setup + +@section Requirements + +SDRAM device to use: +@itemize +@item Micron MT48LC32M16-7E +@end itemize + +@multitable @columnfractions .4 .2 .1 .1 .1 .1 +@headitem Parameter @tab Symbol @tab Min @tab Max @tab Unit +@item Auto refresh period @tab tRFC @tab 66 @tab - @tab ns +@item Precharge command period @tab tRP @tab 15 @tab - @tab ns +@item Active to read or write delay @tab tRCD @tab 15 @tab - @tab ns +@item Load mode register command to active or refresh @tab tMRD @tab 2 @tab - @tab tCK +@item Refresh periods (8192 rows) @tab tREF @tab 66 @tab -@tab ms +@end multitable + +Intended operating frequency is 75 MHz, tCK = 13.333 ns + +@section Parameter settings + +@multitable @columnfractions .2 .8 +@headitem Symbol @tab Value +@item tRFC @tab 5 +@item tRP @tab 2 +@item tRCD @tab 2 +@item tMRD @tab 2 +@end multitable +@* +Refresh rate is 66 ms / 8192 = 8.057 us@* +Number of clock cycles between refresh request 8.057 us / 13.333 ns = 604@* +@* +To get the wrap value we use the application from Versatile Library@* +@command{./VersatileCounter.php 10 604@*0101001110} + + +@c **************************************************************************** +@c End bits +@c **************************************************************************** + +@node GNU Free Documentation License +@chapter GNU Free Documentation License +@cindex license for @value{DESIGN} + +@include fdl.texi + +@node Index + +@unnumbered Index + +@printindex cp + +@bye Index: versatile_mem_ctrl/tags/Rev2/doc/src/aref.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/aref.png =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/aref.png (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/aref.png (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/aref.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/sdr_sdram_16.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/sdr_sdram_16.png =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/sdr_sdram_16.png (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/sdr_sdram_16.png (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/sdr_sdram_16.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/sdr_sdram_16.fsm =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/sdr_sdram_16.fsm (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/sdr_sdram_16.fsm (revision 109) @@ -0,0 +1,75 @@ + + + + + s_out7,s_out6,s_out5,s_out4,s_out3,s_out2,s_out1,s_out0 + i_7,i_6,i_5,i_4,i_3,i_2,i_1,i_0 + o_7,o_6,o_5,o_4,o_3,o_2,o_1,o_0 + + init + idle + rfr + adr + rw + pch + act + + 0 + 1 + init_done + + + + 1 + 2 + refresh_req + + + + 1 + 3 + cyc&stb + + + + 2 + 1 + tRFC + + + + 3 + 6 + current_bank_closed + + + + 3 + 4 + current_row_open + + + + 3 + + + + + 5 + 6 + tRP + + + + 6 + 4 + tRCD + + + + 1 + end_of_cycle + + + + Index: versatile_mem_ctrl/tags/Rev2/doc/src/Makefile =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/Makefile (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/Makefile (revision 109) @@ -0,0 +1,9 @@ +MDIO-timing: + drawtiming --output MDIO_rd.png MDIO_rd.dt + drawtiming --output MDIO_wr.png MDIO_wr.dt + +texinfo: + texi2pdf versatile_mem_ctrl.texi + mv versatile_mem_ctrl.pdf ../ + +all: texinfo Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb.png =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb.png (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb.png (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram.png =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram.png (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram.png (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb.odg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb.odg =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb.odg (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb.odg (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb.odg Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb-arbiter.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb-arbiter.png =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb-arbiter.png (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb-arbiter.png (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb-arbiter.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram.odg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram.odg =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram.odg (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram.odg (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram.odg Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb-arbiter.odg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb-arbiter.odg =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb-arbiter.odg (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb-arbiter.odg (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/block-sdram-wbwb-arbiter.odg Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/fdl.texi =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/fdl.texi (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/fdl.texi (revision 109) @@ -0,0 +1,451 @@ +@c The GNU Free Documentation License. +@center Version 1.2, November 2002 + +@c This file is intended to be included within another document, +@c hence no sectioning command or @node. + +@display +Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc. +51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document @dfn{free} in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The ``Document'', below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as ``you''. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +@sc{ascii} without markup, Texinfo input format, La@TeX{} input +format, @acronym{SGML} or @acronym{XML} using a publicly available +@acronym{DTD}, and standard-conforming simple @acronym{HTML}, +PostScript or @acronym{PDF} designed for human modification. Examples +of transparent image formats include @acronym{PNG}, @acronym{XCF} and +@acronym{JPG}. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, @acronym{SGML} or +@acronym{XML} for which the @acronym{DTD} and/or processing tools are +not generally available, and the machine-generated @acronym{HTML}, +PostScript or @acronym{PDF} produced by some word processors for +output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +A section ``Entitled XYZ'' means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as ``Acknowledgements'', +``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' +of such a section when you modify the Document means that it remains a +section ``Entitled XYZ'' according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section Entitled ``History'', Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section Entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section to be Entitled ``Endorsements'' or +to conflict in title with any Invariant Section. + +@item +Preserve any Warranty Disclaimers. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled ``History'' +in the various original documents, forming one section Entitled +``History''; likewise combine any sections Entitled ``Acknowledgements'', +and any sections Entitled ``Dedications''. You must delete all +sections Entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an ``aggregate'' if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled ``Acknowledgements'', +``Dedications'', or ``History'', the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + +@item +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +@uref{http://www.gnu.org/copyleft/}. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. +@end enumerate + +@page +@heading ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the ``with@dots{}Texts.'' line with this: + +@smallexample +@group + with the Invariant Sections being @var{list their titles}, with + the Front-Cover Texts being @var{list}, and with the Back-Cover Texts + being @var{list}. +@end group +@end smallexample + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: + Index: versatile_mem_ctrl/tags/Rev2/doc/src/version.texi =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/version.texi (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/version.texi (revision 109) @@ -0,0 +1,4 @@ +@set UPDATED 27 December 2010 +@set UPDATED-MONTH December 2010 +@set EDITION 1 +@set VERSION 1.0 Index: versatile_mem_ctrl/tags/Rev2/doc/src/sdr_16.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/sdr_16.png =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/sdr_16.png (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/sdr_16.png (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/sdr_16.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/versatile_mem_ctrl.odt =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/versatile_mem_ctrl.odt =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/versatile_mem_ctrl.odt (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/versatile_mem_ctrl.odt (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/versatile_mem_ctrl.odt Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/doc/src/sdr_16.fzm =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/sdr_16.fzm (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/sdr_16.fzm (revision 109) @@ -0,0 +1,2981 @@ +## File last modified by Fizzim: 3:05:51 PM on 4/9/10 + + 9.10.05 + + + + + + ABS + + + fsm_sdr_16 + + GLOBAL_VAR + + + + 0 + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + -1 + + + + + ABS + + + sdram_clk + + GLOBAL_VAR + + + + 0 + + GLOBAL_VAR + + + + posedge + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + -1 + + + + + + + + + + + ABS + + + def_name + + GLOBAL_VAR + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + -1 + + + + + + + ABS + + + def_name + + GLOBAL_VAR + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + -1 + + + + + ABS + + + 1 + + GLOBAL_VAR + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + -1 + + + + + + Page 1 + +## START PREFERENCES + +8 + + +13 + + +true + + +20 + + +Arial +11 + + +-16777216 + + +Arial +11 + + +false +25 + + +936 + + +1296 + + +130 + + +130 + +## END PREFERENCES +## START OBJECTS + +fzm_globalTable + + 10 + + + 10 + + + 1 + + +## START STATE OBJECT + + + + + ABS + + + init + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + 346 + + + 17 + + + 446 + + + 117 + + + false + + + 1 + + + -16777216 + + +## END STATE OBJECT +## START STATE OBJECT + + + + + ABS + + + idle + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + 346 + + + 176 + + + 446 + + + 276 + + + false + + + 1 + + + -16777216 + + +## END STATE OBJECT +## START STATE OBJECT + + + + + ABS + + + adr + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + 344 + + + 384 + + + 444 + + + 484 + + + false + + + 1 + + + -16777216 + + +## END STATE OBJECT +## START STATE OBJECT + + + + + ABS + + + rw + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + 351 + + + 719 + + + 451 + + + 819 + + + false + + + 1 + + + -16777216 + + +## END STATE OBJECT +## START STATE OBJECT + + + + + ABS + + + rfr + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + 530 + + + 158 + + + 630 + + + 258 + + + false + + + 1 + + + -16777216 + + +## END STATE OBJECT +## START STATE OBJECT + + + + + ABS + + + pch + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + 51 + + + 391 + + + 151 + + + 491 + + + false + + + 1 + + + -16777216 + + +## END STATE OBJECT +## START STATE OBJECT + + + + + ABS + + + act + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + 52 + + + 577 + + + 152 + + + 677 + + + false + + + 1 + + + -16777216 + + +## END STATE OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans0 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + 1 + + GLOBAL_VAR + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + init + + + idle + + + 396.0 + + + 117.0 + + + 396.0 + + + 176.0 + + + 396.0 + + + 135.0 + + + 396.0 + + + 151.0 + + + 9 + + + 27 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans1 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + refresh_req + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + -38 + + + 1 + + + + + idle + + + rfr + + + 439.0 + + + 200.0 + + + 536.0 + + + 183.0 + + + 468.0 + + + 175.0 + + + 504.0 + + + 162.0 + + + 33 + + + 21 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans2 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + 1 + + GLOBAL_VAR + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + rfr + + + idle + + + 541.0 + + + 240.0 + + + 445.0 + + + 234.0 + + + 507.0 + + + 270.0 + + + 473.0 + + + 251.0 + + + 14 + + + 1 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans3 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + !fifo_empty + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + -42 + + + -1 + + + 1 + + + + + idle + + + adr + + + 396.0 + + + 276.0 + + + 394.0 + + + 384.0 + + + 393.0 + + + 286.0 + + + 394.0 + + + 364.0 + + + 9 + + + 27 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans4 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + open_row != row + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 11 + + + -55 + + + 1 + + + + + adr + + + pch + + + 347.0 + + + 416.0 + + + 133.0 + + + 402.0 + + + 299.0 + + + 378.0 + + + 217.0 + + + 368.0 + + + 20 + + + 31 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans5 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + 1 + + GLOBAL_VAR + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + pch + + + act + + + 101.0 + + + 491.0 + + + 101.0 + + + 577.0 + + + 100.0 + + + 501.0 + + + 99.0 + + + 554.0 + + + 9 + + + 27 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans6 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + 1 + + GLOBAL_VAR + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + act + + + rw + + + 102.0 + + + 677.0 + + + 351.0 + + + 769.0 + + + 102.0 + + + 806.0 + + + 298.0 + + + 764.0 + + + 9 + + + 18 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans7 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + 1 + + GLOBAL_VAR + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + rw + + + idle + + + 447.0 + + + 751.0 + + + 434.0 + + + 258.0 + + + 639.0 + + + 672.0 + + + 539.0 + + + 340.0 + + + 34 + + + 4 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans8 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + open_row == row + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 63 + + + -49 + + + 1 + + + + + adr + + + rw + + + 402.0 + + + 483.0 + + + 401.0 + + + 719.0 + + + 402.0 + + + 500.0 + + + 401.0 + + + 700.0 + + + 8 + + + 27 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans9 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + row_closed + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + -15 + + + -51 + + + 1 + + + + + adr + + + act + + + 355.0 + + + 466.0 + + + 127.0 + + + 583.0 + + + 295.0 + + + 479.0 + + + 175.0 + + + 523.0 + + + 14 + + + 30 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE OBJECT + + + + + ABS + + + w4d + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + 247 + + + 577 + + + 347 + + + 677 + + + false + + + 1 + + + -16777216 + + +## END STATE OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans10 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + we & open_row == row + + LOCAL + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + -84 + + + 15 + + + 1 + + + + + adr + + + w4d + + + 376.0 + + + 480.0 + + + 322.0 + + + 583.0 + + + 345.0 + + + 511.0 + + + 332.0 + + + 548.0 + + + 11 + + + 30 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans11 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + 1 + + GLOBAL_VAR + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + w4d + + + rw + + + 329.0 + + + 665.0 + + + 383.0 + + + 722.0 + + + 342.0 + + + 670.0 + + + 381.0 + + + 709.0 + + + 5 + + + 25 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## START STATE TRANSITION OBJECT + + + + + ABS + + + trans12 + + LOCAL + + + + 0 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + ABS + + + 1 + + GLOBAL_VAR + + + + 1 + + GLOBAL_VAR + + + + def_type + + GLOBAL_VAR + + + + + + GLOBAL_VAR + + + + -16777216 + + GLOBAL_VAR + + + + 0 + + + 0 + + + 1 + + + + + act + + + w4d + + + 151.0 + + + 618.0 + + + 247.0 + + + 618.0 + + + 168.0 + + + 618.0 + + + 229.0 + + + 618.0 + + + 35 + + + 19 + + + 1 + + + -16777216 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + 0.0 + + + false + + +## END STATE TRANSITION OBJECT +## END OBJECTS Index: versatile_mem_ctrl/tags/Rev2/doc/src/block.dia =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: versatile_mem_ctrl/tags/Rev2/doc/src/block.dia =================================================================== --- versatile_mem_ctrl/tags/Rev2/doc/src/block.dia (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/doc/src/block.dia (revision 109)
versatile_mem_ctrl/tags/Rev2/doc/src/block.dia Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/rtl/verilog/sdr_sdram_16_ctrl.v =================================================================== --- versatile_mem_ctrl/tags/Rev2/rtl/verilog/sdr_sdram_16_ctrl.v (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/rtl/verilog/sdr_sdram_16_ctrl.v (revision 109) @@ -0,0 +1,347 @@ +`timescale 1ns/1ns +module sdr_sdram_16_ctrl ( + // wisbone i/f +`ifdef NO_BURST + dat_i, adr_i, sel_i, we_i, cyc_i, stb_i, dat_o, ack_o, +`else + dat_i, adr_i, sel_i, bte_i, we_i, cyc_i, stb_i, dat_o, ack_o, +`endif + // SDR SDRAM + ba, a, cmd, cke, cs_n, dqm, dq_i, dq_o, dq_oe, + // system + clk, rst); + + // memory geometry parameters + parameter ba_size = 2; + parameter row_size = 13; + parameter col_size = 9; + parameter cl = 2; + // memory timing parameters + parameter tRFC = 9; + parameter tRP = 2; + parameter tRCD = 2; + parameter tMRD = 2; + + // LMR + // [12:10] reserved + // [9] WB, write burst; 0 - programmed burst length, 1 - single location + // [8:7] OP Mode, 2'b00 + // [6:4] CAS Latency; 3'b010 - 2, 3'b011 - 3 + // [3] BT, Burst Type; 1'b0 - sequential, 1'b1 - interleaved + // [2:0] Burst length; 3'b000 - 1, 3'b001 - 2, 3'b010 - 4, 3'b011 - 8, 3'b111 - full page + parameter init_wb = 1'b0; + parameter init_cl = (cl==2) ? 3'b010 : 3'b011; + parameter init_bt = 1'b0; + parameter init_bl = 3'b001; + + input [31:0] dat_i; + input [ba_size+col_size+row_size:1] adr_i; + input [3:0] sel_i; +`ifndef NO_BURST + input [1:0] bte_i; +`endif + input we_i, cyc_i, stb_i; + output [31:0] dat_o; + output ack_o; + + output [ba_size-1:0] ba; + output reg [12:0] a; + output reg [2:0] cmd; // {ras,cas,we} + output cke, cs_n; + output reg [1:0] dqm; + output [15:0] dq_o; + output reg dq_oe; + input [15:0] dq_i; + + input clk, rst; + + wire [ba_size-1:0] bank; + wire [row_size-1:0] row; + wire [col_size-1:0] col; + wire [12:0] col_a10_fix; +`ifdef BEAT16 + parameter col_reg_width = 5; + reg [4:0] col_reg; +`else +`ifdef BEAT8 + parameter col_reg_width = 4; + reg [3:0] col_reg; +`else +`ifdef BEAT4 + parameter col_reg_width = 3; + reg [2:0] col_reg; +`endif +`endif +`endif + wire [0:31] shreg; + wire count0; + wire stall; // active if write burst need data + wire ref_cnt_zero; + reg refresh_req; + + wire ack_rd, rd_ack_emptyflag; + wire ack_wr; + + // to keep track of open rows per bank + reg [row_size-1:0] open_row[0:3]; + reg [0:3] open_ba; + reg current_bank_closed, current_row_open; + +`ifndef RFR_WRAP_VALUE + parameter rfr_length = 10; + parameter rfr_wrap_value = 1010; +`else + parameter rfr_length = `RFR_LENGTH; + parameter rfr_wrap_value = `RFR_WRAP_VALUE; +`endif + + // cti + parameter [2:0] classic = 3'b000, + endofburst = 3'b111; + + // bte + parameter [1:0] linear = 2'b00, + beat4 = 2'b01, + beat8 = 2'b10, + beat16 = 2'b11; + + parameter [2:0] cmd_nop = 3'b111, + cmd_act = 3'b011, + cmd_rd = 3'b101, + cmd_wr = 3'b100, + cmd_pch = 3'b010, + cmd_rfr = 3'b001, + cmd_lmr = 3'b000; + +// ctrl FSM +`define FSM_INIT 3'b000 +`define FSM_IDLE 3'b001 +`define FSM_RFR 3'b010 +`define FSM_ADR 3'b011 +`define FSM_PCH 3'b100 +`define FSM_ACT 3'b101 +`define FSM_RW 3'b111 + + assign cke = 1'b1; + assign cs_n = 1'b0; + + reg [2:0] state, next; + + function [12:0] a10_fix; + input [col_size-1:0] a; + integer i; + begin + for (i=0;i<13;i=i+1) begin + if (i<10) + if (i sdr_sdram_16_ctrl_actel.v + +export: + svn export http://opencores.org/ocsvn/versatile_library/versatile_library/trunk/rtl/verilog/versatile_library.v + +# the single all rule +all: sdr_sdram_16_ctrl_actel.v + +clean: + rm -rf $(VERSATILE_FIFO_PROJECT_FILES) $(VERSATILE_COUNTER_PROJECT_FILES) + rm -rf fifo_fill.v sdr_16.v ddr_16.v + rm -f versatile_fifo_dual_port_ram_dc_dw.v ddr_16_generated.v + rm -rf *_counter.v + rm -rf *.csv + rm -rf *~ + rm -rf sdr_sdram_16_ctrl_actel.v Index: versatile_mem_ctrl/tags/Rev2/rtl/verilog/copyright.v =================================================================== --- versatile_mem_ctrl/tags/Rev2/rtl/verilog/copyright.v (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/rtl/verilog/copyright.v (revision 109) @@ -0,0 +1,41 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// Versatile memory controller //// +//// //// +//// Description //// +//// A modular wishbone compatible memory controller with support//// +//// for various types of memory configurations //// +//// //// +//// To Do: //// +//// - add support for additional SDRAM variants //// +//// //// +//// Author(s): //// +//// - Michael Unneback, unneback@opencores.org //// +//// ORSoC AB //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2009 Authors and OPENCORES.ORG //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source is distributed in the hope that it will be //// +//// useful, but WITHOUT ANY WARRANTY; without even the implied //// +//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// +//// PURPOSE. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// Index: versatile_mem_ctrl/tags/Rev2/bench/tb.v =================================================================== --- versatile_mem_ctrl/tags/Rev2/bench/tb.v (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/bench/tb.v (revision 109) @@ -0,0 +1,222 @@ +//`include "tb_defines.v" +`timescale 1ns/1ns +module versatile_mem_ctrl_tb + ( + output OK + ); + +`ifdef NR_OF_WBM + parameter nr_of_wbm = `NR_OF_WBM; +`else + parameter nr_of_wbm = 1; +`endif + +`ifdef SDRAM_CLK_PERIOD + parameter sdram_clk_period = `SDRAM_CLK_PERIOD; +`else + parameter sdram_clk_period = 8; +`endif + +`ifdef WB_CLK_PERIODS + parameter [1:nr_of_wbm] wb_clk_periods = {`WB_CLK_PERIODS}; +`else + parameter [1:nr_of_wbm] wb_clk_periods = (20); +`endif + parameter wb_clk_period = 20; + + wire [31:0] wbm_a_dat_o; + wire [3:0] wbm_a_sel_o; + wire [31:0] wbm_a_adr_o; + wire [2:0] wbm_a_cti_o; + wire [1:0] wbm_a_bte_o; + wire wbm_a_we_o ; + wire wbm_a_cyc_o; + wire wbm_a_stb_o; + wire [31:0] wbm_a_dat_i; + wire wbm_a_ack_i; + reg wbm_a_clk ; + reg wbm_a_rst ; + + wire [31:0] wbm_b_dat_o; + wire [3:0] wbm_b_sel_o; + wire [31:2] wbm_b_adr_o; + wire [2:0] wbm_b_cti_o; + wire [1:0] wbm_b_bte_o; + wire wbm_b_we_o ; + wire wbm_b_cyc_o; + wire wbm_b_stb_o; + wire [31:0] wbm_b_dat_i; + wire wbm_b_ack_i; + + wire [31:0] wb_sdram_dat_i; + wire [3:0] wb_sdram_sel_i; + wire [31:2] wb_sdram_adr_i; + wire [2:0] wb_sdram_cti_i; + wire [1:0] wb_sdram_bte_i; + wire wb_sdram_we_i; + wire wb_sdram_cyc_i; + wire wb_sdram_stb_i; + wire [31:0] wb_sdram_dat_o; + wire wb_sdram_ack_o; + reg wb_sdram_clk; + reg wb_sdram_rst; + + wire wbm_OK; + + genvar i; + +`define DUT sdr_sdram_16_ctrl +`define SDR 16 +`ifdef SDR + wire [1:0] ba, ba_pad; + wire [12:0] a, a_pad; + wire [`SDR-1:0] dq_i, dq_o, dq_pad; + wire dq_oe; + wire [1:0] dqm, dqm_pad; + wire cke, cke_pad, cs_n, cs_n_pad, ras, ras_pad, cas, cas_pad, we, we_pad; + + vl_o_dff # ( .width(20), .reset_value({2'b00, 13'h0,3'b111,2'b11})) o0( + .d_i({ba,a,ras,cas,we,dqm}), + .o_pad({ba_pad,a_pad,ras_pad, cas_pad, we_pad, dqm_pad}), + .clk(wb_sdram_clk), + .rst(wb_sdram_rst)); + /* + assign #1 {ba_pad,a_pad} = {ba,a}; + assign #1 {ras_pad, cas_pad, we_pad} = {ras,cas,we}; + assign #1 dqm_pad = dqm;*/ + assign #1 cke_pad = cke; + assign cs_n_pad = cs_n; + vl_io_dff_oe # ( .width(16)) io0 ( + .d_i(dq_i), + .d_o(dq_o), + .oe(dq_oe), + .io_pad(dq_pad), + .clk(wb_sdram_clk), + .rst(wb_sdram_rst)); + + mt48lc16m16a2 mem( + .Dq(dq_pad), + .Addr(a_pad), + .Ba(ba_pad), + .Clk(wb_sdram_clk), + .Cke(cke_pad), + .Cs_n(cs_n_pad), + .Ras_n(ras_pad), + .Cas_n(cas_pad), + .We_n(we_pad), + .Dqm(dqm_pad)); + + `DUT + # (.tRFC(9), .cl(3)) + DUT( + // wisbone i/f + .dat_i(wbm_b_dat_o), + .adr_i({wbm_b_adr_o[24:2],1'b0}), + .sel_i(wbm_b_sel_o), +`ifndef NO_BURST + .bte_i(wbm_b_bte_o), +`endif + .we_i (wbm_b_we_o), + .cyc_i(wbm_b_cyc_o), + .stb_i(wbm_b_stb_o), + .dat_o(wbm_b_dat_i), + .ack_o(wbm_b_ack_i), + // SDR SDRAM + .ba(ba), + .a(a), + .cmd({ras, cas, we}), + .cke(cke), + .cs_n(cs_n), + .dqm(dqm), + .dq_i(dq_i), + .dq_o(dq_o), + .dq_oe(dq_oe), + // system + .clk(wb_sdram_clk), .rst(wb_sdram_rst)); + +`endif + +// wishbone master + + wbm wbmi( + .adr_o(wbm_a_adr_o), + .bte_o(wbm_a_bte_o), + .cti_o(wbm_a_cti_o), + .dat_o(wbm_a_dat_o), + .sel_o(wbm_a_sel_o), + .we_o (wbm_a_we_o), + .cyc_o(wbm_a_cyc_o), + .stb_o(wbm_a_stb_o), + .dat_i(wbm_a_dat_i), + .ack_i(wbm_a_ack_i), + .clk(wbm_a_clk), + .reset(wbm_a_rst), + .OK(wbm_OK) +); + + vl_wb3wb3_bridge wbwb_bridgei ( + // wishbone slave side + .wbs_dat_i(wbm_a_dat_o), + .wbs_adr_i(wbm_a_adr_o[31:2]), + .wbs_sel_i(wbm_a_sel_o), + .wbs_bte_i(wbm_a_bte_o), + .wbs_cti_i(wbm_a_cti_o), + .wbs_we_i (wbm_a_we_o), + .wbs_cyc_i(wbm_a_cyc_o), + .wbs_stb_i(wbm_a_stb_o), + .wbs_dat_o(wbm_a_dat_i), + .wbs_ack_o(wbm_a_ack_i), + .wbs_clk(wbm_a_clk), + .wbs_rst(wbm_a_rst), + // wishbone master side + .wbm_dat_o(wbm_b_dat_o), + .wbm_adr_o(wbm_b_adr_o), + .wbm_sel_o(wbm_b_sel_o), + .wbm_bte_o(wbm_b_bte_o), + .wbm_cti_o(wbm_b_cti_o), + .wbm_we_o (wbm_b_we_o), + .wbm_cyc_o(wbm_b_cyc_o), + .wbm_stb_o(wbm_b_stb_o), + .wbm_dat_i(wbm_b_dat_i), + .wbm_ack_i(wbm_b_ack_i), + .wbm_clk(wb_sdram_clk), + .wbm_rst(wb_sdram_rst)); + + + + assign OK = wbm_OK; + + + // Wishbone reset + initial + begin + #0 wbm_a_rst = 1'b1; + #200 wbm_a_rst = 1'b0; + end + + // Wishbone clock + initial + begin + #0 wbm_a_clk = 1'b0; + forever + #(wb_clk_period/2) wbm_a_clk = !wbm_a_clk; + end + + + + // SDRAM reset + initial + begin + #0 wb_sdram_rst = 1'b1; + #200 wb_sdram_rst = 1'b0; + end + + // SDRAM clock + initial + begin + #0 wb_sdram_clk = 1'b0; + forever + #(sdram_clk_period/2) wb_sdram_clk = !wb_sdram_clk; + end + +endmodule // versatile_mem_ctrl_tb
versatile_mem_ctrl/tags/Rev2/bench/tb.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/bench/wbm.v =================================================================== --- versatile_mem_ctrl/tags/Rev2/bench/wbm.v (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/bench/wbm.v (revision 109) @@ -0,0 +1,144 @@ +`timescale 1ns/1ns +module wbm ( + output [31:0] adr_o, + output [1:0] bte_o, + output [2:0] cti_o, + output [31:0] dat_o, + output [3:0] sel_o, + output we_o, + output cyc_o, + output stb_o, + input wire [31:0] dat_i, + input wire ack_i, + input wire clk, + input wire reset, + output reg OK +); + + parameter [1:0] linear = 2'b00, + beat4 = 2'b01, + beat8 = 2'b10, + beat16 = 2'b11; + + parameter [2:0] classic = 3'b000, + inc = 3'b010, + eob = 3'b111; + + parameter instructions = 32; + + // {adr_o,bte_o,cti_o,dat_o,sel_o,we_o,cyc_o,stb_o} + parameter [32+2+3+32+4+1+1+1:1] inst_rom [0:instructions-1]= { + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + + {32'h100,linear,classic,32'h12345678,4'b1111,1'b1,1'b1,1'b1}, // write 0x12345678 @ 0x100 + {32'h100,linear,classic,32'h0,4'b1111,1'b0,1'b1,1'b1}, // read @ 0x100 + + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + + {32'hA000,beat4,inc,32'h00010002,4'b1111,1'b1,1'b1,1'b1}, // write burst + {32'hA004,beat4,inc,32'h00030004,4'b1111,1'b1,1'b1,1'b1}, + {32'hA008,beat4,inc,32'h00050006,4'b1111,1'b1,1'b1,1'b1}, + {32'hA00C,beat4,eob,32'h00070008,4'b1111,1'b1,1'b1,1'b1}, + + {32'hA008,linear,classic,32'hA1FFFFFF,4'b1000,1'b1,1'b1,1'b1},// write byte + + {32'hA000,beat4,inc,32'h0,4'b1111,1'b0,1'b1,1'b1}, // read burst + {32'hA004,beat4,inc,32'h0,4'b1111,1'b0,1'b1,1'b1}, + {32'hA008,beat4,inc,32'h0,4'b1111,1'b0,1'b1,1'b1}, + {32'hA00C,beat4,eob,32'h0,4'b1111,1'b0,1'b1,1'b1}, + + {32'h1000,linear,inc,32'hdeaddead,4'b1111,1'b1,1'b1,1'b1}, // write + {32'h1004,linear,eob,32'h55555555,4'b1111,1'b1,1'b1,1'b1}, // + + {32'h1000,linear,inc,32'h0,4'b1111,1'b0,1'b1,1'b1}, // read + {32'h1004,linear,eob,32'h0,4'b1111,1'b0,1'b1,1'b1}, // read + + {32'hA008,beat4,inc,32'h0,4'b1111,1'b0,1'b1,1'b1}, // read burst + {32'hA00C,beat4,inc,32'h0,4'b1111,1'b0,1'b1,1'b1}, + {32'hA000,beat4,inc,32'h0,4'b1111,1'b0,1'b1,1'b1}, + {32'hA004,beat4,eob,32'h0,4'b1111,1'b0,1'b1,1'b1}, + + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}, + {32'h0,linear,classic,32'h0,4'b1111,1'b0,1'b0,1'b0}}; + + parameter [31:0] dat [0:instructions-1] = { + 32'h0, + 32'h0, + 32'h0, + 32'h12345678, + 32'h0, + 32'h0, + 32'h0, + 32'h0, + 32'h0, + 32'h0, + 32'h00010002, + 32'h00030004, + 32'ha1050006, + 32'h00070008, + 32'h0, + 32'h0, + 32'hdeaddead, + 32'h55555555, + 32'ha1050006, + 32'h00070008, + 32'h00010002, + 32'h00030004, + 32'h0, + 32'h0, + 32'h0, + 32'h0, + 32'h0, + 32'h0, + 32'h0, + 32'h0, + 32'h0, + 32'h0, + 32'h0}; + +// parameter idle = 1'b0; +// parameter active = 1'b1; +// +// reg state; + + integer i; + + assign {adr_o,bte_o,cti_o,dat_o,sel_o,we_o,cyc_o,stb_o} = inst_rom[i]; + + always @ (posedge clk or posedge reset) + if (reset) + i = 0; + else + if ((!stb_o | ack_i) & i < instructions - 1) + i = i + 1; + + always @ (posedge clk or posedge reset) + if (reset) + OK <= 1'b1; + else + if (ack_i & !we_o & (dat_i != dat[i])) begin + OK <= 1'b0; + $display ("wrong read value %h @ %h at %t", dat_i, adr_o, $time); + end else if (ack_i & !we_o & (dat_i == dat[i])) + $display ("read value %h @ %h at %t", dat_i, adr_o, $time); + else if (ack_i) + $display ("write value %h %b @ %h at %t", dat_o, sel_o, adr_o, $time); + +// always @ (posedge clk or posedge reset) +// if (reset) +// state <= idle; +// else +// if (state==idle & cyc_o) +// state <= active; +// else if ((cti_o==3'b000 | cti_o==3'b111) & cyc_o & stb_o & ack_i) +// state <= idle; + +endmodule Index: versatile_mem_ctrl/tags/Rev2/bench/mt48lc16m16a2.v =================================================================== --- versatile_mem_ctrl/tags/Rev2/bench/mt48lc16m16a2.v (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/bench/mt48lc16m16a2.v (revision 109) @@ -0,0 +1,1072 @@ +/************************************************************************** +* +* File Name: MT48LC16M16A2.V +* Version: 2.1 +* Date: June 6th, 2002 +* Model: BUS Functional +* Simulator: Model Technology +* +* Dependencies: None +* +* Email: modelsupport@micron.com +* Company: Micron Technology, Inc. +* Model: MT48LC16M16A2 (4Meg x 16 x 4 Banks) +* +* Description: Micron 256Mb SDRAM Verilog model +* +* Limitation: - Doesn't check for 8192 cycle refresh +* +* Note: - Set simulator resolution to "ps" accuracy +* - Set Debug = 0 to disable $display messages +* +* Disclaimer: THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY +* WHATSOEVER AND MICRON SPECIFICALLY DISCLAIMS ANY +* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR +* A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT. +* +* Copyright © 2001 Micron Semiconductor Products, Inc. +* All rights researved +* +* Rev Author Date Changes +* --- -------------------------- --------------------------------------- +* 2.1 SH 06/06/2002 - Typo in bank multiplex +* Micron Technology Inc. +* +* 2.0 SH 04/30/2002 - Second release +* Micron Technology Inc. +* +**************************************************************************/ + +`timescale 1ns / 1ps + +module mt48lc16m16a2 (Dq, Addr, Ba, Clk, Cke, Cs_n, Ras_n, Cas_n, We_n, Dqm); + + parameter addr_bits = 13; + parameter data_bits = 16; + parameter col_bits = 9; + parameter mem_sizes = 4194303; + + inout [data_bits - 1 : 0] Dq; + input [addr_bits - 1 : 0] Addr; + input [1 : 0] Ba; + input Clk; + input Cke; + input Cs_n; + input Ras_n; + input Cas_n; + input We_n; + input [1 : 0] Dqm; + + reg [data_bits - 1 : 0] Bank0 [0 : mem_sizes]; + reg [data_bits - 1 : 0] Bank1 [0 : mem_sizes]; + reg [data_bits - 1 : 0] Bank2 [0 : mem_sizes]; + reg [data_bits - 1 : 0] Bank3 [0 : mem_sizes]; + + reg [1 : 0] Bank_addr [0 : 3]; // Bank Address Pipeline + reg [col_bits - 1 : 0] Col_addr [0 : 3]; // Column Address Pipeline + reg [3 : 0] Command [0 : 3]; // Command Operation Pipeline + reg [1 : 0] Dqm_reg0, Dqm_reg1; // DQM Operation Pipeline + reg [addr_bits - 1 : 0] B0_row_addr, B1_row_addr, B2_row_addr, B3_row_addr; + + reg [addr_bits - 1 : 0] Mode_reg; + reg [data_bits - 1 : 0] Dq_reg, Dq_dqm; + reg [col_bits - 1 : 0] Col_temp, Burst_counter; + + reg Act_b0, Act_b1, Act_b2, Act_b3; // Bank Activate + reg Pc_b0, Pc_b1, Pc_b2, Pc_b3; // Bank Precharge + + reg [1 : 0] Bank_precharge [0 : 3]; // Precharge Command + reg A10_precharge [0 : 3]; // Addr[10] = 1 (All banks) + reg Auto_precharge [0 : 3]; // RW Auto Precharge (Bank) + reg Read_precharge [0 : 3]; // R Auto Precharge + reg Write_precharge [0 : 3]; // W Auto Precharge + reg RW_interrupt_read [0 : 3]; // RW Interrupt Read with Auto Precharge + reg RW_interrupt_write [0 : 3]; // RW Interrupt Write with Auto Precharge + reg [1 : 0] RW_interrupt_bank; // RW Interrupt Bank + integer RW_interrupt_counter [0 : 3]; // RW Interrupt Counter + integer Count_precharge [0 : 3]; // RW Auto Precharge Counter + + reg Data_in_enable; + reg Data_out_enable; + + reg [1 : 0] Bank, Prev_bank; + reg [addr_bits - 1 : 0] Row; + reg [col_bits - 1 : 0] Col, Col_brst; + + // Internal system clock + reg CkeZ, Sys_clk; + + // Commands Decode + wire Active_enable = ~Cs_n & ~Ras_n & Cas_n & We_n; + wire Aref_enable = ~Cs_n & ~Ras_n & ~Cas_n & We_n; + wire Burst_term = ~Cs_n & Ras_n & Cas_n & ~We_n; + wire Mode_reg_enable = ~Cs_n & ~Ras_n & ~Cas_n & ~We_n; + wire Prech_enable = ~Cs_n & ~Ras_n & Cas_n & ~We_n; + wire Read_enable = ~Cs_n & Ras_n & ~Cas_n & We_n; + wire Write_enable = ~Cs_n & Ras_n & ~Cas_n & ~We_n; + + // Burst Length Decode + wire Burst_length_1 = ~Mode_reg[2] & ~Mode_reg[1] & ~Mode_reg[0]; + wire Burst_length_2 = ~Mode_reg[2] & ~Mode_reg[1] & Mode_reg[0]; + wire Burst_length_4 = ~Mode_reg[2] & Mode_reg[1] & ~Mode_reg[0]; + wire Burst_length_8 = ~Mode_reg[2] & Mode_reg[1] & Mode_reg[0]; + wire Burst_length_f = Mode_reg[2] & Mode_reg[1] & Mode_reg[0]; + + // CAS Latency Decode + wire Cas_latency_2 = ~Mode_reg[6] & Mode_reg[5] & ~Mode_reg[4]; + wire Cas_latency_3 = ~Mode_reg[6] & Mode_reg[5] & Mode_reg[4]; + + // Write Burst Mode + wire Write_burst_mode = Mode_reg[9]; + + wire Debug = 1'b0; // Debug messages : 1 = On + wire Dq_chk = Sys_clk & Data_in_enable; // Check setup/hold time for DQ + + assign Dq = Dq_reg; // DQ buffer + + // Commands Operation + `define ACT 0 + `define NOP 1 + `define READ 2 + `define WRITE 3 + `define PRECH 4 + `define A_REF 5 + `define BST 6 + `define LMR 7 + + // Timing Parameters for -7E PC133 CL2 + parameter tAC = 5.4; + parameter tHZ = 5.4; + parameter tOH = 3.0; + parameter tMRD = 2.0; // 2 Clk Cycles + parameter tRAS = 37.0; + parameter tRC = 60.0; + parameter tRCD = 15.0; + parameter tRFC = 66.0; + parameter tRP = 15.0; + parameter tRRD = 14.0; + parameter tWRa = 7.0; // A2 Version - Auto precharge mode (1 Clk + 7 ns) + parameter tWRm = 14.0; // A2 Version - Manual precharge mode (14 ns) + + // Timing Check variable + time MRD_chk; + time WR_chkm [0 : 3]; + time RFC_chk, RRD_chk; + time RC_chk0, RC_chk1, RC_chk2, RC_chk3; + time RAS_chk0, RAS_chk1, RAS_chk2, RAS_chk3; + time RCD_chk0, RCD_chk1, RCD_chk2, RCD_chk3; + time RP_chk0, RP_chk1, RP_chk2, RP_chk3; + + initial begin + Dq_reg = {data_bits{1'bz}}; + Data_in_enable = 0; Data_out_enable = 0; + Act_b0 = 1; Act_b1 = 1; Act_b2 = 1; Act_b3 = 1; + Pc_b0 = 0; Pc_b1 = 0; Pc_b2 = 0; Pc_b3 = 0; + WR_chkm[0] = 0; WR_chkm[1] = 0; WR_chkm[2] = 0; WR_chkm[3] = 0; + RW_interrupt_read[0] = 0; RW_interrupt_read[1] = 0; RW_interrupt_read[2] = 0; RW_interrupt_read[3] = 0; + RW_interrupt_write[0] = 0; RW_interrupt_write[1] = 0; RW_interrupt_write[2] = 0; RW_interrupt_write[3] = 0; + MRD_chk = 0; RFC_chk = 0; RRD_chk = 0; + RAS_chk0 = 0; RAS_chk1 = 0; RAS_chk2 = 0; RAS_chk3 = 0; + RCD_chk0 = 0; RCD_chk1 = 0; RCD_chk2 = 0; RCD_chk3 = 0; + RC_chk0 = 0; RC_chk1 = 0; RC_chk2 = 0; RC_chk3 = 0; + RP_chk0 = 0; RP_chk1 = 0; RP_chk2 = 0; RP_chk3 = 0; + $timeformat (-9, 1, " ns", 12); + end + + // System clock generator + always begin + @ (posedge Clk) begin + Sys_clk = CkeZ; + CkeZ = Cke; + end + @ (negedge Clk) begin + Sys_clk = 1'b0; + end + end + + always @ (posedge Sys_clk) begin + // Internal Commamd Pipelined + Command[0] = Command[1]; + Command[1] = Command[2]; + Command[2] = Command[3]; + Command[3] = `NOP; + + Col_addr[0] = Col_addr[1]; + Col_addr[1] = Col_addr[2]; + Col_addr[2] = Col_addr[3]; + Col_addr[3] = {col_bits{1'b0}}; + + Bank_addr[0] = Bank_addr[1]; + Bank_addr[1] = Bank_addr[2]; + Bank_addr[2] = Bank_addr[3]; + Bank_addr[3] = 2'b0; + + Bank_precharge[0] = Bank_precharge[1]; + Bank_precharge[1] = Bank_precharge[2]; + Bank_precharge[2] = Bank_precharge[3]; + Bank_precharge[3] = 2'b0; + + A10_precharge[0] = A10_precharge[1]; + A10_precharge[1] = A10_precharge[2]; + A10_precharge[2] = A10_precharge[3]; + A10_precharge[3] = 1'b0; + + // Dqm pipeline for Read + Dqm_reg0 = Dqm_reg1; + Dqm_reg1 = Dqm; + + // Read or Write with Auto Precharge Counter + if (Auto_precharge[0] === 1'b1) begin + Count_precharge[0] = Count_precharge[0] + 1; + end + if (Auto_precharge[1] === 1'b1) begin + Count_precharge[1] = Count_precharge[1] + 1; + end + if (Auto_precharge[2] === 1'b1) begin + Count_precharge[2] = Count_precharge[2] + 1; + end + if (Auto_precharge[3] === 1'b1) begin + Count_precharge[3] = Count_precharge[3] + 1; + end + + // Read or Write Interrupt Counter + if (RW_interrupt_write[0] === 1'b1) begin + RW_interrupt_counter[0] = RW_interrupt_counter[0] + 1; + end + if (RW_interrupt_write[1] === 1'b1) begin + RW_interrupt_counter[1] = RW_interrupt_counter[1] + 1; + end + if (RW_interrupt_write[2] === 1'b1) begin + RW_interrupt_counter[2] = RW_interrupt_counter[2] + 1; + end + if (RW_interrupt_write[3] === 1'b1) begin + RW_interrupt_counter[3] = RW_interrupt_counter[3] + 1; + end + + // tMRD Counter + MRD_chk = MRD_chk + 1; + + // Auto Refresh + if (Aref_enable === 1'b1) begin + if (Debug) begin + $display ("%m : at time %t AREF : Auto Refresh", $time); + end + + // Auto Refresh to Auto Refresh + if ($time - RFC_chk < tRFC) begin + $display ("%m : at time %t ERROR: tRFC violation during Auto Refresh", $time); + end + + // Precharge to Auto Refresh + if (($time - RP_chk0 < tRP) || ($time - RP_chk1 < tRP) || + ($time - RP_chk2 < tRP) || ($time - RP_chk3 < tRP)) begin + $display ("%m : at time %t ERROR: tRP violation during Auto Refresh", $time); + end + + // Precharge to Refresh + if (Pc_b0 === 1'b0 || Pc_b1 === 1'b0 || Pc_b2 === 1'b0 || Pc_b3 === 1'b0) begin + $display ("%m : at time %t ERROR: All banks must be Precharge before Auto Refresh", $time); + end + + // Load Mode Register to Auto Refresh + if (MRD_chk < tMRD) begin + $display ("%m : at time %t ERROR: tMRD violation during Auto Refresh", $time); + end + + // Record Current tRFC time + RFC_chk = $time; + end + + // Load Mode Register + if (Mode_reg_enable === 1'b1) begin + // Register Mode + Mode_reg = Addr; + + // Decode CAS Latency, Burst Length, Burst Type, and Write Burst Mode + if (Debug) begin + $display ("%m : at time %t LMR : Load Mode Register", $time); + // CAS Latency + case (Addr[6 : 4]) + 3'b010 : $display ("%m : CAS Latency = 2"); + 3'b011 : $display ("%m : CAS Latency = 3"); + default : $display ("%m : CAS Latency = Reserved"); + endcase + + // Burst Length + case (Addr[2 : 0]) + 3'b000 : $display ("%m : Burst Length = 1"); + 3'b001 : $display ("%m : Burst Length = 2"); + 3'b010 : $display ("%m : Burst Length = 4"); + 3'b011 : $display ("%m : Burst Length = 8"); + 3'b111 : $display ("%m : Burst Length = Full"); + default : $display ("%m : Burst Length = Reserved"); + endcase + + // Burst Type + if (Addr[3] === 1'b0) begin + $display ("%m : Burst Type = Sequential"); + end else if (Addr[3] === 1'b1) begin + $display ("%m : Burst Type = Interleaved"); + end else begin + $display ("%m : Burst Type = Reserved"); + end + + // Write Burst Mode + if (Addr[9] === 1'b0) begin + $display ("%m : Write Burst Mode = Programmed Burst Length"); + end else if (Addr[9] === 1'b1) begin + $display ("%m : Write Burst Mode = Single Location Access"); + end else begin + $display ("%m : Write Burst Mode = Reserved"); + end + end + + // Precharge to Load Mode Register + if (Pc_b0 === 1'b0 && Pc_b1 === 1'b0 && Pc_b2 === 1'b0 && Pc_b3 === 1'b0) begin + $display ("%m : at time %t ERROR: all banks must be Precharge before Load Mode Register", $time); + end + + // Precharge to Load Mode Register + if (($time - RP_chk0 < tRP) || ($time - RP_chk1 < tRP) || + ($time - RP_chk2 < tRP) || ($time - RP_chk3 < tRP)) begin + $display ("%m : at time %t ERROR: tRP violation during Load Mode Register", $time); + end + + // Auto Refresh to Load Mode Register + if ($time - RFC_chk < tRFC) begin + $display ("%m : at time %t ERROR: tRFC violation during Load Mode Register", $time); + end + + // Load Mode Register to Load Mode Register + if (MRD_chk < tMRD) begin + $display ("%m : at time %t ERROR: tMRD violation during Load Mode Register", $time); + end + + // Reset MRD Counter + MRD_chk = 0; + end + + // Active Block (Latch Bank Address and Row Address) + if (Active_enable === 1'b1) begin + // Activate an open bank can corrupt data + if ((Ba === 2'b00 && Act_b0 === 1'b1) || (Ba === 2'b01 && Act_b1 === 1'b1) || + (Ba === 2'b10 && Act_b2 === 1'b1) || (Ba === 2'b11 && Act_b3 === 1'b1)) begin + $display ("%m : at time %t ERROR: Bank already activated -- data can be corrupted", $time); + end + + // Activate Bank 0 + if (Ba === 2'b00 && Pc_b0 === 1'b1) begin + // Debug Message + if (Debug) begin + $display ("%m : at time %t ACT : Bank = 0 Row = %h", $time, Addr); + end + + // ACTIVE to ACTIVE command period + if ($time - RC_chk0 < tRC) begin + $display ("%m : at time %t ERROR: tRC violation during Activate bank 0", $time); + end + + // Precharge to Activate Bank 0 + if ($time - RP_chk0 < tRP) begin + $display ("%m : at time %t ERROR: tRP violation during Activate bank 0", $time); + end + + // Record variables + Act_b0 = 1'b1; + Pc_b0 = 1'b0; + B0_row_addr = Addr [addr_bits - 1 : 0]; + RAS_chk0 = $time; + RC_chk0 = $time; + RCD_chk0 = $time; + end + + if (Ba == 2'b01 && Pc_b1 == 1'b1) begin + // Debug Message + if (Debug) begin + $display ("%m : at time %t ACT : Bank = 1 Row = %h", $time, Addr); + end + + // ACTIVE to ACTIVE command period + if ($time - RC_chk1 < tRC) begin + $display ("%m : at time %t ERROR: tRC violation during Activate bank 1", $time); + end + + // Precharge to Activate Bank 1 + if ($time - RP_chk1 < tRP) begin + $display ("%m : at time %t ERROR: tRP violation during Activate bank 1", $time); + end + + // Record variables + Act_b1 = 1'b1; + Pc_b1 = 1'b0; + B1_row_addr = Addr [addr_bits - 1 : 0]; + RAS_chk1 = $time; + RC_chk1 = $time; + RCD_chk1 = $time; + end + + if (Ba == 2'b10 && Pc_b2 == 1'b1) begin + // Debug Message + if (Debug) begin + $display ("%m : at time %t ACT : Bank = 2 Row = %h", $time, Addr); + end + + // ACTIVE to ACTIVE command period + if ($time - RC_chk2 < tRC) begin + $display ("%m : at time %t ERROR: tRC violation during Activate bank 2", $time); + end + + // Precharge to Activate Bank 2 + if ($time - RP_chk2 < tRP) begin + $display ("%m : at time %t ERROR: tRP violation during Activate bank 2", $time); + end + + // Record variables + Act_b2 = 1'b1; + Pc_b2 = 1'b0; + B2_row_addr = Addr [addr_bits - 1 : 0]; + RAS_chk2 = $time; + RC_chk2 = $time; + RCD_chk2 = $time; + end + + if (Ba == 2'b11 && Pc_b3 == 1'b1) begin + // Debug Message + if (Debug) begin + $display ("%m : at time %t ACT : Bank = 3 Row = %h", $time, Addr); + end + + // ACTIVE to ACTIVE command period + if ($time - RC_chk3 < tRC) begin + $display ("%m : at time %t ERROR: tRC violation during Activate bank 3", $time); + end + + // Precharge to Activate Bank 3 + if ($time - RP_chk3 < tRP) begin + $display ("%m : at time %t ERROR: tRP violation during Activate bank 3", $time); + end + + // Record variables + Act_b3 = 1'b1; + Pc_b3 = 1'b0; + B3_row_addr = Addr [addr_bits - 1 : 0]; + RAS_chk3 = $time; + RC_chk3 = $time; + RCD_chk3 = $time; + end + + // Active Bank A to Active Bank B + if ((Prev_bank != Ba) && ($time - RRD_chk < tRRD)) begin + $display ("%m : at time %t ERROR: tRRD violation during Activate bank = %h", $time, Ba); + end + + // Auto Refresh to Activate + if ($time - RFC_chk < tRFC) begin + $display ("%m : at time %t ERROR: tRFC violation during Activate bank = %h", $time, Ba); + end + + // Load Mode Register to Active + if (MRD_chk < tMRD ) begin + $display ("%m : at time %t ERROR: tMRD violation during Activate bank = %h", $time, Ba); + end + + // Record variables for checking violation + RRD_chk = $time; + Prev_bank = Ba; + end + + // Precharge Block + if (Prech_enable == 1'b1) begin + // Load Mode Register to Precharge + if ($time - MRD_chk < tMRD) begin + $display ("%m : at time %t ERROR: tMRD violaiton during Precharge", $time); + end + + // Precharge Bank 0 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b00)) && Act_b0 === 1'b1) begin + Act_b0 = 1'b0; + Pc_b0 = 1'b1; + RP_chk0 = $time; + + // Activate to Precharge + if ($time - RAS_chk0 < tRAS) begin + $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); + end + + // tWR violation check for write + if ($time - WR_chkm[0] < tWRm) begin + $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); + end + end + + // Precharge Bank 1 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b01)) && Act_b1 === 1'b1) begin + Act_b1 = 1'b0; + Pc_b1 = 1'b1; + RP_chk1 = $time; + + // Activate to Precharge + if ($time - RAS_chk1 < tRAS) begin + $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); + end + + // tWR violation check for write + if ($time - WR_chkm[1] < tWRm) begin + $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); + end + end + + // Precharge Bank 2 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b10)) && Act_b2 === 1'b1) begin + Act_b2 = 1'b0; + Pc_b2 = 1'b1; + RP_chk2 = $time; + + // Activate to Precharge + if ($time - RAS_chk2 < tRAS) begin + $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); + end + + // tWR violation check for write + if ($time - WR_chkm[2] < tWRm) begin + $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); + end + end + + // Precharge Bank 3 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b11)) && Act_b3 === 1'b1) begin + Act_b3 = 1'b0; + Pc_b3 = 1'b1; + RP_chk3 = $time; + + // Activate to Precharge + if ($time - RAS_chk3 < tRAS) begin + $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); + end + + // tWR violation check for write + if ($time - WR_chkm[3] < tWRm) begin + $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); + end + end + + // Terminate a Write Immediately (if same bank or all banks) + if (Data_in_enable === 1'b1 && (Bank === Ba || Addr[10] === 1'b1)) begin + Data_in_enable = 1'b0; + end + + // Precharge Command Pipeline for Read + if (Cas_latency_3 === 1'b1) begin + Command[2] = `PRECH; + Bank_precharge[2] = Ba; + A10_precharge[2] = Addr[10]; + end else if (Cas_latency_2 === 1'b1) begin + Command[1] = `PRECH; + Bank_precharge[1] = Ba; + A10_precharge[1] = Addr[10]; + end + end + + // Burst terminate + if (Burst_term === 1'b1) begin + // Terminate a Write Immediately + if (Data_in_enable == 1'b1) begin + Data_in_enable = 1'b0; + end + + // Terminate a Read Depend on CAS Latency + if (Cas_latency_3 === 1'b1) begin + Command[2] = `BST; + end else if (Cas_latency_2 == 1'b1) begin + Command[1] = `BST; + end + + // Display debug message + if (Debug) begin + $display ("%m : at time %t BST : Burst Terminate",$time); + end + end + + // Read, Write, Column Latch + if (Read_enable === 1'b1) begin + // Check to see if bank is open (ACT) + if ((Ba == 2'b00 && Pc_b0 == 1'b1) || (Ba == 2'b01 && Pc_b1 == 1'b1) || + (Ba == 2'b10 && Pc_b2 == 1'b1) || (Ba == 2'b11 && Pc_b3 == 1'b1)) begin + $display("%m : at time %t ERROR: Bank is not Activated for Read", $time); + end + + // Activate to Read or Write + if ((Ba == 2'b00) && ($time - RCD_chk0 < tRCD) || + (Ba == 2'b01) && ($time - RCD_chk1 < tRCD) || + (Ba == 2'b10) && ($time - RCD_chk2 < tRCD) || + (Ba == 2'b11) && ($time - RCD_chk3 < tRCD)) begin + $display("%m : at time %t ERROR: tRCD violation during Read", $time); + end + + // CAS Latency pipeline + if (Cas_latency_3 == 1'b1) begin + Command[2] = `READ; + Col_addr[2] = Addr; + Bank_addr[2] = Ba; + end else if (Cas_latency_2 == 1'b1) begin + Command[1] = `READ; + Col_addr[1] = Addr; + Bank_addr[1] = Ba; + end + + // Read interrupt Write (terminate Write immediately) + if (Data_in_enable == 1'b1) begin + Data_in_enable = 1'b0; + + // Interrupting a Write with Autoprecharge + if (Auto_precharge[RW_interrupt_bank] == 1'b1 && Write_precharge[RW_interrupt_bank] == 1'b1) begin + RW_interrupt_write[RW_interrupt_bank] = 1'b1; + RW_interrupt_counter[RW_interrupt_bank] = 0; + + // Display debug message + if (Debug) begin + $display ("%m : at time %t NOTE : Read interrupt Write with Autoprecharge", $time); + end + end + end + + // Write with Auto Precharge + if (Addr[10] == 1'b1) begin + Auto_precharge[Ba] = 1'b1; + Count_precharge[Ba] = 0; + RW_interrupt_bank = Ba; + Read_precharge[Ba] = 1'b1; + end + end + + // Write Command + if (Write_enable == 1'b1) begin + // Activate to Write + if ((Ba == 2'b00 && Pc_b0 == 1'b1) || (Ba == 2'b01 && Pc_b1 == 1'b1) || + (Ba == 2'b10 && Pc_b2 == 1'b1) || (Ba == 2'b11 && Pc_b3 == 1'b1)) begin + $display("%m : at time %t ERROR: Bank is not Activated for Write", $time); + end + + // Activate to Read or Write + if ((Ba == 2'b00) && ($time - RCD_chk0 < tRCD) || + (Ba == 2'b01) && ($time - RCD_chk1 < tRCD) || + (Ba == 2'b10) && ($time - RCD_chk2 < tRCD) || + (Ba == 2'b11) && ($time - RCD_chk3 < tRCD)) begin + $display("%m : at time %t ERROR: tRCD violation during Read", $time); + end + + // Latch Write command, Bank, and Column + Command[0] = `WRITE; + Col_addr[0] = Addr; + Bank_addr[0] = Ba; + + // Write interrupt Write (terminate Write immediately) + if (Data_in_enable == 1'b1) begin + Data_in_enable = 1'b0; + + // Interrupting a Write with Autoprecharge + if (Auto_precharge[RW_interrupt_bank] == 1'b1 && Write_precharge[RW_interrupt_bank] == 1'b1) begin + RW_interrupt_write[RW_interrupt_bank] = 1'b1; + + // Display debug message + if (Debug) begin + $display ("%m : at time %t NOTE : Read Bank %h interrupt Write Bank %h with Autoprecharge", $time, Ba, RW_interrupt_bank); + end + end + end + + // Write interrupt Read (terminate Read immediately) + if (Data_out_enable == 1'b1) begin + Data_out_enable = 1'b0; + + // Interrupting a Read with Autoprecharge + if (Auto_precharge[RW_interrupt_bank] == 1'b1 && Read_precharge[RW_interrupt_bank] == 1'b1) begin + RW_interrupt_read[RW_interrupt_bank] = 1'b1; + + // Display debug message + if (Debug) begin + $display ("%m : at time %t NOTE : Write Bank %h interrupt Read Bank %h with Autoprecharge", $time, Ba, RW_interrupt_bank); + end + end + end + + // Write with Auto Precharge + if (Addr[10] == 1'b1) begin + Auto_precharge[Ba] = 1'b1; + Count_precharge[Ba] = 0; + RW_interrupt_bank = Ba; + Write_precharge[Ba] = 1'b1; + end + end + + /* + Write with Auto Precharge Calculation + The device start internal precharge when: + 1. Meet minimum tRAS requirement + and 2. tWR cycle(s) after last valid data + or 3. Interrupt by a Read or Write (with or without Auto Precharge) + + Note: Model is starting the internal precharge 1 cycle after they meet all the + requirement but tRP will be compensate for the time after the 1 cycle. + */ + if ((Auto_precharge[0] == 1'b1) && (Write_precharge[0] == 1'b1)) begin + if ((($time - RAS_chk0 >= tRAS) && // Case 1 + (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [0] >= 1) || // Case 2 + (Burst_length_2 == 1'b1 && Count_precharge [0] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge [0] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge [0] >= 8))) || + (RW_interrupt_write[0] == 1'b1 && RW_interrupt_counter[0] >= 1)) begin // Case 3 + Auto_precharge[0] = 1'b0; + Write_precharge[0] = 1'b0; + RW_interrupt_write[0] = 1'b0; + Pc_b0 = 1'b1; + Act_b0 = 1'b0; + RP_chk0 = $time + tWRa; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 0", $time); + end + end + end + if ((Auto_precharge[1] == 1'b1) && (Write_precharge[1] == 1'b1)) begin + if ((($time - RAS_chk1 >= tRAS) && // Case 1 + (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [1] >= 1) || // Case 2 + (Burst_length_2 == 1'b1 && Count_precharge [1] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge [1] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge [1] >= 8))) || + (RW_interrupt_write[1] == 1'b1 && RW_interrupt_counter[1] >= 1)) begin // Case 3 + Auto_precharge[1] = 1'b0; + Write_precharge[1] = 1'b0; + RW_interrupt_write[1] = 1'b0; + Pc_b1 = 1'b1; + Act_b1 = 1'b0; + RP_chk1 = $time + tWRa; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 1", $time); + end + end + end + if ((Auto_precharge[2] == 1'b1) && (Write_precharge[2] == 1'b1)) begin + if ((($time - RAS_chk2 >= tRAS) && // Case 1 + (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [2] >= 1) || // Case 2 + (Burst_length_2 == 1'b1 && Count_precharge [2] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge [2] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge [2] >= 8))) || + (RW_interrupt_write[2] == 1'b1 && RW_interrupt_counter[2] >= 1)) begin // Case 3 + Auto_precharge[2] = 1'b0; + Write_precharge[2] = 1'b0; + RW_interrupt_write[2] = 1'b0; + Pc_b2 = 1'b1; + Act_b2 = 1'b0; + RP_chk2 = $time + tWRa; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 2", $time); + end + end + end + if ((Auto_precharge[3] == 1'b1) && (Write_precharge[3] == 1'b1)) begin + if ((($time - RAS_chk3 >= tRAS) && // Case 1 + (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [3] >= 1) || // Case 2 + (Burst_length_2 == 1'b1 && Count_precharge [3] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge [3] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge [3] >= 8))) || + (RW_interrupt_write[3] == 1'b1 && RW_interrupt_counter[3] >= 1)) begin // Case 3 + Auto_precharge[3] = 1'b0; + Write_precharge[3] = 1'b0; + RW_interrupt_write[3] = 1'b0; + Pc_b3 = 1'b1; + Act_b3 = 1'b0; + RP_chk3 = $time + tWRa; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 3", $time); + end + end + end + + // Read with Auto Precharge Calculation + // The device start internal precharge: + // 1. Meet minimum tRAS requirement + // and 2. CAS Latency - 1 cycles before last burst + // or 3. Interrupt by a Read or Write (with or without AutoPrecharge) + if ((Auto_precharge[0] == 1'b1) && (Read_precharge[0] == 1'b1)) begin + if ((($time - RAS_chk0 >= tRAS) && // Case 1 + ((Burst_length_1 == 1'b1 && Count_precharge[0] >= 1) || // Case 2 + (Burst_length_2 == 1'b1 && Count_precharge[0] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge[0] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge[0] >= 8))) || + (RW_interrupt_read[0] == 1'b1)) begin // Case 3 + Pc_b0 = 1'b1; + Act_b0 = 1'b0; + RP_chk0 = $time; + Auto_precharge[0] = 1'b0; + Read_precharge[0] = 1'b0; + RW_interrupt_read[0] = 1'b0; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 0", $time); + end + end + end + if ((Auto_precharge[1] == 1'b1) && (Read_precharge[1] == 1'b1)) begin + if ((($time - RAS_chk1 >= tRAS) && + ((Burst_length_1 == 1'b1 && Count_precharge[1] >= 1) || + (Burst_length_2 == 1'b1 && Count_precharge[1] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge[1] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge[1] >= 8))) || + (RW_interrupt_read[1] == 1'b1)) begin + Pc_b1 = 1'b1; + Act_b1 = 1'b0; + RP_chk1 = $time; + Auto_precharge[1] = 1'b0; + Read_precharge[1] = 1'b0; + RW_interrupt_read[1] = 1'b0; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 1", $time); + end + end + end + if ((Auto_precharge[2] == 1'b1) && (Read_precharge[2] == 1'b1)) begin + if ((($time - RAS_chk2 >= tRAS) && + ((Burst_length_1 == 1'b1 && Count_precharge[2] >= 1) || + (Burst_length_2 == 1'b1 && Count_precharge[2] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge[2] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge[2] >= 8))) || + (RW_interrupt_read[2] == 1'b1)) begin + Pc_b2 = 1'b1; + Act_b2 = 1'b0; + RP_chk2 = $time; + Auto_precharge[2] = 1'b0; + Read_precharge[2] = 1'b0; + RW_interrupt_read[2] = 1'b0; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 2", $time); + end + end + end + if ((Auto_precharge[3] == 1'b1) && (Read_precharge[3] == 1'b1)) begin + if ((($time - RAS_chk3 >= tRAS) && + ((Burst_length_1 == 1'b1 && Count_precharge[3] >= 1) || + (Burst_length_2 == 1'b1 && Count_precharge[3] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge[3] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge[3] >= 8))) || + (RW_interrupt_read[3] == 1'b1)) begin + Pc_b3 = 1'b1; + Act_b3 = 1'b0; + RP_chk3 = $time; + Auto_precharge[3] = 1'b0; + Read_precharge[3] = 1'b0; + RW_interrupt_read[3] = 1'b0; + if (Debug) begin + $display("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 3", $time); + end + end + end + + // Internal Precharge or Bst + if (Command[0] == `PRECH) begin // Precharge terminate a read with same bank or all banks + if (Bank_precharge[0] == Bank || A10_precharge[0] == 1'b1) begin + if (Data_out_enable == 1'b1) begin + Data_out_enable = 1'b0; + end + end + end else if (Command[0] == `BST) begin // BST terminate a read to current bank + if (Data_out_enable == 1'b1) begin + Data_out_enable = 1'b0; + end + end + + if (Data_out_enable == 1'b0) begin + Dq_reg <= #tOH {data_bits{1'bz}}; + end + + // Detect Read or Write command + if (Command[0] == `READ) begin + Bank = Bank_addr[0]; + Col = Col_addr[0]; + Col_brst = Col_addr[0]; + case (Bank_addr[0]) + 2'b00 : Row = B0_row_addr; + 2'b01 : Row = B1_row_addr; + 2'b10 : Row = B2_row_addr; + 2'b11 : Row = B3_row_addr; + endcase + Burst_counter = 0; + Data_in_enable = 1'b0; + Data_out_enable = 1'b1; + end else if (Command[0] == `WRITE) begin + Bank = Bank_addr[0]; + Col = Col_addr[0]; + Col_brst = Col_addr[0]; + case (Bank_addr[0]) + 2'b00 : Row = B0_row_addr; + 2'b01 : Row = B1_row_addr; + 2'b10 : Row = B2_row_addr; + 2'b11 : Row = B3_row_addr; + endcase + Burst_counter = 0; + Data_in_enable = 1'b1; + Data_out_enable = 1'b0; + end + + // DQ buffer (Driver/Receiver) + if (Data_in_enable == 1'b1) begin // Writing Data to Memory + // Array buffer + case (Bank) + 2'b00 : Dq_dqm = Bank0 [{Row, Col}]; + 2'b01 : Dq_dqm = Bank1 [{Row, Col}]; + 2'b10 : Dq_dqm = Bank2 [{Row, Col}]; + 2'b11 : Dq_dqm = Bank3 [{Row, Col}]; + endcase + + // Dqm operation + if (Dqm[0] == 1'b0) begin + Dq_dqm [ 7 : 0] = Dq [ 7 : 0]; + end + if (Dqm[1] == 1'b0) begin + Dq_dqm [15 : 8] = Dq [15 : 8]; + end + + // Write to memory + case (Bank) + 2'b00 : Bank0 [{Row, Col}] = Dq_dqm; + 2'b01 : Bank1 [{Row, Col}] = Dq_dqm; + 2'b10 : Bank2 [{Row, Col}] = Dq_dqm; + 2'b11 : Bank3 [{Row, Col}] = Dq_dqm; + endcase + + // Display debug message + if (Dqm !== 2'b11) begin + // Record tWR for manual precharge + WR_chkm [Bank] = $time; + + if (Debug) begin + $display("%m : at time %t WRITE: Bank = %h Row = %h, Col = %h, Data = %h", $time, Bank, Row, Col, Dq_dqm); + end + end else begin + if (Debug) begin + $display("%m : at time %t WRITE: Bank = %h Row = %h, Col = %h, Data = Hi-Z due to DQM", $time, Bank, Row, Col); + end + end + + // Advance burst counter subroutine + #tHZ Burst_decode; + + end else if (Data_out_enable == 1'b1) begin // Reading Data from Memory + // Array buffer + case (Bank) + 2'b00 : Dq_dqm = Bank0[{Row, Col}]; + 2'b01 : Dq_dqm = Bank1[{Row, Col}]; + 2'b10 : Dq_dqm = Bank2[{Row, Col}]; + 2'b11 : Dq_dqm = Bank3[{Row, Col}]; + endcase + + // Dqm operation + if (Dqm_reg0 [0] == 1'b1) begin + Dq_dqm [ 7 : 0] = 8'bz; + end + if (Dqm_reg0 [1] == 1'b1) begin + Dq_dqm [15 : 8] = 8'bz; + end + + // Display debug message + if (Dqm_reg0 !== 2'b11) begin + Dq_reg = #tAC Dq_dqm; + if (Debug) begin + $display("%m : at time %t READ : Bank = %h Row = %h, Col = %h, Data = %h", $time, Bank, Row, Col, Dq_reg); + end + end else begin + Dq_reg = #tHZ {data_bits{1'bz}}; + if (Debug) begin + $display("%m : at time %t READ : Bank = %h Row = %h, Col = %h, Data = Hi-Z due to DQM", $time, Bank, Row, Col); + end + end + + // Advance burst counter subroutine + Burst_decode; + end + end + + // Burst counter decode + task Burst_decode; + begin + // Advance Burst Counter + Burst_counter = Burst_counter + 1; + + // Burst Type + if (Mode_reg[3] == 1'b0) begin // Sequential Burst + Col_temp = Col + 1; + end else if (Mode_reg[3] == 1'b1) begin // Interleaved Burst + Col_temp[2] = Burst_counter[2] ^ Col_brst[2]; + Col_temp[1] = Burst_counter[1] ^ Col_brst[1]; + Col_temp[0] = Burst_counter[0] ^ Col_brst[0]; + end + + // Burst Length + if (Burst_length_2) begin // Burst Length = 2 + Col [0] = Col_temp [0]; + end else if (Burst_length_4) begin // Burst Length = 4 + Col [1 : 0] = Col_temp [1 : 0]; + end else if (Burst_length_8) begin // Burst Length = 8 + Col [2 : 0] = Col_temp [2 : 0]; + end else begin // Burst Length = FULL + Col = Col_temp; + end + + // Burst Read Single Write + if (Write_burst_mode == 1'b1) begin + Data_in_enable = 1'b0; + end + + // Data Counter + if (Burst_length_1 == 1'b1) begin + if (Burst_counter >= 1) begin + Data_in_enable = 1'b0; + Data_out_enable = 1'b0; + end + end else if (Burst_length_2 == 1'b1) begin + if (Burst_counter >= 2) begin + Data_in_enable = 1'b0; + Data_out_enable = 1'b0; + end + end else if (Burst_length_4 == 1'b1) begin + if (Burst_counter >= 4) begin + Data_in_enable = 1'b0; + Data_out_enable = 1'b0; + end + end else if (Burst_length_8 == 1'b1) begin + if (Burst_counter >= 8) begin + Data_in_enable = 1'b0; + Data_out_enable = 1'b0; + end + end + end + endtask + + // Timing Parameters for -7E (133 MHz @ CL2) + specify + specparam + tAH = 0.8, // Addr, Ba Hold Time + tAS = 1.5, // Addr, Ba Setup Time + tCH = 2.5, // Clock High-Level Width + tCL = 2.5, // Clock Low-Level Width + tCK = 7.0, // Clock Cycle Time + tDH = 0.8, // Data-in Hold Time + tDS = 1.5, // Data-in Setup Time + tCKH = 0.8, // CKE Hold Time + tCKS = 1.5, // CKE Setup Time + tCMH = 0.8, // CS#, RAS#, CAS#, WE#, DQM# Hold Time + tCMS = 1.5; // CS#, RAS#, CAS#, WE#, DQM# Setup Time + $width (posedge Clk, tCH); + $width (negedge Clk, tCL); + $period (negedge Clk, tCK); + $period (posedge Clk, tCK); + $setuphold(posedge Clk, Cke, tCKS, tCKH); + $setuphold(posedge Clk, Cs_n, tCMS, tCMH); + $setuphold(posedge Clk, Cas_n, tCMS, tCMH); + $setuphold(posedge Clk, Ras_n, tCMS, tCMH); + $setuphold(posedge Clk, We_n, tCMS, tCMH); + $setuphold(posedge Clk, Addr, tAS, tAH); + $setuphold(posedge Clk, Ba, tAS, tAH); + $setuphold(posedge Clk, Dqm, tCMS, tCMH); + $setuphold(posedge Dq_chk, Dq, tDS, tDH); + endspecify + +endmodule
versatile_mem_ctrl/tags/Rev2/bench/mt48lc16m16a2.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: versatile_mem_ctrl/tags/Rev2/bench/tb_defines.v =================================================================== --- versatile_mem_ctrl/tags/Rev2/bench/tb_defines.v (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/bench/tb_defines.v (revision 109) @@ -0,0 +1,6 @@ +// clock periods +`define WB0_CLK_PERIOD 20 +`define SDRAM_CLK_PERIOD 6 + +`define SDR_16 +`define DDR_16 Index: versatile_mem_ctrl/tags/Rev2/bench/ddr/ddr2.v =================================================================== --- versatile_mem_ctrl/tags/Rev2/bench/ddr/ddr2.v (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/bench/ddr/ddr2.v (revision 109) @@ -0,0 +1,2025 @@ +/**************************************************************************************** +* +* File Name: ddr2.v +* Version: 5.80 +* Model: BUS Functional +* +* Dependencies: ddr2_parameters.vh +* +* Description: Micron SDRAM DDR2 (Double Data Rate 2) +* +* Limitation: - doesn't check for average refresh timings +* - positive ck and ck_n edges are used to form internal clock +* - positive dqs and dqs_n edges are used to latch data +* - test mode is not modeled +* +* Note: - Set simulator resolution to "ps" accuracy +* - Set Debug = 0 to disable $display messages +* +* Disclaimer This software code and all associated documentation, comments or other +* of Warranty: information (collectively "Software") is provided "AS IS" without +* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGES. Because some jurisdictions prohibit the exclusion or +* limitation of liability for consequential or incidental damages, the +* above limitation may not apply to you. +* +* Copyright 2003 Micron Technology, Inc. All rights reserved. +* +* Rev Author Date Changes +* --------------------------------------------------------------------------------------- +* 1.00 JMK 07/29/03 Initial Release +* 1.10 JMK 08/09/03 Timing Parameter updates to tIS, tIH, tDS, tDH +* 2.20 JMK 08/07/03 General cleanup +* 2.30 JMK 11/26/03 Added CL_MIN, CL_MAX, wl_min and wl_max parameters. +* Added AL_MIN and AL_MAX parameters. +* Removed support for OCD. +* 2.40 JMK 01/15/04 Removed verilog 2001 constructs. +* 2.50 JMK 01/29/04 Removed tRP checks during Precharge command. +* 2.60 JMK 04/20/04 Fixed tWTR check. +* 2.70 JMK 04/30/04 Added tRFC maximum check. +* Combined Self Refresh and Power Down always blocks. +* Added Reset Function (CKE LOW Anytime). +* 2.80 JMK 08/19/04 Precharge is treated as NOP when bank is not active. +* Added checks for tRAS, tWR, tRTP to any bank during Pre-All. +* tRFC maximum violation will only display one time. +* 2.90 JMK 11/05/04 Fixed DQS checking during write. +* Fixed false tRFC max assertion during power up and self ref. +* Added warning for 200us CKE low time during initialization. +* Added -3, -3E, and -37V speed grades to ddr2_parameters.v +* 3.00 JMK 04/22/05 Removed ODT off requirement during power down. +* Added tAOND, tAOFD, tANPD, tAXPD, tAONPD, and tAOFPD parameters. +* Added ODT status messages. +* Updated the initialization sequence. +* Disable ODT and CLK pins during self refresh. +* Disable cmd and addr pins during power down and self refresh. +* 3.10 JMK 06/07/05 Disable trpa checking if the part does not have 8 banks. +* Changed tAXPD message from error to a warning. +* Added tDSS checking. +* Removed tDQSL checking during tWPRE and tWPST. +* Fixed a burst order error during writes. +* Renamed parameters file with .vh extension. +* 3.20 JMK 07/18/05 Removed 14 tCK requirement from LMR to READ. +* 3.30 JMK 08/03/05 Added check for interrupting a burst with auto precharge. +* 4.00 JMK 11/21/05 Parameter names all UPPERCASE, signal names all lowercase. +* Clock jitter can be tolerated within specification range. +* Clock frequency is sampled from the CK pin. +* Scaleable up to 64 DQ and 16 DQS bits. +* Read data can be randomly skewed using RANDOM_OUT_DELAY. +* Parameterized read and write DQS, and read DQ. +* Initialization can be bypassed using initialize task. +* 4.10 JMK 11/30/05 Fixed compile errors when `MAX_MEM was defined. +* 4.20 JMK 12/09/05 Fixed memory addressing error when `MAX_MEM was defined. +* 4.30 JMK 02/15/06 Added dummy write to initialization sequence. +* Removed tWPST maximum checking. +* Rising dqs_n edge latches data when enabled in EMR. +* Fixed a sign error in the tJIT(cc) calculation. +* 4.40 JMK 02/16/06 Fixed dummy write when`MAX_MEM was defined. +* 4.50 JMK 02/27/06 Fixed extra tDQSS assertions. +* Fixed tRCD and tWTR checking. +* Errors entering Power Down or Self Refresh will cause reset. +* Ignore dqs_n when disabled in EMR. +* 5.00 JMK 04/24/06 Test stimulus now included from external file (subtest.vh) +* Fixed tRFC max assertion during self refresh. +* Fixed tANPD checking during Power Down. +* Removed dummy write from initialization sequence. +* 5.01 JMK 04/28/06 Fixed Auto Precharge to Load Mode, Refresh and Self Refresh. +* Removed Auto Precharge error message during Power Down Enter. +* 5.10 JMK 07/26/06 Created internal clock using ck and ck_n. +* RDQS can only be enabled in EMR for x8 configurations. +* CAS latency is checked vs frequency when DLL locks. +* tMOD changed from tCK units to ns units. +* Added 50 Ohm setting for Rtt in EMR. +* Improved checking of DQS during writes. +* 5.20 JMK 10/02/06 Fixed DQS checking for interrupting write to write and x16. +* 5.30 JMK 05/25/07 Fixed checking for 0-Z transition on write postamble. +* 5.50 JMK 05/30/08 Renamed ddr2_dimm.v to ddr2_module.v and added SODIMM support. +* Added a register delay to ddr2_module.v when RDIMM is defined. +* Added multi-chip package model support in ddr2_mcp.v +* Added High Temp Self Refresh rate setting in EMRS2[7] +* 5.70 JMK 04/23/09 Updated tRPA definition +* Increased internal width to 72 bit DQ bus +* 5.80 SPH 08/12/09 Fixed tRAS maximum violation (only check if bank still open) +****************************************************************************************/ + +// DO NOT CHANGE THE TIMESCALE +// MAKE SURE YOUR SIMULATOR USES "PS" RESOLUTION +`timescale 1ps / 1ps + +module ddr2 ( + ck, + ck_n, + cke, + cs_n, + ras_n, + cas_n, + we_n, + dm_rdqs, + ba, + addr, + dq, + dqs, + dqs_n, + rdqs_n, + odt +); + + `include "ddr2_parameters.vh" + + // text macros + `define DQ_PER_DQS DQ_BITS/DQS_BITS + `define BANKS (1<= 2. \nBL_MAX = %d", BL_MAX); + if ((1< BL_MAX) + $display("%m ERROR: 2^BO_BITS cannot be greater than BL_MAX parameter."); + $timeformat (-12, 1, " ps", 1); + reset_task; + seed = RANDOM_SEED; + ck_cntr = 0; + end + + // calculate the absolute value of a real number + function real abs_value; + input arg; + real arg; + begin + if (arg < 0.0) + abs_value = -1.0 * arg; + else + abs_value = arg; + end + endfunction + +`ifdef MAX_MEM +`else + function get_index; + input [`MAX_BITS-1:0] addr; + begin : index + get_index = 0; + for (memory_index=0; memory_index TRAS_MAX) && (active_bank[bank] === 1'b1)) $display ("%m: at time %t ERROR: tRAS maximum violation during %s to bank %d", $time, cmd_string[cmd], bank); + if ($time - tm_bank_activate[bank] < TRAS_MIN) $display ("%m: at time %t ERROR: tRAS minimum violation during %s to bank %d", $time, cmd_string[cmd], bank);end + {1'b0, ACTIVATE , ACTIVATE } : begin if ($time - tm_activate < TRRD) $display ("%m: at time %t ERROR: tRRD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, ACTIVATE , ACTIVATE } : begin if ($time - tm_bank_activate[bank] < TRC) $display ("%m: at time %t ERROR: tRC violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, ACTIVATE , 4'b010x } : ; // tRCD is checked outside this task + {1'b1, ACTIVATE , PWR_DOWN } : ; // 1 tCK + {1'b1, WRITE , PRECHARGE} : begin if ((ck_cntr - ck_bank_write[bank] <= write_latency + burst_length/2) || ($time - tm_bank_write_end[bank] < TWR)) $display ("%m: at time %t ERROR: tWR violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, WRITE , WRITE } : begin if (ck_cntr - ck_write < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, WRITE , READ } : begin if ((ck_load_mode < ck_write) && (ck_cntr - ck_write < write_latency + burst_length/2 + 2 - additive_latency)) $display ("%m: at time %t ERROR: tWTR violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, WRITE , PWR_DOWN } : begin if ((ck_load_mode < ck_write) && ( + |write_precharge_bank + || (ck_cntr - ck_write_ap < 1) + || (ck_cntr - ck_write < write_latency + burst_length/2 + 2) + || ($time - tm_write_end < TWTR))) begin $display ("%m: at time %t INFO: Write to Reset condition", $time); init_done = 0; end end + {1'b1, READ , PRECHARGE} : begin if ((ck_cntr - ck_bank_read[bank] < additive_latency + burst_length/2) || ($time - tm_bank_read_end[bank] < TRTP)) $display ("%m: at time %t ERROR: tRTP violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, READ , WRITE } : begin if ((ck_load_mode < ck_read) && (ck_cntr - ck_read < read_latency + burst_length/2 + 1 - write_latency)) $display ("%m: at time %t ERROR: tRTW violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, READ , READ } : begin if (ck_cntr - ck_read < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, READ , PWR_DOWN } : begin if ((ck_load_mode < ck_read) && (ck_cntr - ck_read < read_latency + burst_length/2 + 1)) begin $display ("%m: at time %t INFO: Read to Reset condition", $time); init_done = 0; end end + {1'b0, PWR_DOWN , 4'b00xx } : begin if (ck_cntr - ck_power_down < TXP) $display ("%m: at time %t ERROR: tXP violation during %s", $time, cmd_string[cmd]); end + {1'b0, PWR_DOWN , WRITE } : begin if (ck_cntr - ck_power_down < TXP) $display ("%m: at time %t ERROR: tXP violation during %s", $time, cmd_string[cmd]); end + {1'b0, PWR_DOWN , READ } : begin if (ck_cntr - ck_slow_exit_pd < TXARDS - additive_latency) $display ("%m: at time %t ERROR: tXARDS violation during %s", $time, cmd_string[cmd]); + else if (ck_cntr - ck_power_down < TXARD) $display ("%m: at time %t ERROR: tXARD violation during %s", $time, cmd_string[cmd]); end + {1'b0, SELF_REF , 4'b00xx } : begin if ($time - tm_self_refresh < TXSNR) $display ("%m: at time %t ERROR: tXSNR violation during %s", $time, cmd_string[cmd]); end + {1'b0, SELF_REF , WRITE } : begin if ($time - tm_self_refresh < TXSNR) $display ("%m: at time %t ERROR: tXSNR violation during %s", $time, cmd_string[cmd]); end + {1'b0, SELF_REF , READ } : begin if (ck_cntr - ck_self_refresh < TXSRD) $display ("%m: at time %t ERROR: tXSRD violation during %s", $time, cmd_string[cmd]); end + {1'b0, 4'b100x , 4'b100x } : begin if (ck_cntr - ck_cke < TCKE) begin $display ("%m: at time %t ERROR: tCKE violation on CKE", $time); init_done = 0; end end + endcase + end + endtask + + task cmd_task; + input cke; + input [2:0] cmd; + input [BA_BITS-1:0] bank; + input [ADDR_BITS-1:0] addr; + reg [`BANKS:0] i; + integer j; + reg [`BANKS:0] tfaw_cntr; + reg [COL_BITS-1:0] col; + begin + + // tRFC max check + if (!er_trfc_max && !in_self_refresh) begin + if ($time - tm_refresh > TRFC_MAX) begin + $display ("%m: at time %t ERROR: tRFC maximum violation during %s", $time, cmd_string[cmd]); + er_trfc_max = 1; + end + end + if (cke) begin + if ((cmd < NOP) && ((cmd != PRECHARGE) || !addr[AP])) begin + for (j=0; j= BL_MIN) && (burst_length <= BL_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Length = %d", $time, cmd_string[cmd], bank, burst_length); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Burst Length = %d", $time, cmd_string[cmd], bank, burst_length); + end + // Burst Order + burst_order = addr[3]; + if (!burst_order) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Order = Sequential", $time, cmd_string[cmd], bank); + end else if (burst_order) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Order = Interleaved", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Burst Order = %d", $time, cmd_string[cmd], bank, burst_order); + end + // CAS Latency + cas_latency = addr[6:4]; + read_latency = cas_latency + additive_latency; + write_latency = read_latency - 1; + if ((cas_latency >= CL_MIN) && (cas_latency <= CL_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d CAS Latency = %d", $time, cmd_string[cmd], bank, cas_latency); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal CAS Latency = %d", $time, cmd_string[cmd], bank, cas_latency); + end + // Test Mode + if (!addr[7]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Test Mode = Normal", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Test Mode = %d", $time, cmd_string[cmd], bank, addr[7]); + end + // DLL Reset + dll_reset = addr[8]; + if (!dll_reset) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Normal", $time, cmd_string[cmd], bank); + end else if (dll_reset) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Reset DLL", $time, cmd_string[cmd], bank); + dll_locked = 0; + ck_dll_reset <= ck_cntr; + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal DLL Reset = %d", $time, cmd_string[cmd], bank, dll_reset); + end + // Write Recovery + write_recovery = addr[11:9] + 1; + if ((write_recovery >= WR_MIN) && (write_recovery <= WR_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery); + end + // Power Down Mode + low_power = addr[12]; + if (!low_power) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = Fast Exit", $time, cmd_string[cmd], bank); + end else if (low_power) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = Slow Exit", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Power Down Mode = %d", $time, cmd_string[cmd], bank, low_power); + end + end + 1 : begin + // DLL Enable + dll_en = !addr[0]; + if (!dll_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Disabled", $time, cmd_string[cmd], bank); + end else if (dll_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal DLL Enable = %d", $time, cmd_string[cmd], bank, dll_en); + end + // Output Drive Strength + if (!addr[1]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = Full", $time, cmd_string[cmd], bank); + end else if (addr[1]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = Reduced", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Output Drive Strength = %d", $time, cmd_string[cmd], bank, addr[1]); + end + // ODT Rtt + odt_rtt = {addr[6], addr[2]}; + if (odt_rtt == 2'b00) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = Disabled", $time, cmd_string[cmd], bank); + odt_en = 0; + end else if (odt_rtt == 2'b01) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 75 Ohm", $time, cmd_string[cmd], bank); + odt_en = 1; + tm_odt_en <= $time; + end else if (odt_rtt == 2'b10) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 150 Ohm", $time, cmd_string[cmd], bank); + odt_en = 1; + tm_odt_en <= $time; + end else if (odt_rtt == 2'b11) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 50 Ohm", $time, cmd_string[cmd], bank); + odt_en = 1; + tm_odt_en <= $time; + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal ODT Rtt = %d", $time, cmd_string[cmd], bank, odt_rtt); + odt_en = 0; + end + // Additive Latency + additive_latency = addr[5:3]; + read_latency = cas_latency + additive_latency; + write_latency = read_latency - 1; + if ((additive_latency >= AL_MIN) && (additive_latency <= AL_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Additive Latency = %d", $time, cmd_string[cmd], bank, additive_latency); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Additive Latency = %d", $time, cmd_string[cmd], bank, additive_latency); + end + // OCD Program + ocd = addr[9:7]; + if (ocd == 3'b000) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d OCD Program = OCD Exit", $time, cmd_string[cmd], bank); + end else if (ocd == 3'b111) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d OCD Program = OCD Default", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal OCD Program = %b", $time, cmd_string[cmd], bank, ocd); + end + + // DQS_N Enable + dqs_n_en = !addr[10]; + if (!dqs_n_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DQS_N Enable = Disabled", $time, cmd_string[cmd], bank); + end else if (dqs_n_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DQS_N Enable = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal DQS_N Enable = %d", $time, cmd_string[cmd], bank, dqs_n_en); + end + // RDQS Enable + rdqs_en = addr[11]; + if (!rdqs_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d RDQS Enable = Disabled", $time, cmd_string[cmd], bank); + end else if (rdqs_en) begin +`ifdef x8 + if (DEBUG) $display ("%m: at time %t INFO: %s %d RDQS Enable = Enabled", $time, cmd_string[cmd], bank); +`else + $display ("%m: at time %t WARNING: %s %d Illegal RDQS Enable. RDQS only exists on a x8 part", $time, cmd_string[cmd], bank); + rdqs_en = 0; +`endif + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal RDQS Enable = %d", $time, cmd_string[cmd], bank, rdqs_en); + end + // Output Enable + out_en = !addr[12]; + if (!out_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Enable = Disabled", $time, cmd_string[cmd], bank); + end else if (out_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Enable = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Output Enable = %d", $time, cmd_string[cmd], bank, out_en); + end + end + 2 : begin + // High Temperature Self Refresh rate + if (!addr[7]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d High Temperature Self Refresh rate = Disabled", $time, cmd_string[cmd], bank); + end else if (addr[1]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d High Temperature Self Refresh rate = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal High Temperature Self Refresh rate = %d", $time, cmd_string[cmd], bank, addr[7]); + end + if ((addr & ~(1<<7)) !== 0) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + end + 3 : begin + if (addr !== 0) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + end + endcase + init_mode_reg[bank] = 1; + ck_load_mode <= ck_cntr; + end + end + REFRESH : begin + if (|active_bank) begin + $display ("%m: at time %t ERROR: %s Failure. All banks must be Precharged.", $time, cmd_string[cmd]); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (DEBUG) $display ("%m: at time %t INFO: %s", $time, cmd_string[cmd]); + er_trfc_max = 0; + ref_cntr = ref_cntr + 1; + tm_refresh <= $time; + end + end + PRECHARGE : begin + if (addr[AP]) begin + // tRPA timing applies when the PRECHARGE (ALL) command is issued, regardless of + // the number of banks already open or closed. + for (i=0; i<`BANKS; i=i+1) begin + for (j=0; j 3) begin + $display ("%m: at time %t ERROR: tFAW violation during %s to bank %d", $time, cmd_string[cmd], bank); + end + end + + if (!init_done) begin + $display ("%m: at time %t ERROR: %s Failure. Initialization sequence is not complete.", $time, cmd_string[cmd]); + if (STOP_ON_ERROR) $stop(0); + end else if (active_bank[bank]) begin + $display ("%m: at time %t ERROR: %s Failure. Bank %d must be Precharged.", $time, cmd_string[cmd], bank); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (addr >= 1<>1) & -1*(1<= 1<>1) & -1*(1<= 1< $time) +// $display("%m: at time %t WARNING: NOP or DESELECT is required for 200 us before CKE is brought high", $time); + init_step = init_step + 1; + end + 1 : if (dll_en) init_step = init_step + 1; + 2 : begin + if (&init_mode_reg && dll_reset) begin + active_bank = {`BANKS{1'b1}}; // require Precharge All or bank Precharges + ref_cntr = 0; // require refresh + init_step = init_step + 1; + end + end + 3 : if (ref_cntr == 2) begin + init_step = init_step + 1; + end + 4 : if (!dll_reset) init_step = init_step + 1; + 5 : if (ocd == 3'b111) init_step = init_step + 1; + 6 : begin + if (ocd == 3'b000) begin + if (DEBUG) $display ("%m: at time %t INFO: Initialization Sequence is complete", $time); + init_done = 1; + end + end + endcase + end + end else if (prev_cke) begin + if ((!init_done) && (init_step > 1)) begin + $display ("%m: at time %t ERROR: CKE must remain active until the initialization sequence is complete.", $time); + if (STOP_ON_ERROR) $stop(0); + end + case (cmd) + REFRESH : begin + for (j=0; j TDQSS*tck_avg)) + $display ("%m: at time %t ERROR: tDQSS violation on %s bit %d", $time, dqs_string[i/18], i%18); + end + if (check_write_dqs_low[i]) + $display ("%m: at time %t ERROR: %s bit %d latching edge required during the preceding clock period", $time, dqs_string[i/18], i%18); + end + check_write_preamble <= 0; + check_write_postamble <= 0; + check_write_dqs_low <= 0; + end + + if (wr_pipeline[0] || rd_pipeline[0]) begin + bank = ba_pipeline[0]; + row = row_pipeline[0]; + col = col_pipeline[0]; + burst_cntr = 0; + memory_read(bank, row, col, memory_data); + end + + // burst counter + if (burst_cntr < burst_length) begin + burst_position = col ^ burst_cntr; + if (!burst_order) begin + burst_position[BO_BITS-1:0] = col + burst_cntr; + end + burst_cntr = burst_cntr + 1; + end + + // write dqs counter + if (wr_pipeline[WDQS_PRE + 1]) begin + wdqs_cntr = WDQS_PRE + burst_length + WDQS_PST - 1; + end + // write dqs + if ((wdqs_cntr == burst_length + WDQS_PST) && (wdq_cntr == 0)) begin //write preamble + check_write_preamble <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}}; + end + if (wdqs_cntr > 1) begin // write data + if ((wdqs_cntr - WDQS_PST)%2) begin + check_write_dqs_high <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}}; + end else begin + check_write_dqs_low <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}}; + end + end + if (wdqs_cntr == WDQS_PST) begin // write postamble + check_write_postamble <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}}; + end + if (wdqs_cntr > 0) begin + wdqs_cntr = wdqs_cntr - 1; + end + + // write dq + if (dq_in_valid) begin // write data + bit_mask = 0; + if (diff_ck) begin + for (i=0; i>(burst_position*DQ_BITS); + if (DEBUG) $display ("%m: at time %t INFO: WRITE @ DQS= bank = %h row = %h col = %h data = %h",$time, bank, row, (-1*BL_MAX & col) + burst_position, dq_temp); + if (burst_cntr%BL_MIN == 0) begin + memory_write(bank, row, col, memory_data); + end + end + if (wr_pipeline[1]) begin + wdq_cntr = burst_length; + end + if (wdq_cntr > 0) begin + wdq_cntr = wdq_cntr - 1; + dq_in_valid = 1'b1; + end else begin + dq_in_valid = 1'b0; + dqs_in_valid <= 1'b0; + for (i=0; i<36; i=i+1) begin + wdqs_pos_cntr[i] <= 0; + end + end + if (wr_pipeline[0]) begin + b2b_write <= 1'b0; + end + if (wr_pipeline[2]) begin + if (dqs_in_valid) begin + b2b_write <= 1'b1; + end + dqs_in_valid <= 1'b1; + end + // read dqs enable counter + if (rd_pipeline[RDQSEN_PRE]) begin + rdqsen_cntr = RDQSEN_PRE + burst_length + RDQSEN_PST - 1; + end + if (rdqsen_cntr > 0) begin + rdqsen_cntr = rdqsen_cntr - 1; + dqs_out_en = 1'b1; + end else begin + dqs_out_en = 1'b0; + end + + // read dqs counter + if (rd_pipeline[RDQS_PRE]) begin + rdqs_cntr = RDQS_PRE + burst_length + RDQS_PST - 1; + end + // read dqs + if ((rdqs_cntr >= burst_length + RDQS_PST) && (rdq_cntr == 0)) begin //read preamble + dqs_out = 1'b0; + end else if (rdqs_cntr > RDQS_PST) begin // read data + dqs_out = rdqs_cntr - RDQS_PST; + end else if (rdqs_cntr > 0) begin // read postamble + dqs_out = 1'b0; + end else begin + dqs_out = 1'b1; + end + if (rdqs_cntr > 0) begin + rdqs_cntr = rdqs_cntr - 1; + end + + // read dq enable counter + if (rd_pipeline[RDQEN_PRE]) begin + rdqen_cntr = RDQEN_PRE + burst_length + RDQEN_PST; + end + if (rdqen_cntr > 0) begin + rdqen_cntr = rdqen_cntr - 1; + dq_out_en = 1'b1; + end else begin + dq_out_en = 1'b0; + end + // read dq + if (rd_pipeline[0]) begin + rdq_cntr = burst_length; + end + if (rdq_cntr > 0) begin // read data + dq_temp = memory_data>>(burst_position*DQ_BITS); + dq_out = dq_temp; + if (DEBUG) $display ("%m: at time %t INFO: READ @ DQS= bank = %h row = %h col = %h data = %h",$time, bank, row, (-1*BL_MAX & col) + burst_position, dq_temp); + rdq_cntr = rdq_cntr - 1; + end else begin + dq_out = {DQ_BITS{1'b1}}; + end + + // delay signals prior to output + if (RANDOM_OUT_DELAY && (dqs_out_en || |dqs_out_en_dly || dq_out_en || |dq_out_en_dly)) begin + for (i=0; i dqsck[i] + TQHS + TDQSQ) begin + dqsck_max = dqsck[i] + TQHS + TDQSQ; + end + dqsck_min = -1*TDQSCK; + if (dqsck_min < dqsck[i] - TQHS - TDQSQ) begin + dqsck_min = dqsck[i] - TQHS - TDQSQ; + end + + // DQSQ requirements + // 1.) less than tAC - DQSCK + // 2.) less than tDQSQ + // 3.) greater than -tAC + // 4.) greater than tQH from previous DQS edge + dqsq_min = -1*TAC; + if (dqsq_min < dqsck[i] - TQHS) begin + dqsq_min = dqsck[i] - TQHS; + end + if (dqsck_min == dqsck_max) begin + dqsck[i] = dqsck_min; + end else begin + dqsck[i] = $dist_uniform(seed, dqsck_min, dqsck_max); + end + dqsq_max = TAC; + if (dqsq_max > TDQSQ + dqsck[i]) begin + dqsq_max = TDQSQ + dqsck[i]; + end + + dqs_out_en_dly[i] <= #(tck_avg/2.0 + ($random % TAC)) dqs_out_en; + dqs_out_dly[i] <= #(tck_avg/2.0 + dqsck[i]) dqs_out; + for (j=0; j<`DQ_PER_DQS; j=j+1) begin + if (dq_out_en) begin // tLZ2 + dq_out_en_dly[i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + $dist_uniform(seed, -2*TAC, dqsq_max)) dq_out_en; + end else begin // tHZ + dq_out_en_dly[i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + ($random % TAC)) dq_out_en; + end + if (dqsq_min == dqsq_max) begin + dq_out_dly [i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + dqsq_min) dq_out[i*`DQ_PER_DQS + j]; + end else begin + dq_out_dly [i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + $dist_uniform(seed, dqsq_min, dqsq_max)) dq_out[i*`DQ_PER_DQS + j]; + end + end + end + end else begin + out_delay = tck_avg/2.0; + dqs_out_en_dly <= #(out_delay) {DQS_BITS{dqs_out_en}}; + dqs_out_dly <= #(out_delay) {DQS_BITS{dqs_out }}; + dq_out_en_dly <= #(out_delay) {DQ_BITS {dq_out_en }}; + dq_out_dly <= #(out_delay) {DQ_BITS {dq_out }}; + end + end + endtask + + always @(diff_ck) begin : main + integer i; + + if (!in_self_refresh && (diff_ck !== 1'b0) && (diff_ck !== 1'b1)) + $display ("%m: at time %t ERROR: CK and CK_N are not allowed to go to an unknown state.", $time); + data_task; + if (diff_ck) begin + // check setup of command signals + if ($time > TIS) begin + if ($time - tm_cke < TIS) + $display ("%m: at time %t ERROR: tIS violation on CKE by %t", $time, tm_cke + TIS - $time); + if (cke_in) begin + for (i=0; i<22; i=i+1) begin + if ($time - tm_cmd_addr[i] < TIS) + $display ("%m: at time %t ERROR: tIS violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIS - $time); + end + end + end + + // update current state + if (!dll_locked && !in_self_refresh && (ck_cntr - ck_dll_reset == TDLLK)) begin + // check CL value against the clock frequency + if (cas_latency*tck_avg < CL_TIME) + $display ("%m: at time %t ERROR: CAS Latency = %d is illegal @tCK(avg) = %f", $time, cas_latency, tck_avg); + // check WR value against the clock frequency + if (write_recovery*tck_avg < TWR) + $display ("%m: at time %t ERROR: Write Recovery = %d is illegal @tCK(avg) = %f", $time, write_recovery, tck_avg); + dll_locked = 1; + end + if (|auto_precharge_bank) begin + for (i=0; i<`BANKS; i=i+1) begin + // Write with Auto Precharge Calculation + // 1. Meet minimum tRAS requirement + // 2. Write Latency PLUS BL/2 cycles PLUS WR after Write command + if (write_precharge_bank[i] + && ($time - tm_bank_activate[i] >= TRAS_MIN) + && (ck_cntr - ck_bank_write[i] >= write_latency + burst_length/2 + write_recovery)) begin + + if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", $time, i); + write_precharge_bank[i] = 0; + active_bank[i] = 0; + auto_precharge_bank[i] = 0; + ck_write_ap = ck_cntr; + tm_bank_precharge[i] = $time; + tm_precharge = $time; + end + // Read with Auto Precharge Calculation + // 1. Meet minimum tRAS requirement + // 2. Additive Latency plus BL/2 cycles after Read command + // 3. tRTP after the last 4-bit prefetch + if (read_precharge_bank[i] + && ($time - tm_bank_activate[i] >= TRAS_MIN) + && (ck_cntr - ck_bank_read[i] >= additive_latency + burst_length/2)) begin + + read_precharge_bank[i] = 0; + // In case the internal precharge is pushed out by tRTP, tRP starts at the point where + // the internal precharge happens (not at the next rising clock edge after this event). + if ($time - tm_bank_read_end[i] < TRTP) begin + if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", tm_bank_read_end[i] + TRTP, i); + active_bank[i] <= #(tm_bank_read_end[i] + TRTP - $time) 0; + auto_precharge_bank[i] <= #(tm_bank_read_end[i] + TRTP - $time) 0; + tm_bank_precharge[i] <= #(tm_bank_read_end[i] + TRTP - $time) tm_bank_read_end[i] + TRTP; + tm_precharge <= #(tm_bank_read_end[i] + TRTP - $time) tm_bank_read_end[i] + TRTP; + end else begin + if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", $time, i); + active_bank[i] = 0; + auto_precharge_bank[i] = 0; + tm_bank_precharge[i] = $time; + tm_precharge = $time; + end + end + end + end + + // respond to incoming command + if (cke_in ^ prev_cke) begin + ck_cke <= ck_cntr; + end + + cmd_task(cke_in, cmd_n_in, ba_in, addr_in); + if ((cmd_n_in == WRITE) || (cmd_n_in == READ)) begin + al_pipeline[2*additive_latency] = 1'b1; + end + if (al_pipeline[0]) begin + // check tRCD after additive latency + if ($time - tm_bank_activate[ba_pipeline[2*cas_latency - 1]] < TRCD) begin + if (rd_pipeline[2*cas_latency - 1]) begin + $display ("%m: at time %t ERROR: tRCD violation during %s", $time, cmd_string[READ]); + end else begin + $display ("%m: at time %t ERROR: tRCD violation during %s", $time, cmd_string[WRITE]); + end + end + // check tWTR after additive latency + if (rd_pipeline[2*cas_latency - 1]) begin + if ($time - tm_write_end < TWTR) + $display ("%m: at time %t ERROR: tWTR violation during %s", $time, cmd_string[READ]); + end + end + if (rd_pipeline[2*(cas_latency - burst_length/2 + 2) - 1]) begin + tm_bank_read_end[ba_pipeline[2*(cas_latency - burst_length/2 + 2) - 1]] <= $time; + end + for (i=0; i<`BANKS; i=i+1) begin + if ((ck_cntr - ck_bank_write[i] > write_latency) && (ck_cntr - ck_bank_write[i] <= write_latency + burst_length/2)) begin + tm_bank_write_end[i] <= $time; + tm_write_end <= $time; + end + end + + // clk pin is disabled during self refresh + if (!in_self_refresh) begin + tjit_cc_time = $time - tm_ck_pos - tck_i; + tck_i = $time - tm_ck_pos; + tck_avg = tck_avg - tck_sample[ck_cntr%TDLLK]/$itor(TDLLK); + tck_avg = tck_avg + tck_i/$itor(TDLLK); + tck_sample[ck_cntr%TDLLK] = tck_i; + tjit_per_rtime = tck_i - tck_avg; + + if (dll_locked) begin + // check accumulated error + terr_nper_rtime = 0; + for (i=0; i<50; i=i+1) begin + terr_nper_rtime = terr_nper_rtime + tck_sample[i] - tck_avg; + terr_nper_rtime = abs_value(terr_nper_rtime); + case (i) + 0 :; + 1 : if (terr_nper_rtime - TERR_2PER >= 1.0) $display ("%m: at time %t ERROR: tERR(2per) violation by %f ps.", $time, terr_nper_rtime - TERR_2PER); + 2 : if (terr_nper_rtime - TERR_3PER >= 1.0) $display ("%m: at time %t ERROR: tERR(3per) violation by %f ps.", $time, terr_nper_rtime - TERR_3PER); + 3 : if (terr_nper_rtime - TERR_4PER >= 1.0) $display ("%m: at time %t ERROR: tERR(4per) violation by %f ps.", $time, terr_nper_rtime - TERR_4PER); + 4 : if (terr_nper_rtime - TERR_5PER >= 1.0) $display ("%m: at time %t ERROR: tERR(5per) violation by %f ps.", $time, terr_nper_rtime - TERR_5PER); + 5,6,7,8,9 : if (terr_nper_rtime - TERR_N1PER >= 1.0) $display ("%m: at time %t ERROR: tERR(n1per) violation by %f ps.", $time, terr_nper_rtime - TERR_N1PER); + default : if (terr_nper_rtime - TERR_N2PER >= 1.0) $display ("%m: at time %t ERROR: tERR(n2per) violation by %f ps.", $time, terr_nper_rtime - TERR_N2PER); + endcase + end + + // check tCK min/max/jitter + if (abs_value(tjit_per_rtime) - TJIT_PER >= 1.0) + $display ("%m: at time %t ERROR: tJIT(per) violation by %f ps.", $time, abs_value(tjit_per_rtime) - TJIT_PER); + if (abs_value(tjit_cc_time) - TJIT_CC >= 1.0) + $display ("%m: at time %t ERROR: tJIT(cc) violation by %f ps.", $time, abs_value(tjit_cc_time) - TJIT_CC); + if (TCK_MIN - tck_avg >= 1.0) + $display ("%m: at time %t ERROR: tCK(avg) minimum violation by %f ps.", $time, TCK_MIN - tck_avg); + if (tck_avg - TCK_MAX >= 1.0) + $display ("%m: at time %t ERROR: tCK(avg) maximum violation by %f ps.", $time, tck_avg - TCK_MAX); + if (tm_ck_pos + TCK_MIN - TJIT_PER > $time) + $display ("%m: at time %t ERROR: tCK(abs) minimum violation by %t", $time, tm_ck_pos + TCK_MIN - TJIT_PER - $time); + if (tm_ck_pos + TCK_MAX + TJIT_PER < $time) + $display ("%m: at time %t ERROR: tCK(abs) maximum violation by %t", $time, $time - tm_ck_pos - TCK_MAX - TJIT_PER); + + // check tCL + if (tm_ck_neg + TCL_MIN*tck_avg - TJIT_DUTY > $time) + $display ("%m: at time %t ERROR: tCL(abs) minimum violation on CLK by %t", $time, tm_ck_neg + TCL_MIN*tck_avg - TJIT_DUTY - $time); + if (tm_ck_neg + TCL_MAX*tck_avg + TJIT_DUTY < $time) + $display ("%m: at time %t ERROR: tCL(abs) maximum violation on CLK by %t", $time, $time - tm_ck_neg - TCL_MAX*tck_avg - TJIT_DUTY); + if (tcl_avg < TCL_MIN*tck_avg) + $display ("%m: at time %t ERROR: tCL(avg) minimum violation on CLK by %t", $time, TCL_MIN*tck_avg - tcl_avg); + if (tcl_avg > TCL_MAX*tck_avg) + $display ("%m: at time %t ERROR: tCL(avg) maximum violation on CLK by %t", $time, tcl_avg - TCL_MAX*tck_avg); + end + + // calculate the tch avg jitter + tch_avg = tch_avg - tch_sample[ck_cntr%TDLLK]/$itor(TDLLK); + tch_avg = tch_avg + tch_i/$itor(TDLLK); + tch_sample[ck_cntr%TDLLK] = tch_i; + + // update timers/counters + tcl_i <= $time - tm_ck_neg; + end + + prev_odt <= odt_in; + // update timers/counters + ck_cntr <= ck_cntr + 1; + tm_ck_pos <= $time; + end else begin + // clk pin is disabled during self refresh + if (!in_self_refresh) begin + if (dll_locked) begin + if (tm_ck_pos + TCH_MIN*tck_avg - TJIT_DUTY > $time) + $display ("%m: at time %t ERROR: tCH(abs) minimum violation on CLK by %t", $time, tm_ck_pos + TCH_MIN*tck_avg - TJIT_DUTY + $time); + if (tm_ck_pos + TCH_MAX*tck_avg + TJIT_DUTY < $time) + $display ("%m: at time %t ERROR: tCH(abs) maximum violation on CLK by %t", $time, $time - tm_ck_pos - TCH_MAX*tck_avg - TJIT_DUTY); + if (tch_avg < TCH_MIN*tck_avg) + $display ("%m: at time %t ERROR: tCH(avg) minimum violation on CLK by %t", $time, TCH_MIN*tck_avg - tch_avg); + if (tch_avg > TCH_MAX*tck_avg) + $display ("%m: at time %t ERROR: tCH(avg) maximum violation on CLK by %t", $time, tch_avg - TCH_MAX*tck_avg); + end + + // calculate the tcl avg jitter + tcl_avg = tcl_avg - tcl_sample[ck_cntr%TDLLK]/$itor(TDLLK); + tcl_avg = tcl_avg + tcl_i/$itor(TDLLK); + tcl_sample[ck_cntr%TDLLK] = tcl_i; + + // update timers/counters + tch_i <= $time - tm_ck_pos; + end + tm_ck_neg <= $time; + end + + // on die termination + if (odt_en) begin + // clk pin is disabled during self refresh + if (!in_self_refresh && diff_ck) begin + if ($time - tm_odt < TIS) begin + $display ("%m: at time %t ERROR: tIS violation on ODT by %t", $time, tm_odt + TIS - $time); + end + if (prev_odt ^ odt_in) begin + if (!dll_locked) + $display ("%m: at time %t WARNING: tDLLK violation during ODT transition.", $time); + if (odt_in && ($time - tm_odt_en < TMOD)) + $display ("%m: at time %t ERROR: tMOD violation during ODT transition", $time); + if ($time - tm_self_refresh < TXSNR) + $display ("%m: at time %t ERROR: tXSNR violation during ODT transition", $time); + if (in_self_refresh) + $display ("%m: at time %t ERROR: Illegal ODT transition during Self Refresh.", $time); + + // async ODT mode applies: + // 1.) during active power down with slow exit + // 2.) during precharge power down + // 3.) if tANPD has not been satisfied + // 4.) until tAXPD has been satisfied + if ((in_power_down && (low_power || (active_bank == 0))) || (ck_cntr - ck_slow_exit_pd < TAXPD)) begin + if (ck_cntr - ck_slow_exit_pd < TAXPD) + $display ("%m: at time %t WARNING: tAXPD violation during ODT transition. Synchronous or asynchronous change in termination resistance is possible.", $time); + if (odt_in) begin + if (DEBUG) $display ("%m: at time %t INFO: Async On Die Termination = %d", $time + TAONPD, 1'b1); + odt_state <= #(TAONPD) 1'b1; + end else begin + if (DEBUG) $display ("%m: at time %t INFO: Async On Die Termination = %d", $time + TAOFPD, 1'b0); + odt_state <= #(TAOFPD) 1'b0; + end + // sync ODT mode applies: + // 1.) during normal operation + // 2.) during active power down with fast exit + end else begin + if (odt_in) begin + i = TAOND*2; + odt_pipeline[i] = 1'b1; + end else begin + i = TAOFD*2; + odt_pipeline[i] = 1'b1; + end + end + ck_odt <= ck_cntr; + end + end + if (odt_pipeline[0]) begin + odt_state = ~odt_state; + if (DEBUG) $display ("%m: at time %t INFO: Sync On Die Termination = %d", $time, odt_state); + end + end + + // shift pipelines + if (|wr_pipeline || |rd_pipeline || |al_pipeline) begin + al_pipeline = al_pipeline>>1; + wr_pipeline = wr_pipeline>>1; + rd_pipeline = rd_pipeline>>1; + for (i=0; i<`MAX_PIPE; i=i+1) begin + ba_pipeline[i] = ba_pipeline[i+1]; + row_pipeline[i] = row_pipeline[i+1]; + col_pipeline[i] = col_pipeline[i+1]; + end + end + if (|odt_pipeline) begin + odt_pipeline = odt_pipeline>>1; + end + end + + // receiver(s) + task dqs_even_receiver; + input [4:0] i; + reg [71:0] bit_mask; + begin + bit_mask = {`DQ_PER_DQS{1'b1}}<<(i*`DQ_PER_DQS); + if (dqs_even[i]) begin + if (rdqs_en) begin // rdqs disables dm + dm_in_pos[i] = 1'b0; + end else begin + dm_in_pos[i] = dm_in[i]; + end + dq_in_pos = (dq_in & bit_mask) | (dq_in_pos & ~bit_mask); + end + end + endtask + + always @(posedge dqs_even[ 0]) dqs_even_receiver( 0); + always @(posedge dqs_even[ 1]) dqs_even_receiver( 1); + always @(posedge dqs_even[ 2]) dqs_even_receiver( 2); + always @(posedge dqs_even[ 3]) dqs_even_receiver( 3); + always @(posedge dqs_even[ 4]) dqs_even_receiver( 4); + always @(posedge dqs_even[ 5]) dqs_even_receiver( 5); + always @(posedge dqs_even[ 6]) dqs_even_receiver( 6); + always @(posedge dqs_even[ 7]) dqs_even_receiver( 7); + always @(posedge dqs_even[ 8]) dqs_even_receiver( 8); + always @(posedge dqs_even[ 9]) dqs_even_receiver( 9); + always @(posedge dqs_even[10]) dqs_even_receiver(10); + always @(posedge dqs_even[11]) dqs_even_receiver(11); + always @(posedge dqs_even[12]) dqs_even_receiver(12); + always @(posedge dqs_even[13]) dqs_even_receiver(13); + always @(posedge dqs_even[14]) dqs_even_receiver(14); + always @(posedge dqs_even[15]) dqs_even_receiver(15); + always @(posedge dqs_even[16]) dqs_even_receiver(16); + always @(posedge dqs_even[17]) dqs_even_receiver(17); + + task dqs_odd_receiver; + input [4:0] i; + reg [71:0] bit_mask; + begin + bit_mask = {`DQ_PER_DQS{1'b1}}<<(i*`DQ_PER_DQS); + if (dqs_odd[i]) begin + if (rdqs_en) begin // rdqs disables dm + dm_in_neg[i] = 1'b0; + end else begin + dm_in_neg[i] = dm_in[i]; + end + dq_in_neg = (dq_in & bit_mask) | (dq_in_neg & ~bit_mask); + end + end + endtask + + always @(posedge dqs_odd[ 0]) dqs_odd_receiver( 0); + always @(posedge dqs_odd[ 1]) dqs_odd_receiver( 1); + always @(posedge dqs_odd[ 2]) dqs_odd_receiver( 2); + always @(posedge dqs_odd[ 3]) dqs_odd_receiver( 3); + always @(posedge dqs_odd[ 4]) dqs_odd_receiver( 4); + always @(posedge dqs_odd[ 5]) dqs_odd_receiver( 5); + always @(posedge dqs_odd[ 6]) dqs_odd_receiver( 6); + always @(posedge dqs_odd[ 7]) dqs_odd_receiver( 7); + always @(posedge dqs_odd[ 8]) dqs_odd_receiver( 8); + always @(posedge dqs_odd[ 9]) dqs_odd_receiver( 9); + always @(posedge dqs_odd[10]) dqs_odd_receiver(10); + always @(posedge dqs_odd[11]) dqs_odd_receiver(11); + always @(posedge dqs_odd[12]) dqs_odd_receiver(12); + always @(posedge dqs_odd[13]) dqs_odd_receiver(13); + always @(posedge dqs_odd[14]) dqs_odd_receiver(14); + always @(posedge dqs_odd[15]) dqs_odd_receiver(15); + always @(posedge dqs_odd[16]) dqs_odd_receiver(16); + always @(posedge dqs_odd[17]) dqs_odd_receiver(17); + + // Processes to check hold and pulse width of control signals + always @(cke_in) begin + if ($time > TIH) begin + if ($time - tm_ck_pos < TIH) + $display ("%m: at time %t ERROR: tIH violation on CKE by %t", $time, tm_ck_pos + TIH - $time); + end + if (dll_locked && ($time - tm_cke < $rtoi(TIPW*tck_avg))) + $display ("%m: at time %t ERROR: tIPW violation on CKE by %t", $time, tm_cke + TIPW*tck_avg - $time); + tm_cke = $time; + end + always @(odt_in) begin + if (odt_en && !in_self_refresh) begin + if ($time - tm_ck_pos < TIH) + $display ("%m: at time %t ERROR: tIH violation on ODT by %t", $time, tm_ck_pos + TIH - $time); + if (dll_locked && ($time - tm_odt < $rtoi(TIPW*tck_avg))) + $display ("%m: at time %t ERROR: tIPW violation on ODT by %t", $time, tm_odt + TIPW*tck_avg - $time); + end + tm_odt = $time; + end + + task cmd_addr_timing_check; + input i; + reg [4:0] i; + begin + if (prev_cke) begin + if ($time - tm_ck_pos < TIH) + $display ("%m: at time %t ERROR: tIH violation on %s by %t", $time, cmd_addr_string[i], tm_ck_pos + TIH - $time); + if (dll_locked && ($time - tm_cmd_addr[i] < $rtoi(TIPW*tck_avg))) + $display ("%m: at time %t ERROR: tIPW violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIPW*tck_avg - $time); + end + tm_cmd_addr[i] = $time; + end + endtask + + always @(cs_n_in ) cmd_addr_timing_check( 0); + always @(ras_n_in ) cmd_addr_timing_check( 1); + always @(cas_n_in ) cmd_addr_timing_check( 2); + always @(we_n_in ) cmd_addr_timing_check( 3); + always @(ba_in [ 0]) cmd_addr_timing_check( 4); + always @(ba_in [ 1]) cmd_addr_timing_check( 5); + always @(ba_in [ 2]) cmd_addr_timing_check( 6); + always @(addr_in[ 0]) cmd_addr_timing_check( 7); + always @(addr_in[ 1]) cmd_addr_timing_check( 8); + always @(addr_in[ 2]) cmd_addr_timing_check( 9); + always @(addr_in[ 3]) cmd_addr_timing_check(10); + always @(addr_in[ 4]) cmd_addr_timing_check(11); + always @(addr_in[ 5]) cmd_addr_timing_check(12); + always @(addr_in[ 6]) cmd_addr_timing_check(13); + always @(addr_in[ 7]) cmd_addr_timing_check(14); + always @(addr_in[ 8]) cmd_addr_timing_check(15); + always @(addr_in[ 9]) cmd_addr_timing_check(16); + always @(addr_in[10]) cmd_addr_timing_check(17); + always @(addr_in[11]) cmd_addr_timing_check(18); + always @(addr_in[12]) cmd_addr_timing_check(19); + always @(addr_in[13]) cmd_addr_timing_check(20); + always @(addr_in[14]) cmd_addr_timing_check(21); + always @(addr_in[15]) cmd_addr_timing_check(22); + + // Processes to check setup and hold of data signals + task dm_timing_check; + input i; + reg [4:0] i; + begin + if (dqs_in_valid) begin + if ($time - tm_dqs[i] < TDH) + $display ("%m: at time %t ERROR: tDH violation on DM bit %d by %t", $time, i, tm_dqs[i] + TDH - $time); + if (check_dm_tdipw[i]) begin + if (dll_locked && ($time - tm_dm[i] < $rtoi(TDIPW*tck_avg))) + $display ("%m: at time %t ERROR: tDIPW violation on DM bit %d by %t", $time, i, tm_dm[i] + TDIPW*tck_avg - $time); + end + end + check_dm_tdipw[i] <= 1'b0; + tm_dm[i] = $time; + end + endtask + + always @(dm_in[ 0]) dm_timing_check( 0); + always @(dm_in[ 1]) dm_timing_check( 1); + always @(dm_in[ 2]) dm_timing_check( 2); + always @(dm_in[ 3]) dm_timing_check( 3); + always @(dm_in[ 4]) dm_timing_check( 4); + always @(dm_in[ 5]) dm_timing_check( 5); + always @(dm_in[ 6]) dm_timing_check( 6); + always @(dm_in[ 7]) dm_timing_check( 7); + always @(dm_in[ 8]) dm_timing_check( 8); + always @(dm_in[ 9]) dm_timing_check( 9); + always @(dm_in[10]) dm_timing_check(10); + always @(dm_in[11]) dm_timing_check(11); + always @(dm_in[12]) dm_timing_check(12); + always @(dm_in[13]) dm_timing_check(13); + always @(dm_in[14]) dm_timing_check(14); + always @(dm_in[15]) dm_timing_check(15); + always @(dm_in[16]) dm_timing_check(16); + always @(dm_in[17]) dm_timing_check(17); + + task dq_timing_check; + input i; + reg [6:0] i; + begin + if (dqs_in_valid) begin + if ($time - tm_dqs[i/`DQ_PER_DQS] < TDH) + $display ("%m: at time %t ERROR: tDH violation on DQ bit %d by %t", $time, i, tm_dqs[i/`DQ_PER_DQS] + TDH - $time); + if (check_dq_tdipw[i]) begin + if (dll_locked && ($time - tm_dq[i] < $rtoi(TDIPW*tck_avg))) + $display ("%m: at time %t ERROR: tDIPW violation on DQ bit %d by %t", $time, i, tm_dq[i] + TDIPW*tck_avg - $time); + end + end + check_dq_tdipw[i] <= 1'b0; + tm_dq[i] = $time; + end + endtask + + always @(dq_in[ 0]) dq_timing_check( 0); + always @(dq_in[ 1]) dq_timing_check( 1); + always @(dq_in[ 2]) dq_timing_check( 2); + always @(dq_in[ 3]) dq_timing_check( 3); + always @(dq_in[ 4]) dq_timing_check( 4); + always @(dq_in[ 5]) dq_timing_check( 5); + always @(dq_in[ 6]) dq_timing_check( 6); + always @(dq_in[ 7]) dq_timing_check( 7); + always @(dq_in[ 8]) dq_timing_check( 8); + always @(dq_in[ 9]) dq_timing_check( 9); + always @(dq_in[10]) dq_timing_check(10); + always @(dq_in[11]) dq_timing_check(11); + always @(dq_in[12]) dq_timing_check(12); + always @(dq_in[13]) dq_timing_check(13); + always @(dq_in[14]) dq_timing_check(14); + always @(dq_in[15]) dq_timing_check(15); + always @(dq_in[16]) dq_timing_check(16); + always @(dq_in[17]) dq_timing_check(17); + always @(dq_in[18]) dq_timing_check(18); + always @(dq_in[19]) dq_timing_check(19); + always @(dq_in[20]) dq_timing_check(20); + always @(dq_in[21]) dq_timing_check(21); + always @(dq_in[22]) dq_timing_check(22); + always @(dq_in[23]) dq_timing_check(23); + always @(dq_in[24]) dq_timing_check(24); + always @(dq_in[25]) dq_timing_check(25); + always @(dq_in[26]) dq_timing_check(26); + always @(dq_in[27]) dq_timing_check(27); + always @(dq_in[28]) dq_timing_check(28); + always @(dq_in[29]) dq_timing_check(29); + always @(dq_in[30]) dq_timing_check(30); + always @(dq_in[31]) dq_timing_check(31); + always @(dq_in[32]) dq_timing_check(32); + always @(dq_in[33]) dq_timing_check(33); + always @(dq_in[34]) dq_timing_check(34); + always @(dq_in[35]) dq_timing_check(35); + always @(dq_in[36]) dq_timing_check(36); + always @(dq_in[37]) dq_timing_check(37); + always @(dq_in[38]) dq_timing_check(38); + always @(dq_in[39]) dq_timing_check(39); + always @(dq_in[40]) dq_timing_check(40); + always @(dq_in[41]) dq_timing_check(41); + always @(dq_in[42]) dq_timing_check(42); + always @(dq_in[43]) dq_timing_check(43); + always @(dq_in[44]) dq_timing_check(44); + always @(dq_in[45]) dq_timing_check(45); + always @(dq_in[46]) dq_timing_check(46); + always @(dq_in[47]) dq_timing_check(47); + always @(dq_in[48]) dq_timing_check(48); + always @(dq_in[49]) dq_timing_check(49); + always @(dq_in[50]) dq_timing_check(50); + always @(dq_in[51]) dq_timing_check(51); + always @(dq_in[52]) dq_timing_check(52); + always @(dq_in[53]) dq_timing_check(53); + always @(dq_in[54]) dq_timing_check(54); + always @(dq_in[55]) dq_timing_check(55); + always @(dq_in[56]) dq_timing_check(56); + always @(dq_in[57]) dq_timing_check(57); + always @(dq_in[58]) dq_timing_check(58); + always @(dq_in[59]) dq_timing_check(59); + always @(dq_in[60]) dq_timing_check(60); + always @(dq_in[61]) dq_timing_check(61); + always @(dq_in[62]) dq_timing_check(62); + always @(dq_in[63]) dq_timing_check(63); + always @(dq_in[64]) dq_timing_check(64); + always @(dq_in[65]) dq_timing_check(65); + always @(dq_in[66]) dq_timing_check(66); + always @(dq_in[67]) dq_timing_check(67); + always @(dq_in[68]) dq_timing_check(68); + always @(dq_in[69]) dq_timing_check(69); + always @(dq_in[70]) dq_timing_check(70); + always @(dq_in[71]) dq_timing_check(71); + + task dqs_pos_timing_check; + input i; + reg [5:0] i; + reg [3:0] j; + begin + if (dqs_in_valid && ((wdqs_pos_cntr[i] < burst_length/2) || b2b_write) && (dqs_n_en || i<18)) begin + if (dqs_in[i] ^ prev_dqs_in[i]) begin + if (dll_locked) begin + if (check_write_preamble[i]) begin + if ($time - tm_dqs_neg[i] < $rtoi(TWPRE*tck_avg)) + $display ("%m: at time %t ERROR: tWPRE violation on &s bit %d", $time, dqs_string[i/18], i%18); + end else if (check_write_postamble[i]) begin + if ($time - tm_dqs_neg[i] < $rtoi(TWPST*tck_avg)) + $display ("%m: at time %t ERROR: tWPST violation on %s bit %d", $time, dqs_string[i/18], i%18); + end else begin + if ($time - tm_dqs_neg[i] < $rtoi(TDQSL*tck_avg)) + $display ("%m: at time %t ERROR: tDQSL violation on %s bit %d", $time, dqs_string[i/18], i%18); + end + end + if ($time - tm_dm[i%18] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DM bit %d by %t", $time, i, tm_dm[i%18] + TDS - $time); + if (!dq_out_en) begin + for (j=0; j<`DQ_PER_DQS; j=j+1) begin + if ($time - tm_dq[i*`DQ_PER_DQS+j] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DQ bit %d by %t", $time, i*`DQ_PER_DQS+j, tm_dq[i*`DQ_PER_DQS+j] + TDS - $time); + check_dq_tdipw[i*`DQ_PER_DQS+j] <= 1'b1; + end + end + if ((wdqs_pos_cntr[i] < burst_length/2) && !b2b_write) begin + wdqs_pos_cntr[i] <= wdqs_pos_cntr[i] + 1; + end else begin + wdqs_pos_cntr[i] <= 1; + end + check_dm_tdipw[i%18] <= 1'b1; + check_write_preamble[i] <= 1'b0; + check_write_postamble[i] <= 1'b0; + check_write_dqs_low[i] <= 1'b0; + tm_dqs[i%18] <= $time; + end else begin + $display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/18], i%18); + end + end + tm_dqss_pos[i] <= $time; + tm_dqs_pos[i] = $time; + prev_dqs_in[i] <= dqs_in[i]; + end + endtask + + always @(posedge dqs_in[ 0]) dqs_pos_timing_check( 0); + always @(posedge dqs_in[ 1]) dqs_pos_timing_check( 1); + always @(posedge dqs_in[ 2]) dqs_pos_timing_check( 2); + always @(posedge dqs_in[ 3]) dqs_pos_timing_check( 3); + always @(posedge dqs_in[ 4]) dqs_pos_timing_check( 4); + always @(posedge dqs_in[ 5]) dqs_pos_timing_check( 5); + always @(posedge dqs_in[ 6]) dqs_pos_timing_check( 6); + always @(posedge dqs_in[ 7]) dqs_pos_timing_check( 7); + always @(posedge dqs_in[ 8]) dqs_pos_timing_check( 8); + always @(posedge dqs_in[ 9]) dqs_pos_timing_check( 9); + always @(posedge dqs_in[10]) dqs_pos_timing_check(10); + always @(posedge dqs_in[11]) dqs_pos_timing_check(11); + always @(posedge dqs_in[12]) dqs_pos_timing_check(12); + always @(posedge dqs_in[13]) dqs_pos_timing_check(13); + always @(posedge dqs_in[14]) dqs_pos_timing_check(14); + always @(posedge dqs_in[15]) dqs_pos_timing_check(15); + always @(posedge dqs_in[16]) dqs_pos_timing_check(16); + always @(posedge dqs_in[17]) dqs_pos_timing_check(17); + always @(negedge dqs_in[18]) dqs_pos_timing_check(18); + always @(negedge dqs_in[19]) dqs_pos_timing_check(19); + always @(negedge dqs_in[20]) dqs_pos_timing_check(20); + always @(negedge dqs_in[21]) dqs_pos_timing_check(21); + always @(negedge dqs_in[22]) dqs_pos_timing_check(22); + always @(negedge dqs_in[23]) dqs_pos_timing_check(23); + always @(negedge dqs_in[24]) dqs_pos_timing_check(24); + always @(negedge dqs_in[25]) dqs_pos_timing_check(25); + always @(negedge dqs_in[26]) dqs_pos_timing_check(26); + always @(negedge dqs_in[27]) dqs_pos_timing_check(27); + always @(negedge dqs_in[28]) dqs_pos_timing_check(28); + always @(negedge dqs_in[29]) dqs_pos_timing_check(29); + always @(negedge dqs_in[30]) dqs_pos_timing_check(30); + always @(negedge dqs_in[31]) dqs_pos_timing_check(31); + always @(negedge dqs_in[32]) dqs_neg_timing_check(32); + always @(negedge dqs_in[33]) dqs_neg_timing_check(33); + always @(negedge dqs_in[34]) dqs_neg_timing_check(34); + always @(negedge dqs_in[35]) dqs_neg_timing_check(35); + + task dqs_neg_timing_check; + input i; + reg [5:0] i; + reg [3:0] j; + begin + if (dqs_in_valid && (wdqs_pos_cntr[i] > 0) && check_write_dqs_high[i] && (dqs_n_en || i < 18)) begin + if (dqs_in[i] ^ prev_dqs_in[i]) begin + if (dll_locked) begin + if ($time - tm_dqs_pos[i] < $rtoi(TDQSH*tck_avg)) + $display ("%m: at time %t ERROR: tDQSH violation on %s bit %d", $time, dqs_string[i/18], i%18); + if ($time - tm_ck_pos < $rtoi(TDSH*tck_avg)) + $display ("%m: at time %t ERROR: tDSH violation on %s bit %d", $time, dqs_string[i/18], i%18); + end + if ($time - tm_dm[i%18] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DM bit %d by %t", $time, i, tm_dm[i%18] + TDS - $time); + if (!dq_out_en) begin + for (j=0; j<`DQ_PER_DQS; j=j+1) begin + if ($time - tm_dq[i*`DQ_PER_DQS+j] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DQ bit %d by %t", $time, i*`DQ_PER_DQS+j, tm_dq[i*`DQ_PER_DQS+j] + TDS - $time); + check_dq_tdipw[i*`DQ_PER_DQS+j] <= 1'b1; + end + end + check_dm_tdipw[i%18] <= 1'b1; + check_write_dqs_high[i] <= 1'b0; + tm_dqs[i%18] <= $time; + end else begin + $display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/18], i%18); + end + end + tm_dqs_neg[i] = $time; + prev_dqs_in[i] <= dqs_in[i]; + end + endtask + + always @(negedge dqs_in[ 0]) dqs_neg_timing_check( 0); + always @(negedge dqs_in[ 1]) dqs_neg_timing_check( 1); + always @(negedge dqs_in[ 2]) dqs_neg_timing_check( 2); + always @(negedge dqs_in[ 3]) dqs_neg_timing_check( 3); + always @(negedge dqs_in[ 4]) dqs_neg_timing_check( 4); + always @(negedge dqs_in[ 5]) dqs_neg_timing_check( 5); + always @(negedge dqs_in[ 6]) dqs_neg_timing_check( 6); + always @(negedge dqs_in[ 7]) dqs_neg_timing_check( 7); + always @(negedge dqs_in[ 8]) dqs_neg_timing_check( 8); + always @(negedge dqs_in[ 9]) dqs_neg_timing_check( 9); + always @(negedge dqs_in[10]) dqs_neg_timing_check(10); + always @(negedge dqs_in[11]) dqs_neg_timing_check(11); + always @(negedge dqs_in[12]) dqs_neg_timing_check(12); + always @(negedge dqs_in[13]) dqs_neg_timing_check(13); + always @(negedge dqs_in[14]) dqs_neg_timing_check(14); + always @(negedge dqs_in[15]) dqs_neg_timing_check(15); + always @(negedge dqs_in[16]) dqs_neg_timing_check(16); + always @(negedge dqs_in[17]) dqs_neg_timing_check(17); + always @(posedge dqs_in[18]) dqs_neg_timing_check(18); + always @(posedge dqs_in[19]) dqs_neg_timing_check(19); + always @(posedge dqs_in[20]) dqs_neg_timing_check(20); + always @(posedge dqs_in[21]) dqs_neg_timing_check(21); + always @(posedge dqs_in[22]) dqs_neg_timing_check(22); + always @(posedge dqs_in[23]) dqs_neg_timing_check(23); + always @(posedge dqs_in[24]) dqs_neg_timing_check(24); + always @(posedge dqs_in[25]) dqs_neg_timing_check(25); + always @(posedge dqs_in[26]) dqs_neg_timing_check(26); + always @(posedge dqs_in[27]) dqs_neg_timing_check(27); + always @(posedge dqs_in[28]) dqs_neg_timing_check(28); + always @(posedge dqs_in[29]) dqs_neg_timing_check(29); + always @(posedge dqs_in[30]) dqs_neg_timing_check(30); + always @(posedge dqs_in[31]) dqs_neg_timing_check(31); + always @(posedge dqs_in[32]) dqs_neg_timing_check(32); + always @(posedge dqs_in[33]) dqs_neg_timing_check(33); + always @(posedge dqs_in[34]) dqs_neg_timing_check(34); + always @(posedge dqs_in[35]) dqs_neg_timing_check(35); + +endmodule Index: versatile_mem_ctrl/tags/Rev2/bench/ddr/ddr2_module.v =================================================================== --- versatile_mem_ctrl/tags/Rev2/bench/ddr/ddr2_module.v (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/bench/ddr/ddr2_module.v (revision 109) @@ -0,0 +1,367 @@ +/**************************************************************************************** +* +* File Name: ddr2_module.v +* +* Dependencies: ddr2.v, ddr2.v, ddr2_parameters.vh +* +* Description: Micron SDRAM DDR2 (Double Data Rate 2) module model +* +* Limitation: - SPD (Serial Presence-Detect) is not modeled +* +* Disclaimer This software code and all associated documentation, comments or other +* of Warranty: information (collectively "Software") is provided "AS IS" without +* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGES. Because some jurisdictions prohibit the exclusion or +* limitation of liability for consequential or incidental damages, the +* above limitation may not apply to you. +* +* Copyright 2003 Micron Technology, Inc. All rights reserved. +* +****************************************************************************************/ + `timescale 1ps / 1ps + +module ddr2_module ( +`ifdef SODIMM +`else + reset_n, + cb , +`endif + ck , + ck_n , + cke , + s_n , + ras_n , + cas_n , + we_n , + ba , + addr , + odt , + dqs , + dqs_n , + dq , + scl , + sa , + sda +); + +`include "ddr2_parameters.vh" + + input [1:0] cke ; + input ras_n ; + input cas_n ; + input we_n ; + input [2:0] ba ; + input [15:0] addr ; + input [1:0] odt ; + inout [17:0] dqs ; + inout [17:0] dqs_n ; + inout [63:0] dq ; + input scl ; // no connect + inout sda ; // no connect + +`ifdef QUAD_RANK + initial if (DEBUG) $display("%m: Quad Rank"); +`else `ifdef DUAL_RANK + initial if (DEBUG) $display("%m: Dual Rank"); +`else + initial if (DEBUG) $display("%m: Single Rank"); +`endif `endif + +`ifdef ECC + initial if (DEBUG) $display("%m: ECC"); + `ifdef SODIMM + initial begin + $display("%m ERROR: ECC is not available on SODIMM configurations"); + if (STOP_ON_ERROR) $stop(0); + end + `endif +`else + initial if (DEBUG) $display("%m: non ECC"); +`endif + +`ifdef RDIMM + initial if (DEBUG) $display("%m: RDIMM"); + input reset_n; + input ck ; + input ck_n ; + input [3:0] s_n ; + inout [7:0] cb ; + input [2:0] sa ; // no connect + + wire [5:0] rck = {6{ck}}; + wire [5:0] rck_n = {6{ck_n}}; + reg [3:0] rs_n ; + reg rras_n ; + reg rcas_n ; + reg rwe_n ; + reg [2:0] rba ; + reg [15:0] raddr ; + reg [3:0] rcke ; + reg [3:0] rodt ; + + always @(negedge reset_n or posedge ck) begin + if (!reset_n) begin + rs_n <= #(500) 0; + rras_n <= #(500) 0; + rcas_n <= #(500) 0; + rwe_n <= #(500) 0; + rba <= #(500) 0; + raddr <= #(500) 0; + rcke <= #(500) 0; + rodt <= #(500) 0; + end else begin + rs_n <= #(500) s_n ; + rras_n <= #(500) ras_n; + rcas_n <= #(500) cas_n; + rwe_n <= #(500) we_n ; + rba <= #(500) ba ; + raddr <= #(500) addr ; + `ifdef QUAD_RANK + rcke <= #(500) {{2{cke[1]}}, {2{cke[0]}}}; + rodt <= #(500) {{2{odt[1]}}, {2{odt[0]}}}; + `else + rcke <= #(500) {2'b00, cke}; + rodt <= #(500) {2'b00, odt}; + `endif + + end + end +`else + `ifdef SODIMM + initial if (DEBUG) $display("%m: SODIMM"); + input [1:0] ck ; + input [1:0] ck_n ; + input [1:0] s_n ; + input [1:0] sa ; // no connect + + wire [7:0] cb; + wire [5:0] rck = {{3{ck[1]}}, {3{ck[0]}}}; + wire [5:0] rck_n = {{3{ck_n[1]}}, {3{ck_n[0]}}}; + `else + initial if (DEBUG) $display("%m: UDIMM"); + input reset_n; + input [2:0] ck ; + input [2:0] ck_n ; + input [1:0] s_n ; + inout [7:0] cb ; + input [2:0] sa ; // no connect + + wire [5:0] rck = {2{ck}}; + wire [5:0] rck_n = {2{ck_n}}; + `endif + + wire [2:0] rba = ba ; + wire [15:0] raddr = addr ; + wire rras_n = ras_n; + wire rcas_n = cas_n; + wire rwe_n = we_n ; + `ifdef QUAD_RANK + wire [3:0] rs_n = {{2{s_n[1]}}, {2{s_n[0]}}}; + wire [3:0] rcke = {{2{cke[1]}}, {2{cke[0]}}}; + wire [3:0] rodt = {{2{odt[1]}}, {2{odt[0]}}}; + `else + wire [3:0] rs_n = {2'b00, s_n}; + wire [3:0] rcke = {2'b00, cke}; + wire [3:0] rodt = {2'b00, odt}; + `endif +`endif + wire [15:0] rcb = {8'b0, cb}; + wire zero = 1'b0; + wire one = 1'b1; + + //ddr2 (ck , ck_n , cke , cs_n , ras_n , cas_n , we_n , dm_rdqs , ba , addr , dq , dqs , dqs_n , rdqs_n , odt ); +`ifdef x4 + initial if (DEBUG) $display("%m: Component Width = x4"); + ddr2 U1R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 3: 0], dqs[ 0] , dqs_n[ 0], , rodt[0]); + ddr2 U2R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [11: 8], dqs[ 1] , dqs_n[ 1], , rodt[0]); + ddr2 U3R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [19:16], dqs[ 2] , dqs_n[ 2], , rodt[0]); + ddr2 U4R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [27:24], dqs[ 3] , dqs_n[ 3], , rodt[0]); + ddr2 U6R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [35:32], dqs[ 4] , dqs_n[ 4], , rodt[0]); + ddr2 U7R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [43:40], dqs[ 5] , dqs_n[ 5], , rodt[0]); + ddr2 U8R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [51:48], dqs[ 6] , dqs_n[ 6], , rodt[0]); + ddr2 U9R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [59:56], dqs[ 7] , dqs_n[ 7], , rodt[0]); + `ifdef ECC + ddr2 U5R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], rcb[ 3: 0], dqs[ 8] , dqs_n[ 8], , rodt[0]); + `endif + ddr2 U18R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 7: 4], dqs[ 9] , dqs_n[ 9], , rodt[0]); + ddr2 U17R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [15:12], dqs[ 10] , dqs_n[ 10], , rodt[0]); + ddr2 U16R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [23:20], dqs[ 11] , dqs_n[ 11], , rodt[0]); + ddr2 U15R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [31:28], dqs[ 12] , dqs_n[ 12], , rodt[0]); + ddr2 U13R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [39:36], dqs[ 13] , dqs_n[ 13], , rodt[0]); + ddr2 U12R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [47:44], dqs[ 14] , dqs_n[ 14], , rodt[0]); + ddr2 U11R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [55:52], dqs[ 15] , dqs_n[ 15], , rodt[0]); + ddr2 U10R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [63:60], dqs[ 16] , dqs_n[ 16], , rodt[0]); + `ifdef ECC + ddr2 U14R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], rcb[ 7: 4], dqs[ 17] , dqs_n[ 17], , rodt[0]); + `endif + `ifdef DUAL_RANK + ddr2 U1R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 3: 0], dqs[ 0] , dqs_n[ 0], , rodt[1]); + ddr2 U2R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [11: 8], dqs[ 1] , dqs_n[ 1], , rodt[1]); + ddr2 U3R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [19:16], dqs[ 2] , dqs_n[ 2], , rodt[1]); + ddr2 U4R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [27:24], dqs[ 3] , dqs_n[ 3], , rodt[1]); + ddr2 U6R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [35:32], dqs[ 4] , dqs_n[ 4], , rodt[1]); + ddr2 U7R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [43:40], dqs[ 5] , dqs_n[ 5], , rodt[1]); + ddr2 U8R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [51:48], dqs[ 6] , dqs_n[ 6], , rodt[1]); + ddr2 U9R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [59:56], dqs[ 7] , dqs_n[ 7], , rodt[1]); + `ifdef ECC + ddr2 U5R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], rcb[ 3: 0], dqs[ 8] , dqs_n[ 8], , rodt[1]); + `endif + ddr2 U18R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 7: 4], dqs[ 9] , dqs_n[ 9], , rodt[1]); + ddr2 U17R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [15:12], dqs[ 10] , dqs_n[ 10], , rodt[1]); + ddr2 U16R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [23:20], dqs[ 11] , dqs_n[ 11], , rodt[1]); + ddr2 U15R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [31:28], dqs[ 12] , dqs_n[ 12], , rodt[1]); + ddr2 U13R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [39:36], dqs[ 13] , dqs_n[ 13], , rodt[1]); + ddr2 U12R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [47:44], dqs[ 14] , dqs_n[ 14], , rodt[1]); + ddr2 U11R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [55:52], dqs[ 15] , dqs_n[ 15], , rodt[1]); + ddr2 U10R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [63:60], dqs[ 16] , dqs_n[ 16], , rodt[1]); + `ifdef ECC + ddr2 U14R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], rcb[ 7: 4], dqs[ 17] , dqs_n[ 17], , rodt[1]); + `endif + `endif + `ifdef QUAD_RANK + ddr2 U1R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 3: 0], dqs[ 0] , dqs_n[ 0], , rodt[2]); + ddr2 U2R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [11: 8], dqs[ 1] , dqs_n[ 1], , rodt[2]); + ddr2 U3R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [19:16], dqs[ 2] , dqs_n[ 2], , rodt[2]); + ddr2 U4R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [27:24], dqs[ 3] , dqs_n[ 3], , rodt[2]); + ddr2 U6R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [35:32], dqs[ 4] , dqs_n[ 4], , rodt[2]); + ddr2 U7R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [43:40], dqs[ 5] , dqs_n[ 5], , rodt[2]); + ddr2 U8R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [51:48], dqs[ 6] , dqs_n[ 6], , rodt[2]); + ddr2 U9R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [59:56], dqs[ 7] , dqs_n[ 7], , rodt[2]); + `ifdef ECC + ddr2 U5R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], rcb[ 3: 0], dqs[ 8] , dqs_n[ 8], , rodt[2]); + `endif + ddr2 U18R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 7: 4], dqs[ 9] , dqs_n[ 9], , rodt[2]); + ddr2 U17R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [15:12], dqs[ 10] , dqs_n[ 10], , rodt[2]); + ddr2 U16R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [23:20], dqs[ 11] , dqs_n[ 11], , rodt[2]); + ddr2 U15R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [31:28], dqs[ 12] , dqs_n[ 12], , rodt[2]); + ddr2 U13R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [39:36], dqs[ 13] , dqs_n[ 13], , rodt[2]); + ddr2 U12R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [47:44], dqs[ 14] , dqs_n[ 14], , rodt[2]); + ddr2 U11R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [55:52], dqs[ 15] , dqs_n[ 15], , rodt[2]); + ddr2 U10R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [63:60], dqs[ 16] , dqs_n[ 16], , rodt[2]); + `ifdef ECC + ddr2 U14R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], rcb[ 7: 4], dqs[ 17] , dqs_n[ 17], , rodt[2]); + `endif + ddr2 U1R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 3: 0], dqs[ 0] , dqs_n[ 0], , rodt[3]); + ddr2 U2R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [11: 8], dqs[ 1] , dqs_n[ 1], , rodt[3]); + ddr2 U3R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [19:16], dqs[ 2] , dqs_n[ 2], , rodt[3]); + ddr2 U4R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [27:24], dqs[ 3] , dqs_n[ 3], , rodt[3]); + ddr2 U6R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [35:32], dqs[ 4] , dqs_n[ 4], , rodt[3]); + ddr2 U7R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [43:40], dqs[ 5] , dqs_n[ 5], , rodt[3]); + ddr2 U8R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [51:48], dqs[ 6] , dqs_n[ 6], , rodt[3]); + ddr2 U9R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [59:56], dqs[ 7] , dqs_n[ 7], , rodt[3]); + `ifdef ECC + ddr2 U5R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], rcb[ 3: 0], dqs[ 8] , dqs_n[ 8], , rodt[3]); + `endif + ddr2 U18R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [ 7: 4], dqs[ 9] , dqs_n[ 9], , rodt[3]); + ddr2 U17R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [15:12], dqs[ 10] , dqs_n[ 10], , rodt[3]); + ddr2 U16R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [23:20], dqs[ 11] , dqs_n[ 11], , rodt[3]); + ddr2 U15R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [31:28], dqs[ 12] , dqs_n[ 12], , rodt[3]); + ddr2 U13R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [39:36], dqs[ 13] , dqs_n[ 13], , rodt[3]); + ddr2 U12R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [47:44], dqs[ 14] , dqs_n[ 14], , rodt[3]); + ddr2 U11R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [55:52], dqs[ 15] , dqs_n[ 15], , rodt[3]); + ddr2 U10R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], dq [63:60], dqs[ 16] , dqs_n[ 16], , rodt[3]); + `ifdef ECC + ddr2 U14R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, zero , rba, raddr[ADDR_BITS-1:0], rcb[ 7: 4], dqs[ 17] , dqs_n[ 17], , rodt[3]); + `endif + `endif +`else `ifdef x8 + initial if (DEBUG) $display("%m: Component Width = x8"); + ddr2 U1R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[ 9] , rba, raddr[ADDR_BITS-1:0], dq [ 7: 0], dqs[ 0] , dqs_n[ 0], dqs_n[ 9], rodt[0]); + ddr2 U2R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[10] , rba, raddr[ADDR_BITS-1:0], dq [15: 8], dqs[ 1] , dqs_n[ 1], dqs_n[10], rodt[0]); + ddr2 U3R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[11] , rba, raddr[ADDR_BITS-1:0], dq [23:16], dqs[ 2] , dqs_n[ 2], dqs_n[11], rodt[0]); + ddr2 U4R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[12] , rba, raddr[ADDR_BITS-1:0], dq [31:24], dqs[ 3] , dqs_n[ 3], dqs_n[12], rodt[0]); + ddr2 U6R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[13] , rba, raddr[ADDR_BITS-1:0], dq [39:32], dqs[ 4] , dqs_n[ 4], dqs_n[13], rodt[0]); + ddr2 U7R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[14] , rba, raddr[ADDR_BITS-1:0], dq [47:40], dqs[ 5] , dqs_n[ 5], dqs_n[14], rodt[0]); + ddr2 U8R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[15] , rba, raddr[ADDR_BITS-1:0], dq [55:48], dqs[ 6] , dqs_n[ 6], dqs_n[15], rodt[0]); + ddr2 U9R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[16] , rba, raddr[ADDR_BITS-1:0], dq [63:56], dqs[ 7] , dqs_n[ 7], dqs_n[16], rodt[0]); + `ifdef ECC + ddr2 U5R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[17] , rba, raddr[ADDR_BITS-1:0], rcb[ 7: 0], dqs[ 8] , dqs_n[ 8], dqs_n[17], rodt[0]); + `endif + `ifdef DUAL_RANK + ddr2 U1R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[ 9] , rba, raddr[ADDR_BITS-1:0], dq [ 7: 0], dqs[ 0] , dqs_n[ 0], dqs_n[ 9], rodt[1]); + ddr2 U2R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[10] , rba, raddr[ADDR_BITS-1:0], dq [15: 8], dqs[ 1] , dqs_n[ 1], dqs_n[10], rodt[1]); + ddr2 U3R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[11] , rba, raddr[ADDR_BITS-1:0], dq [23:16], dqs[ 2] , dqs_n[ 2], dqs_n[11], rodt[1]); + ddr2 U4R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[12] , rba, raddr[ADDR_BITS-1:0], dq [31:24], dqs[ 3] , dqs_n[ 3], dqs_n[12], rodt[1]); + ddr2 U6R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[13] , rba, raddr[ADDR_BITS-1:0], dq [39:32], dqs[ 4] , dqs_n[ 4], dqs_n[13], rodt[1]); + ddr2 U7R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[14] , rba, raddr[ADDR_BITS-1:0], dq [47:40], dqs[ 5] , dqs_n[ 5], dqs_n[14], rodt[1]); + ddr2 U8R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[15] , rba, raddr[ADDR_BITS-1:0], dq [55:48], dqs[ 6] , dqs_n[ 6], dqs_n[15], rodt[1]); + ddr2 U9R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[16] , rba, raddr[ADDR_BITS-1:0], dq [63:56], dqs[ 7] , dqs_n[ 7], dqs_n[16], rodt[1]); + `ifdef ECC + ddr2 U5R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[17] , rba, raddr[ADDR_BITS-1:0], rcb[ 7: 0], dqs[ 8] , dqs_n[ 8], dqs_n[17], rodt[1]); + `endif + `endif + `ifdef QUAD_RANK + ddr2 U1R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[ 9] , rba, raddr[ADDR_BITS-1:0], dq [ 7: 0], dqs[ 0] , dqs_n[ 0], dqs_n[ 9], rodt[2]); + ddr2 U2R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[10] , rba, raddr[ADDR_BITS-1:0], dq [15: 8], dqs[ 1] , dqs_n[ 1], dqs_n[10], rodt[2]); + ddr2 U3R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[11] , rba, raddr[ADDR_BITS-1:0], dq [23:16], dqs[ 2] , dqs_n[ 2], dqs_n[11], rodt[2]); + ddr2 U4R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[12] , rba, raddr[ADDR_BITS-1:0], dq [31:24], dqs[ 3] , dqs_n[ 3], dqs_n[12], rodt[2]); + ddr2 U6R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[13] , rba, raddr[ADDR_BITS-1:0], dq [39:32], dqs[ 4] , dqs_n[ 4], dqs_n[13], rodt[2]); + ddr2 U7R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[14] , rba, raddr[ADDR_BITS-1:0], dq [47:40], dqs[ 5] , dqs_n[ 5], dqs_n[14], rodt[2]); + ddr2 U8R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[15] , rba, raddr[ADDR_BITS-1:0], dq [55:48], dqs[ 6] , dqs_n[ 6], dqs_n[15], rodt[2]); + ddr2 U9R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[16] , rba, raddr[ADDR_BITS-1:0], dq [63:56], dqs[ 7] , dqs_n[ 7], dqs_n[16], rodt[2]); + `ifdef ECC + ddr2 U5R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[17] , rba, raddr[ADDR_BITS-1:0], rcb[ 7: 0], dqs[ 8] , dqs_n[ 8], dqs_n[17], rodt[2]); + `endif + ddr2 U1R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[ 9] , rba, raddr[ADDR_BITS-1:0], dq [ 7: 0], dqs[ 0] , dqs_n[ 0], dqs_n[ 9], rodt[3]); + ddr2 U2R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[10] , rba, raddr[ADDR_BITS-1:0], dq [15: 8], dqs[ 1] , dqs_n[ 1], dqs_n[10], rodt[3]); + ddr2 U3R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[11] , rba, raddr[ADDR_BITS-1:0], dq [23:16], dqs[ 2] , dqs_n[ 2], dqs_n[11], rodt[3]); + ddr2 U4R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[12] , rba, raddr[ADDR_BITS-1:0], dq [31:24], dqs[ 3] , dqs_n[ 3], dqs_n[12], rodt[3]); + ddr2 U6R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[13] , rba, raddr[ADDR_BITS-1:0], dq [39:32], dqs[ 4] , dqs_n[ 4], dqs_n[13], rodt[3]); + ddr2 U7R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[14] , rba, raddr[ADDR_BITS-1:0], dq [47:40], dqs[ 5] , dqs_n[ 5], dqs_n[14], rodt[3]); + ddr2 U8R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[15] , rba, raddr[ADDR_BITS-1:0], dq [55:48], dqs[ 6] , dqs_n[ 6], dqs_n[15], rodt[3]); + ddr2 U9R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[16] , rba, raddr[ADDR_BITS-1:0], dq [63:56], dqs[ 7] , dqs_n[ 7], dqs_n[16], rodt[3]); + `ifdef ECC + ddr2 U5R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[17] , rba, raddr[ADDR_BITS-1:0], rcb[ 7: 0], dqs[ 8] , dqs_n[ 8], dqs_n[17], rodt[3]); + `endif + `endif +`else `ifdef x16 + initial if (DEBUG) $display("%m: Component Width = x16"); + ddr2 U1R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[10: 9] , rba, raddr[ADDR_BITS-1:0], dq [15: 0], dqs[1:0] , dqs_n[1:0], , rodt[0]); + ddr2 U2R0 (rck[1], rck_n[1], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[12:11] , rba, raddr[ADDR_BITS-1:0], dq [31:16], dqs[3:2] , dqs_n[3:2], , rodt[0]); + ddr2 U4R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[14:13] , rba, raddr[ADDR_BITS-1:0], dq [47:32], dqs[5:4] , dqs_n[5:4], , rodt[0]); + ddr2 U5R0 (rck[2], rck_n[2], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, dqs[16:15] , rba, raddr[ADDR_BITS-1:0], dq [63:48], dqs[7:6] , dqs_n[7:6], , rodt[0]); + `ifdef ECC + ddr2 U3R0 (rck[0], rck_n[0], rcke[0], rs_n[0], rras_n, rcas_n, rwe_n, {one, dqs[17]}, rba, raddr[ADDR_BITS-1:0], rcb[15: 0], {zero, dqs[8]}, {one, dqs_n[8]}, , rodt[0]); + `endif + `ifdef DUAL_RANK + ddr2 U1R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[10: 9] , rba, raddr[ADDR_BITS-1:0], dq [15: 0], dqs[1:0] , dqs_n[1:0], , rodt[1]); + ddr2 U2R1 (rck[4], rck_n[4], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[12:11] , rba, raddr[ADDR_BITS-1:0], dq [31:16], dqs[3:2] , dqs_n[3:2], , rodt[1]); + ddr2 U4R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[14:13] , rba, raddr[ADDR_BITS-1:0], dq [47:32], dqs[5:4] , dqs_n[5:4], , rodt[1]); + ddr2 U5R1 (rck[5], rck_n[5], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, dqs[16:15] , rba, raddr[ADDR_BITS-1:0], dq [63:48], dqs[7:6] , dqs_n[7:6], , rodt[1]); + `ifdef ECC + ddr2 U3R1 (rck[3], rck_n[3], rcke[1], rs_n[1], rras_n, rcas_n, rwe_n, {one, dqs[17]}, rba, raddr[ADDR_BITS-1:0], rcb[15: 0], {zero, dqs[8]}, {one, dqs_n[8]}, , rodt[1]); + `endif + `endif + `ifdef QUAD_RANK + ddr2 U1R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[10: 9] , rba, raddr[ADDR_BITS-1:0], dq [15: 0], dqs[1:0] , dqs_n[1:0], , rodt[2]); + ddr2 U2R2 (rck[1], rck_n[1], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[12:11] , rba, raddr[ADDR_BITS-1:0], dq [31:16], dqs[3:2] , dqs_n[3:2], , rodt[2]); + ddr2 U4R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[14:13] , rba, raddr[ADDR_BITS-1:0], dq [47:32], dqs[5:4] , dqs_n[5:4], , rodt[2]); + ddr2 U5R2 (rck[2], rck_n[2], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, dqs[16:15] , rba, raddr[ADDR_BITS-1:0], dq [63:48], dqs[7:6] , dqs_n[7:6], , rodt[2]); + `ifdef ECC + ddr2 U3R2 (rck[0], rck_n[0], rcke[2], rs_n[2], rras_n, rcas_n, rwe_n, {one, dqs[17]}, rba, raddr[ADDR_BITS-1:0], rcb[15: 0], {zero, dqs[8]}, {one, dqs_n[8]}, , rodt[2]); + `endif + ddr2 U1R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[10: 9] , rba, raddr[ADDR_BITS-1:0], dq [15: 0], dqs[1:0] , dqs_n[1:0], , rodt[3]); + ddr2 U2R3 (rck[4], rck_n[4], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[12:11] , rba, raddr[ADDR_BITS-1:0], dq [31:16], dqs[3:2] , dqs_n[3:2], , rodt[3]); + ddr2 U4R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[14:13] , rba, raddr[ADDR_BITS-1:0], dq [47:32], dqs[5:4] , dqs_n[5:4], , rodt[3]); + ddr2 U5R3 (rck[5], rck_n[5], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, dqs[16:15] , rba, raddr[ADDR_BITS-1:0], dq [63:48], dqs[7:6] , dqs_n[7:6], , rodt[3]); + `ifdef ECC + ddr2 U3R3 (rck[3], rck_n[3], rcke[3], rs_n[3], rras_n, rcas_n, rwe_n, {one, dqs[17]}, rba, raddr[ADDR_BITS-1:0], rcb[15: 0], {zero, dqs[8]}, {one, dqs_n[8]}, , rodt[3]); + `endif + `endif +`endif `endif `endif + +endmodule Index: versatile_mem_ctrl/tags/Rev2/bench/ddr/subtest.vh =================================================================== --- versatile_mem_ctrl/tags/Rev2/bench/ddr/subtest.vh (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/bench/ddr/subtest.vh (revision 109) @@ -0,0 +1,225 @@ +/**************************************************************************************** +* +* File Name: subtest.vh +* +* Description: Micron SDRAM DDR2 (Double Data Rate 2) +* This file is included by tb.v +* +* Disclaimer This software code and all associated documentation, comments or other +* of Warranty: information (collectively "Software") is provided "AS IS" without +* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGES. Because some jurisdictions prohibit the exclusion or +* limitation of liability for consequential or incidental damages, the +* above limitation may not apply to you. +* +* Copyright 2003 Micron Technology, Inc. All rights reserved. +* +****************************************************************************************/ + + initial begin : test + cke <= 1'b0; + cs_n <= 1'b1; + ras_n <= 1'b1; + cas_n <= 1'b1; + we_n <= 1'b1; + ba <= {BA_BITS{1'bz}}; + a <= {ADDR_BITS{1'bz}}; + odt <= 1'b0; + dq_en <= 1'b0; + dqs_en <= 1'b0; + + cke <= 1'b1; + + // POWERUP SECTION + power_up; + + // INITIALIZE SECTION + precharge (0, 1); // Precharge all banks + nop (trp); + + load_mode (2, 0); // Extended Mode Register (2) + nop (tmrd-1); + + load_mode (3, 0); // Extended Mode Register (3) + nop (tmrd-1); + + load_mode (1, 13'b0_0_0_000_0_000_1_0_0); // Extended Mode Register with DLL Enable + nop (tmrd-1); + + load_mode (0, 13'b0_000_1_0_000_0_011 | (twr-1)<<9 | taa<<4); // Mode Register without DLL Reset (bl=8) + nop (tmrd-1); + + precharge (0, 1); // Precharge all banks + nop (trp); + + refresh; + nop (trfc-1); + + refresh; + nop (trfc-1); + + load_mode (0, 13'b0_000_0_0_000_0_011 | (twr-1)<<9 | taa<<4); // Mode Register without DLL Reset (bl=8) + nop (tmrd-1); + + load_mode (1, 13'b0_0_0_111_0_000_1_0_0); // Extended Mode Register with OCD Default + nop (tmrd-1); + + load_mode (1, 13'b0_0_0_000_0_000_1_0_0); // Extended Mode Register with OCD Exit + nop (tmrd-1); + + // DLL RESET ENABLE - you will need 200 TCK before any read command. + nop (200); + + // WRITE SECTION + activate (0, 0); // Activate Bank 0, Row 0 + nop (trcd-1); + write (0, 4, 0, 0, 'h3210); // Write Bank 0, Col 0 + nop (tccd-1); + write (0, 0, 1, 0, 'h0123); // Write Bank 0, Col 0 + + activate (1, 0); // Activate Bank 1, Row 0 + nop (trcd-1); + write (1, 0, 1, 0, 'h4567); // Write Bank 1, Col 0 + + activate (2, 0); // Activate Bank 2, Row 0 + nop (trcd-1); + write (2, 0, 1, 0, 'h89AB); // Write Bank 2, Col 0 + + activate (3, 0); // Activate Bank 3, Row 0 + nop (trcd-1); + write (3, 0, 1, 0, 'hCDEF); // Write Bank 3, Col 0 + + nop (cl - 1 + bl/2 + twtr-1); + + nop (tras); + + // READ SECTION + activate (0, 0); // Activate Bank 0, Row 0 + nop (trrd-1); + activate (1, 0); // Activate Bank 1, Row 0 + nop (trrd-1); + activate (2, 0); // Activate Bank 2, Row 0 + nop (trrd-1); + activate (3, 0); // Activate Bank 3, Row 0 + read (0, 0, 1); // Read Bank 0, Col 0 + nop (bl/2); + read (1, 1, 1); // Read Bank 1, Col 1 + nop (bl/2); + read (2, 2, 1); // Read Bank 2, Col 2 + nop (bl/2); + read (3, 3, 1); // Read Bank 3, Col 3 + nop (rl + bl/2); + + activate (0, 0); // Activate Bank 0, Row 0 + nop (trrd-1); + activate (1, 0); // Activate Bank 1, Row 0 + nop (trcd-1); + $display ("%m at time %t: Figure 22: Consecutive READ Bursts", $time); + read (0, 0, 0); // Read Bank 0, Col 0 + nop (bl/2-1); + read (0, 4, 0); // Read Bank 0, Col 4 + nop (rl + bl/2); + + $display ("%m at time %t: Figure 23: Nonconsecutive READ Bursts", $time); + read (0, 0, 0); // Read Bank 0, Col 0 + nop (bl/2); + read (0, 4, 0); // Read Bank 0, Col 4 + nop (rl + bl/2); + + $display ("%m at time %t: Figure 24: READ Interrupted by READ", $time); + read (0, 0, 0); // Read Bank 0, Col 0 + nop (tccd-1); + read (1, 0, 0); // Read Bank 0, Col 0 + nop (rl + bl/2); + + $display ("%m at time %t: Figure 25 & 26: READ to PRECHARGE", $time); + read (0, 0, 0); // Read Bank 0, Col 0 + nop (al + bl/2 + trtp - 2); + precharge (0, 0); // Precharge Bank 0 + nop (trp-1); + + activate (0, 0); // Activate Bank 0, Row 0 + nop (trcd-1); + $display ("%m at time %t: Figure 27: READ to WRITE", $time); + read (0, 0, 0); // Read Bank 0, Col 0 + nop (rl + bl/2 - wl); + write (0, 0, 1, 0, 'h0123); // Write Bank 0, Col 0 + nop (wl + bl/2 + twr + trp-1); + + activate (0, 0); // Activate Bank 0, Row 0 + nop (trcd-1); + $display ("%m at time %t: Figure 36: Nonconsecutive WRITE to WRITE", $time); + write (0, 0, 0, 0, 'h0123); // Write Bank 0, Col 0 + nop (bl/2); + write (0, 4, 0, 0, 'h0123); // Write Bank 0, Col 0 + nop (wl + bl/2); + + $display ("%m at time %t: Figure 37: Random WRITE Cycles", $time); + write (0, 0, 0, 0, 'h0123); // Write Bank 0, Col 0 + nop (bl/2-1); + write (0, 4, 0, 0, 'h0123); // Write Bank 0, Col 0 + nop (wl + bl/2); + + $display ("%m at time %t: Figure 37: Figure 38: WRITE Interrupted by WRITE", $time); + write (0, 0, 0, 0, 'h0123); // Write Bank 0, Col 0 + nop (tccd-1); + write (1, 4, 0, 0, 'h0123); // Write Bank 0, Col 0 + nop (wl + bl/2); + + $display ("%m at time %t: Figure 39: WRITE to READ", $time); + write (0, 0, 0, 0, 'h0123); // Write Bank 0, Col 0 + nop (wl + bl/2 + twtr-1); + read_verify (0, 0, 0, 0, 'h0123); // Read Bank 0, Col 0 + nop (rl + bl/2); + + $display ("%m at time %t: Figure 40: WRITE to PRECHARGE", $time); + write (0, 0, 0, 0, 'h0123); // Write Bank 0, Col 0 + nop (wl + bl/2 + twr-1); + precharge (0, 1); // Precharge all banks + nop (trp-1); + + // odt Section + $display ("%m at time %t: Figure 60: odt Timing for Active or Fast-Exit Power-Down Mode", $time); + odt = 1'b1; + nop (1); + odt = 1'b0; + nop (tanpd); + + $display ("%m at time %t: Figure 61: odt timing for Slow-Exit or Precharge Power-Down Modes", $time); + cke = 1'b0; + @(negedge ck); + odt = 1'b1; + @(negedge ck); + odt = 1'b0; + repeat(tanpd)@(negedge ck); + nop (taxpd); + + $display ("%m at time %t: Figure 62 & 63: odt Transition Timings when Entering Power-Down Mode", $time); + odt = 1'b1; + nop (tanpd); + power_down (tcke); + + // Self Refresh Section + nop (taxpd); + odt = 1'b0; + nop (3); // taofd + self_refresh (tcke); + nop (tdllk); + nop (tcke); + + test_done; + end Index: versatile_mem_ctrl/tags/Rev2/bench/ddr/tb.do =================================================================== --- versatile_mem_ctrl/tags/Rev2/bench/ddr/tb.do (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/bench/ddr/tb.do (revision 109) @@ -0,0 +1,31 @@ +######################################################################################### +# +# Disclaimer This software code and all associated documentation, comments or other +# of Warranty: information (collectively "Software") is provided "AS IS" without +# warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +# DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +# TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +# OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +# WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +# OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +# FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +# THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +# ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +# OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +# ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +# INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +# WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +# OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +# THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +# DAMAGES. Because some jurisdictions prohibit the exclusion or +# limitation of liability for consequential or incidental damages, the +# above limitation may not apply to you. +# +# Copyright 2003 Micron Technology, Inc. All rights reserved. +# +######################################################################################### + +vlog -novopt ddr2.v tb.v +vsim -novopt tb +add wave -p sdramddr2/* +run -all Index: versatile_mem_ctrl/tags/Rev2/bench/ddr/tb.v =================================================================== --- versatile_mem_ctrl/tags/Rev2/bench/ddr/tb.v (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/bench/ddr/tb.v (revision 109) @@ -0,0 +1,468 @@ +/**************************************************************************************** +* +* File Name: tb.v +* +* Dependencies: ddr2.v, ddr2_parameters.vh +* +* Description: Micron SDRAM DDR2 (Double Data Rate 2) test bench +* +* Note: -Set simulator resolution to "ps" accuracy +* -Set Debug = 0 to disable $display messages +* +* Disclaimer This software code and all associated documentation, comments or other +* of Warranty: information (collectively "Software") is provided "AS IS" without +* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGES. Because some jurisdictions prohibit the exclusion or +* limitation of liability for consequential or incidental damages, the +* above limitation may not apply to you. +* +* Copyright 2003 Micron Technology, Inc. All rights reserved. +* +****************************************************************************************/ + +// DO NOT CHANGE THE TIMESCALE + +`timescale 1ps / 1ps + +module tb; + +`include "ddr2_parameters.vh" + + // ports + reg ck; + wire ck_n = ~ck; + reg cke; + reg cs_n; + reg ras_n; + reg cas_n; + reg we_n; + reg [BA_BITS-1:0] ba; + reg [ADDR_BITS-1:0] a; + wire [DM_BITS-1:0] dm; + wire [DQ_BITS-1:0] dq; + wire [DQS_BITS-1:0] dqs; + wire [DQS_BITS-1:0] dqs_n; + wire [DQS_BITS-1:0] rdqs_n; + reg odt; + + // mode registers + reg [ADDR_BITS-1:0] mode_reg0; //Mode Register + reg [ADDR_BITS-1:0] mode_reg1; //Extended Mode Register + wire [2:0] cl = mode_reg0[6:4]; //CAS Latency + wire bo = mode_reg0[3]; //Burst Order + wire [7:0] bl = (1< $rtoi(number)) + ceil = $rtoi(number) + 1; + else + ceil = number; + endfunction + + function integer max; + input arg1; + input arg2; + integer arg1; + integer arg2; + if (arg1 > arg2) + max = arg1; + else + max = arg2; + endfunction + + task power_up; + begin + cke <= 1'b0; + odt <= 1'b0; + repeat(10) @(negedge ck); + cke <= 1'b1; + nop (400000/tck+1); + end + endtask + + task load_mode; + input [BA_BITS-1:0] bank; + input [ADDR_BITS-1:0] addr; + begin + case (bank) + 0: mode_reg0 = addr; + 1: mode_reg1 = addr; + endcase + cke <= 1'b1; + cs_n <= 1'b0; + ras_n <= 1'b0; + cas_n <= 1'b0; + we_n <= 1'b0; + ba <= bank; + a <= addr; + @(negedge ck); + end + endtask + + task refresh; + begin + cke <= 1'b1; + cs_n <= 1'b0; + ras_n <= 1'b0; + cas_n <= 1'b0; + we_n <= 1'b1; + @(negedge ck); + end + endtask + + task precharge; + input [BA_BITS-1:0] bank; + input ap; //precharge all + begin + cke <= 1'b1; + cs_n <= 1'b0; + ras_n <= 1'b0; + cas_n <= 1'b1; + we_n <= 1'b0; + ba <= bank; + a <= (ap<<10); + @(negedge ck); + end + endtask + + task activate; + input [BA_BITS-1:0] bank; + input [ROW_BITS-1:0] row; + begin + cke <= 1'b1; + cs_n <= 1'b0; + ras_n <= 1'b0; + cas_n <= 1'b1; + we_n <= 1'b1; + ba <= bank; + a <= row; + @(negedge ck); + end + endtask + + //write task supports burst lengths <= 8 + task write; + input [BA_BITS-1:0] bank; + input [COL_BITS-1:0] col; + input ap; //Auto Precharge + input [8*DM_BITS-1:0] dm; + input [8*DQ_BITS-1:0] dq; + reg [ADDR_BITS-1:0] atemp [1:0]; + integer i; + begin + cke <= 1'b1; + cs_n <= 1'b0; + ras_n <= 1'b1; + cas_n <= 1'b0; + we_n <= 1'b0; + ba <= bank; + atemp[0] = col & 10'h3ff; //addr[ 9: 0] = COL[ 9: 0] + atemp[1] = (col>>10)<<11; //addr[ N:11] = COL[ N:10] + a <= atemp[0] | atemp[1] | (ap<<10); + for (i=0; i<=bl; i=i+1) begin + + dqs_en <= #(wl*tck + i*tck/2) 1'b1; + if (i%2 == 0) begin + dqs_out <= #(wl*tck + i*tck/2) {DQS_BITS{1'b0}}; + end else begin + dqs_out <= #(wl*tck + i*tck/2) {DQS_BITS{1'b1}}; + end + + dq_en <= #(wl*tck + i*tck/2 + tck/4) 1'b1; + dm_out <= #(wl*tck + i*tck/2 + tck/4) dm>>i*DM_BITS; + dq_out <= #(wl*tck + i*tck/2 + tck/4) dq>>i*DQ_BITS; + end + dqs_en <= #(wl*tck + bl*tck/2 + tck/2) 1'b0; + dq_en <= #(wl*tck + bl*tck/2 + tck/4) 1'b0; + @(negedge ck); + end + endtask + + // read without data verification + task read; + input [BA_BITS-1:0] bank; + input [COL_BITS-1:0] col; + input ap; //Auto Precharge + reg [ADDR_BITS-1:0] atemp [1:0]; + begin + cke <= 1'b1; + cs_n <= 1'b0; + ras_n <= 1'b1; + cas_n <= 1'b0; + we_n <= 1'b1; + ba <= bank; + atemp[0] = col & 10'h3ff; //addr[ 9: 0] = COL[ 9: 0] + atemp[1] = (col>>10)<<11; //addr[ N:11] = COL[ N:10] + a <= atemp[0] | atemp[1] | (ap<<10); + @(negedge ck); + end + endtask + + task nop; + input [31:0] count; + begin + cke <= 1'b1; + cs_n <= 1'b0; + ras_n <= 1'b1; + cas_n <= 1'b1; + we_n <= 1'b1; + repeat(count) @(negedge ck); + end + endtask + + task deselect; + input [31:0] count; + begin + cke <= 1'b1; + cs_n <= 1'b1; + ras_n <= 1'b1; + cas_n <= 1'b1; + we_n <= 1'b1; + repeat(count) @(negedge ck); + end + endtask + + task power_down; + input [31:0] count; + begin + cke <= 1'b0; + cs_n <= 1'b1; + ras_n <= 1'b1; + cas_n <= 1'b1; + we_n <= 1'b1; + repeat(count) @(negedge ck); + end + endtask + + task self_refresh; + input [31:0] count; + begin + cke <= 1'b0; + cs_n <= 1'b0; + ras_n <= 1'b0; + cas_n <= 1'b0; + we_n <= 1'b1; + cs_n <= #(tck) 1'b1; + ras_n <= #(tck) 1'b1; + cas_n <= #(tck) 1'b1; + we_n <= #(tck) 1'b1; + repeat(count) @(negedge ck); + end + endtask + + // read with data verification + task read_verify; + input [BA_BITS-1:0] bank; + input [COL_BITS-1:0] col; + input ap; //Auto Precharge + input [8*DM_BITS-1:0] dm; //Expected Data Mask + input [8*DQ_BITS-1:0] dq; //Expected Data + integer i; + begin + read (bank, col, ap); + for (i=0; i> (i*DM_BITS); + dq_fifo[2*rl + i] = dq >> (i*DQ_BITS); + end + end + endtask + + // receiver(s) for data_verify process + dqrx dqrx[DQS_BITS-1:0] (dqs, dq, q0, q1, q2, q3); + + // perform data verification as a result of read_verify task call + always @(ck) begin:data_verify + integer i; + integer j; + reg [DQ_BITS-1:0] bit_mask; + reg [DM_BITS-1:0] dm_temp; + reg [DQ_BITS-1:0] dq_temp; + + for (i = !ck; (i < 2/(2.0 - !ck)); i=i+1) begin + if (dm_fifo[i] === {DM_BITS{1'bx}}) begin + burst_cntr = 0; + end else begin + + dm_temp = dm_fifo[i]; + for (j=0; j +add wave -noupdate -group {WISHBONE IF} -expand -group wb0 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_dat_i_0 +add wave -noupdate -group {WISHBONE IF} -expand -group wb0 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_adr_i_0 +add wave -noupdate -group {WISHBONE IF} -expand -group wb0 -format Literal /versatile_mem_ctrl_tb/dut/wb_stb_i_0 +add wave -noupdate -group {WISHBONE IF} -expand -group wb0 -format Literal /versatile_mem_ctrl_tb/dut/wb_cyc_i_0 +add wave -noupdate -group {WISHBONE IF} -expand -group wb0 -format Literal -expand /versatile_mem_ctrl_tb/dut/wb_ack_o_0 +add wave -noupdate -group {WISHBONE IF} -expand -group wb0 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_dat_o_0 +add wave -noupdate -group {WISHBONE IF} -expand -group wb0 -divider +add wave -noupdate -group {WISHBONE IF} -expand -group wb1 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_dat_i_1 +add wave -noupdate -group {WISHBONE IF} -expand -group wb1 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_adr_i_1 +add wave -noupdate -group {WISHBONE IF} -expand -group wb1 -format Literal /versatile_mem_ctrl_tb/dut/wb_stb_i_1 +add wave -noupdate -group {WISHBONE IF} -expand -group wb1 -format Literal /versatile_mem_ctrl_tb/dut/wb_cyc_i_1 +add wave -noupdate -group {WISHBONE IF} -expand -group wb1 -format Literal -expand /versatile_mem_ctrl_tb/dut/wb_ack_o_1 +add wave -noupdate -group {WISHBONE IF} -expand -group wb1 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_dat_o_1 +add wave -noupdate -group {WISHBONE IF} -expand -group wb1 -divider +add wave -noupdate -group {WISHBONE IF} -group wb2 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_dat_i_2 +add wave -noupdate -group {WISHBONE IF} -group wb2 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_adr_i_2 +add wave -noupdate -group {WISHBONE IF} -group wb2 -format Literal /versatile_mem_ctrl_tb/dut/wb_stb_i_2 +add wave -noupdate -group {WISHBONE IF} -group wb2 -format Literal /versatile_mem_ctrl_tb/dut/wb_cyc_i_2 +add wave -noupdate -group {WISHBONE IF} -group wb2 -format Literal /versatile_mem_ctrl_tb/dut/wb_ack_o_2 +add wave -noupdate -group {WISHBONE IF} -group wb2 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_dat_o_2 +add wave -noupdate -group {WISHBONE IF} -group wb2 -divider +add wave -noupdate -group {WISHBONE IF} -group wb3 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_dat_i_3 +add wave -noupdate -group {WISHBONE IF} -group wb3 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_adr_i_3 +add wave -noupdate -group {WISHBONE IF} -group wb3 -format Literal /versatile_mem_ctrl_tb/dut/wb_stb_i_3 +add wave -noupdate -group {WISHBONE IF} -group wb3 -format Literal /versatile_mem_ctrl_tb/dut/wb_cyc_i_3 +add wave -noupdate -group {WISHBONE IF} -group wb3 -format Literal /versatile_mem_ctrl_tb/dut/wb_ack_o_3 +add wave -noupdate -group {WISHBONE IF} -group wb3 -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/wb_dat_o_3 +add wave -noupdate -group {WISHBONE IF} -group wb3 -divider +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix ascii /versatile_mem_ctrl_tb/wb0i/statename +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/wb0_dat_i +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/wb0_adr_i +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/wb0_dat_o +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Logic /versatile_mem_ctrl_tb/wb0_ack_o +add wave -noupdate -group {WISHBONE IF} -group Testbench -divider +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix ascii /versatile_mem_ctrl_tb/wb1i/statename +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/wb1_dat_i +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/wb1_adr_i +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/wb1_dat_o +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Logic /versatile_mem_ctrl_tb/wb1_ack_o +add wave -noupdate -group {WISHBONE IF} -group Testbench -divider +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix ascii /versatile_mem_ctrl_tb/wb4i/statename +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/wb4_dat_i +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/wb4_adr_i +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/wb4_dat_o +add wave -noupdate -group {WISHBONE IF} -group Testbench -format Logic /versatile_mem_ctrl_tb/wb4_ack_o +add wave -noupdate -group {WISHBONE IF} -group Testbench -divider +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[31]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[30]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[29]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[28]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[27]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[26]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[25]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[24]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[23]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[22]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[21]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[20]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[19]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[18]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[17]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -group FIFO_0_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[16]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[15]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[14]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[13]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[12]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[11]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[10]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[9]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[8]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[7]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[6]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[5]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[4]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[3]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[2]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[1]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 0} -expand -group FIFO_0_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/dpram/ram[0]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[31]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[30]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[29]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[28]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[27]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[26]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[25]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[24]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[23]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[22]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[21]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[20]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[19]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[18]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[17]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -group FIFO_1_1 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[16]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[15]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[14]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[13]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[12]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[11]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[10]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[9]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[8]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[7]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[6]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[5]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[4]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[3]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[2]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[1]} +add wave -noupdate -group {TX FIFO (Egress FIFO)} -expand -group {Tx FIFO 1} -expand -group FIFO_1_0 -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/dpram/ram[0]} +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/rst +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/clk +add wave -noupdate -group {MAIN STATE MACHINE} -divider State +add wave -noupdate -group {MAIN STATE MACHINE} -format Literal -radix ascii /versatile_mem_ctrl_tb/dut/ddr_16_0/statename +add wave -noupdate -group {MAIN STATE MACHINE} -divider Input +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/bl_ack +add wave -noupdate -group {MAIN STATE MACHINE} -format Literal /versatile_mem_ctrl_tb/dut/ddr_16_0/burst_adr +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/fifo_empty +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/fifo_re_d +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/next_row_open +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/ref_delay_ack +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/ref_req +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/stall +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic -radix hexadecimal {/versatile_mem_ctrl_tb/dut/ddr_16_0/tx_fifo_dat_o[5]} +add wave -noupdate -group {MAIN STATE MACHINE} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/ddr_16_0/tx_fifo_dat_o +add wave -noupdate -group {MAIN STATE MACHINE} -divider Output +add wave -noupdate -group {MAIN STATE MACHINE} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/ddr_16_0/a +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/adr_init +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/bl_en +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/close_cur_row +add wave -noupdate -group {MAIN STATE MACHINE} -format Literal /versatile_mem_ctrl_tb/dut/ddr_16_0/cmd +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/cs_n +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/fifo_re +add wave -noupdate -group {MAIN STATE MACHINE} -format Literal /versatile_mem_ctrl_tb/dut/ddr_16_0/open_ba +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/open_cur_row +add wave -noupdate -group {MAIN STATE MACHINE} -format Literal /versatile_mem_ctrl_tb/dut/ddr_16_0/open_row +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/read +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/ref_ack +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/ref_delay +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/state_idle +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/write +add wave -noupdate -group {MAIN STATE MACHINE} -divider {Other usefull signals (Non-FSM)} +add wave -noupdate -group {MAIN STATE MACHINE} -format Literal /versatile_mem_ctrl_tb/dut/fifo_sel_domain_reg +add wave -noupdate -group {MAIN STATE MACHINE} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/fifo_dat_o +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/ddr_16_0/state_idle +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/tx_fifo_re_i +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/tx_fifo_re +add wave -noupdate -group {MAIN STATE MACHINE} -format Logic /versatile_mem_ctrl_tb/dut/burst_mask +add wave -noupdate -group {BURST ADDRESS} -divider State +add wave -noupdate -group {BURST ADDRESS} -format Literal -radix ascii /versatile_mem_ctrl_tb/dut/ddr_16_0/statename +add wave -noupdate -group {BURST ADDRESS} -divider {Burst Address} +add wave -noupdate -group {BURST ADDRESS} -format Logic /versatile_mem_ctrl_tb/dut/inc_adr0/rst +add wave -noupdate -group {BURST ADDRESS} -format Logic /versatile_mem_ctrl_tb/dut/inc_adr0/clk +add wave -noupdate -group {BURST ADDRESS} -divider Input +add wave -noupdate -group {BURST ADDRESS} -format Literal -radix unsigned /versatile_mem_ctrl_tb/dut/inc_adr0/adr_i +add wave -noupdate -group {BURST ADDRESS} -format Literal /versatile_mem_ctrl_tb/dut/inc_adr0/cti_i +add wave -noupdate -group {BURST ADDRESS} -format Literal /versatile_mem_ctrl_tb/dut/inc_adr0/bte_i +add wave -noupdate -group {BURST ADDRESS} -format Logic /versatile_mem_ctrl_tb/dut/inc_adr0/init +add wave -noupdate -group {BURST ADDRESS} -format Logic /versatile_mem_ctrl_tb/dut/inc_adr0/inc +add wave -noupdate -group {BURST ADDRESS} -divider Internal +add wave -noupdate -group {BURST ADDRESS} -format Logic /versatile_mem_ctrl_tb/dut/inc_adr0/init_i +add wave -noupdate -group {BURST ADDRESS} -format Literal /versatile_mem_ctrl_tb/dut/inc_adr0/bte +add wave -noupdate -group {BURST ADDRESS} -format Literal /versatile_mem_ctrl_tb/dut/inc_adr0/cnt +add wave -noupdate -group {BURST ADDRESS} -divider Output +add wave -noupdate -group {BURST ADDRESS} -format Literal /versatile_mem_ctrl_tb/dut/inc_adr0/adr_o +add wave -noupdate -group {BURST ADDRESS} -format Logic /versatile_mem_ctrl_tb/dut/inc_adr0/done +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -divider {Micron DDR2 SDRAM} +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Literal -radix ascii /versatile_mem_ctrl_tb/dut/ddr_16_0/statename +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Logic /versatile_mem_ctrl_tb/ddr2_sdram/ck +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Logic /versatile_mem_ctrl_tb/ddr2_sdram/ck_n +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Logic /versatile_mem_ctrl_tb/ddr2_sdram/cke +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Logic /versatile_mem_ctrl_tb/ddr2_sdram/cs_n +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Logic /versatile_mem_ctrl_tb/ddr2_sdram/ras_n +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Logic /versatile_mem_ctrl_tb/ddr2_sdram/cas_n +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Logic /versatile_mem_ctrl_tb/ddr2_sdram/we_n +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Literal /versatile_mem_ctrl_tb/ddr2_sdram/ba +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/ddr2_sdram/addr +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Logic /versatile_mem_ctrl_tb/ddr2_sdram/odt +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Literal /versatile_mem_ctrl_tb/ddr2_sdram/dm_rdqs +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/ddr2_sdram/dq +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Literal /versatile_mem_ctrl_tb/ddr2_sdram/dqs +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Literal /versatile_mem_ctrl_tb/ddr2_sdram/dqs_n +add wave -noupdate -group {DDR2 SDRAM SIMULATIOM MODEL} -format Literal /versatile_mem_ctrl_tb/ddr2_sdram/rdqs_n +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -divider {Rx FIFO 0} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/d +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Logic /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/write +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Literal /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/write_enable +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Logic /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/clk1 +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Logic /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/rst1 +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Logic /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/read +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Literal /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/read_enable +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Logic /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/clk2 +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Logic /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/rst2 +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Literal /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/fifo_full +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/q +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -group {Fifo Control} -format Literal /versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/fifo_empty +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[31]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[30]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[29]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[28]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[27]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[26]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[25]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[24]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[23]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[22]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[21]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[20]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[19]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[18]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[17]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 0} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[16]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[15]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[14]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[13]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[12]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[11]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[10]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[9]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[8]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[7]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[6]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[5]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[4]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[3]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[2]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[1]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -expand -group {Fifo 0 1} -format Literal -radix hexadecimal {/versatile_mem_ctrl_tb/dut/genblk1/wb0/ingress_FIFO/dpram/ram[0]} +add wave -noupdate -group {RX FIFO (Ingress FIFO)} -divider {Rx FIFO 1} +add wave -noupdate -group {BURST LENGTH} -format Logic /versatile_mem_ctrl_tb/dut/burst_length_counter0/rst +add wave -noupdate -group {BURST LENGTH} -format Logic /versatile_mem_ctrl_tb/dut/burst_length_counter0/clk +add wave -noupdate -group {BURST LENGTH} -format Logic /versatile_mem_ctrl_tb/dut/burst_length_counter0/cke +add wave -noupdate -group {BURST LENGTH} -format Literal /versatile_mem_ctrl_tb/dut/burst_length_counter0/length +add wave -noupdate -group {BURST LENGTH} -format Literal /versatile_mem_ctrl_tb/dut/burst_length_counter0/clear_value +add wave -noupdate -group {BURST LENGTH} -format Literal /versatile_mem_ctrl_tb/dut/burst_length_counter0/set_value +add wave -noupdate -group {BURST LENGTH} -format Literal /versatile_mem_ctrl_tb/dut/burst_length_counter0/wrap_value +add wave -noupdate -group {BURST LENGTH} -format Literal -radix unsigned /versatile_mem_ctrl_tb/dut/burst_length_counter0/qi +add wave -noupdate -group {BURST LENGTH} -format Literal -radix unsigned /versatile_mem_ctrl_tb/dut/burst_length_counter0/q_next +add wave -noupdate -group {BURST LENGTH} -format Logic /versatile_mem_ctrl_tb/dut/burst_length_counter0/zq +add wave -noupdate -group {DDR2 IF} -divider FSM +add wave -noupdate -group {DDR2 IF} -format Literal -radix ascii /versatile_mem_ctrl_tb/dut/ddr_16_0/statename +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/sdram_clk_270 +add wave -noupdate -group {DDR2 IF} -divider {Controller side} +add wave -noupdate -group {DDR2 IF} -divider {Clock & reset} +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/sdram_rst +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/sdram_clk +add wave -noupdate -group {DDR2 IF} -divider {Tx Data} +add wave -noupdate -group {DDR2 IF} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/versatile_mem_ctrl_ddr_0/tx_dat_i +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/versatile_mem_ctrl_ddr_0/dq_en +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/versatile_mem_ctrl_ddr_0/dqm_en +add wave -noupdate -group {DDR2 IF} -divider {Rx Data} +add wave -noupdate -group {DDR2 IF} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/versatile_mem_ctrl_ddr_0/rx_dat_o +add wave -noupdate -group {DDR2 IF} -divider {SDRAM side} +add wave -noupdate -group {DDR2 IF} -divider Address +add wave -noupdate -group {DDR2 IF} -format Literal /versatile_mem_ctrl_tb/dut/ba_pad_o +add wave -noupdate -group {DDR2 IF} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/addr_pad_o +add wave -noupdate -group {DDR2 IF} -divider {Data & mask} +add wave -noupdate -group {DDR2 IF} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/dq_pad_io +add wave -noupdate -group {DDR2 IF} -format Literal /versatile_mem_ctrl_tb/dut/dm_rdqs_pad_io +add wave -noupdate -group {DDR2 IF} -divider {Clock & strobe} +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/cke_pad_o +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/ck_pad_o +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/ck_n_pad_o +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/ck_fb_pad_o +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/ck_fb_pad_i +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/dqs_oe +add wave -noupdate -group {DDR2 IF} -format Literal /versatile_mem_ctrl_tb/dut/dqs_pad_io +add wave -noupdate -group {DDR2 IF} -format Literal /versatile_mem_ctrl_tb/dut/dqs_n_pad_io +add wave -noupdate -group {DDR2 IF} -format Literal /versatile_mem_ctrl_tb/dut/rdqs_n_pad_i +add wave -noupdate -group {DDR2 IF} -divider Command +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/cs_n_pad_o +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/ras_pad_o +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/cas_pad_o +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/we_pad_o +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/odt_pad_o +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/versatile_mem_ctrl_ddr_0/dq_en +add wave -noupdate -group {DDR2 IF} -format Logic /versatile_mem_ctrl_tb/dut/versatile_mem_ctrl_ddr_0/dqm_en +add wave -noupdate -group {DDR2 IF} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/versatile_mem_ctrl_ddr_0/tx_dat_i +add wave -noupdate -group {OPEN BANKS & ROWS} -divider State +add wave -noupdate -group {OPEN BANKS & ROWS} -format Literal -radix ascii /versatile_mem_ctrl_tb/dut/ddr_16_0/statename +add wave -noupdate -group {OPEN BANKS & ROWS} -divider {Open bank & row} +add wave -noupdate -group {OPEN BANKS & ROWS} -format Literal /versatile_mem_ctrl_tb/dut/open_bank_i +add wave -noupdate -group {OPEN BANKS & ROWS} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/open_row_i +add wave -noupdate -group {OPEN BANKS & ROWS} -format Logic /versatile_mem_ctrl_tb/dut/open_cur_row +add wave -noupdate -group {OPEN BANKS & ROWS} -format Logic /versatile_mem_ctrl_tb/dut/close_cur_row +add wave -noupdate -group {OPEN BANKS & ROWS} -format Literal /versatile_mem_ctrl_tb/dut/open_row +add wave -noupdate -group {OPEN BANKS & ROWS} -format Literal /versatile_mem_ctrl_tb/dut/next_row +add wave -noupdate -group {OPEN BANKS & ROWS} -format Literal /versatile_mem_ctrl_tb/dut/next_row +add wave -noupdate -group {OPEN BANKS & ROWS} -format Literal /versatile_mem_ctrl_tb/dut/next_bank +add wave -noupdate -group {OPEN BANKS & ROWS} -format Logic /versatile_mem_ctrl_tb/dut/next_row_open +add wave -noupdate -group {FIFO Pointers & Flags} -divider FIFO_0_1 +add wave -noupdate -group {FIFO Pointers & Flags} -divider FIFO_0_0 +add wave -noupdate -group {FIFO Pointers & Flags} -format Literal -radix unsigned {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/fifo_adr[0]/egresscmp/wptr_bin} +add wave -noupdate -group {FIFO Pointers & Flags} -format Literal -radix unsigned {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/fifo_adr[0]/egresscmp/rptr_bin} +add wave -noupdate -group {FIFO Pointers & Flags} -format Literal -radix unsigned {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/fifo_adr[0]/egresscmp/ptr_diff} +add wave -noupdate -group {FIFO Pointers & Flags} -format Logic {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/fifo_adr[0]/egresscmp/fifo_empty} +add wave -noupdate -group {FIFO Pointers & Flags} -format Logic {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/fifo_adr[0]/egresscmp/fifo_full} +add wave -noupdate -group {FIFO Pointers & Flags} -format Logic {/versatile_mem_ctrl_tb/dut/genblk1/wb0/egress_FIFO/fifo_adr[0]/egresscmp/fifo_flag} +add wave -noupdate -group {FIFO Pointers & Flags} -divider FIFO_1_1 +add wave -noupdate -group {FIFO Pointers & Flags} -divider FIFO_1_0 +add wave -noupdate -group {FIFO Pointers & Flags} -format Literal -radix unsigned {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/fifo_adr[0]/egresscmp/wptr_bin} +add wave -noupdate -group {FIFO Pointers & Flags} -format Literal -radix unsigned {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/fifo_adr[0]/egresscmp/rptr_bin} +add wave -noupdate -group {FIFO Pointers & Flags} -format Literal -radix unsigned {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/fifo_adr[0]/egresscmp/ptr_diff} +add wave -noupdate -group {FIFO Pointers & Flags} -format Logic {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/fifo_adr[0]/egresscmp/fifo_empty} +add wave -noupdate -group {FIFO Pointers & Flags} -format Logic {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/fifo_adr[0]/egresscmp/fifo_full} +add wave -noupdate -group {FIFO Pointers & Flags} -format Logic {/versatile_mem_ctrl_tb/dut/genblk3/wb1/egress_FIFO/fifo_adr[0]/egresscmp/fifo_flag} +add wave -noupdate -group {FIFO Pointers & Flags} -divider {FIFO Flags on top-level} +add wave -noupdate -group {FIFO Pointers & Flags} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/fifo_empty +add wave -noupdate -group {FIFO Pointers & Flags} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/fifo_flag +add wave -noupdate -group {FIFO Pointers & Flags} -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/versatile_mem_ctrl_ddr_0/dq_rx +add wave -noupdate -divider tmp +add wave -noupdate -format Logic /versatile_mem_ctrl_tb/dut/ck_pad_o +add wave -noupdate -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/dq_pad_io +add wave -noupdate -format Logic /versatile_mem_ctrl_tb/dut/sdram_clk_270 +add wave -noupdate -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/versatile_mem_ctrl_ddr_0/dq_rx +add wave -noupdate -format Logic /versatile_mem_ctrl_tb/dut/sdram_clk_180 +add wave -noupdate -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/versatile_mem_ctrl_ddr_0/dq_rx_reg +add wave -noupdate -format Literal -radix hexadecimal /versatile_mem_ctrl_tb/dut/fifo_dat_i +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {222981669 ps} 0} +configure wave -namecolwidth 441 +configure wave -valuecolwidth 151 +configure wave -justifyvalue left +configure wave -signalnamewidth 0 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ns +update +WaveRestoreZoom {0 ps} {346500 ns} Index: versatile_mem_ctrl/tags/Rev2/sim/rtl_sim/bin/sim_altera.tcl =================================================================== --- versatile_mem_ctrl/tags/Rev2/sim/rtl_sim/bin/sim_altera.tcl (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/sim/rtl_sim/bin/sim_altera.tcl (revision 109) @@ -0,0 +1,67 @@ +# Usage: +# cd /versatile_mem_ctrl/trunk/sim/rtl_sim/run/ +# vsim -gui -do ../bin/sim_altera.tcl + +set DESIGN_NAME "versatile_memory_controller" +set WAVE_FILE ../bin/wave_ddr.do +set FORCE_LIBRARY_RECOMPILE 0 + +# Quit simulation if you are running one +quit -sim + +# Create and open project +if {[file exists ${DESIGN_NAME}_sim_altera.mpf]} { +project open ${DESIGN_NAME}_sim_altera +} else { +project new . ${DESIGN_NAME}_sim_altera +} + +# Compile Altera libraries +if {![file exists altera_primitives] || $FORCE_LIBRARY_RECOMPILE} { +vlib altera_primitives +vmap altera_primitives altera_primitives +#vlog -work altera_primitives /opt/altera9.1/quartus/eda/sim_lib/altera_primitives.v +vcom -work altera_primitives /opt/altera9.1/quartus/eda/sim_lib/altera_primitives_components.vhd +vcom -work altera_primitives /opt/altera9.1/quartus/eda/sim_lib/altera_primitives.vhd +} +if {![file exists altera_mf] || $FORCE_LIBRARY_RECOMPILE} { +vlib altera_mf +vmap altera_mf altera_mf +#vlog -work altera_mf /opt/altera9.1/quartus/eda/sim_lib/altera_mf.v +vcom -work altera_mf /opt/altera9.1/quartus/eda/sim_lib/altera_mf_components.vhd +vcom -work altera_mf /opt/altera9.1/quartus/eda/sim_lib/altera_mf.vhd +} +if {![file exists lpm] || $FORCE_LIBRARY_RECOMPILE} { +vlib lpm +vmap lpm lpm +vlog -work lpm /opt/altera9.1/quartus/eda/sim_lib/220model.v +} + +# Compile project source code +vlog ../../../rtl/verilog/versatile_mem_ctrl_ip.v +incdir+../../../rtl/verilog/ + +# Compile test bench source code +vlog ../../../bench/ddr/ddr2.v +incdir+../../../bench/ddr/ +vlog ../../../bench/wb0_ddr.v ../../../bench/wb1_ddr.v ../../../bench/wb4_ddr.v +define+x16 ../../../bench/tb_top.v +incdir+../../../bench/ + +# Quit without asking +set PrefMain(forceQuit) 1 + +# Invoke the simulator +# -gui Open the GUI without loading a design +# -novopt Force incremental mode (pre-6.0 behavior) +# -L Search library for design units instantiated from Verilog and for VHDL default component binding +vsim -gui -novopt -L altera_mf -L lpm work.versatile_mem_ctrl_tb + +# Open waveform viewer +view wave -title "${DESIGN_NAME}" + +# Open signal viewer +view signals + +# Run the .do file to load signals to the waveform viewer +do $WAVE_FILE + +# Run the simulation +run 330 us + Index: versatile_mem_ctrl/tags/Rev2/sim/rtl_sim/bin/sim_xilinx.tcl =================================================================== --- versatile_mem_ctrl/tags/Rev2/sim/rtl_sim/bin/sim_xilinx.tcl (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/sim/rtl_sim/bin/sim_xilinx.tcl (revision 109) @@ -0,0 +1,66 @@ +# Usage: +# cd /versatile_mem_ctrl/trunk/sim/rtl_sim/run/ +# vsim -gui -do ../bin/sim_xilinx.tcl + +set DESIGN_NAME "versatile_memory_controller" +set WAVE_FILE wave_ddr.do +set FORCE_LIBRARY_RECOMPILE 0 + +# Quit simulation if you are running one +quit -sim + +# Create and open project +if {[file exists ${DESIGN_NAME}_sim_xilinx.mpf]} { +project open ${DESIGN_NAME}_sim_xilinx +} else { +project new . ${DESIGN_NAME}_sim_xilinx +} + +# Compile Xilinx libraries +if {![file exists unisims_ver] || $FORCE_LIBRARY_RECOMPILE} { +vlib unisims_ver +vmap unisims_ver unisims_ver +vlog -work unisims_ver /opt/Xilinx/11.1/ISE/verilog/src/unisims/*.v +} +if {![file exists simprims_ver] || $FORCE_LIBRARY_RECOMPILE} { +vlib simprims_ver +vmap simprims_ver simprims_ver +vlog -work simprims_ver /opt/Xilinx/11.1/ISE/verilog/src/simprims/*.v +} +if {![file exists xilinxcorelib_ver] || $FORCE_LIBRARY_RECOMPILE} { +vlib xilinxcorelib_ver +vmap xilinxcorelib_ver xilinxcorelib_ver +vlog -work xilinxcorelib_ver /opt/Xilinx/11.1/ISE/verilog/src/XilinxCoreLib/*.v +} + +# Compile the glbl.v module +vlog /opt/Xilinx/11.1/ISE/verilog/src/glbl.v + +# Compile project source code +vlog ../../../rtl/verilog/versatile_mem_ctrl_ip.v +incdir+../../../rtl/verilog/ + +# Compile test bench source code +vlog ../../../bench/ddr/ddr2.v +incdir+../../../bench/ddr/ +vlog ../../../bench/wb0_ddr.v ../../../bench/wb1_ddr.v ../../../bench/wb4_ddr.v +define+x16 ../../../bench/tb_top.v +incdir+../../../bench/ + +# Quit without asking +set PrefMain(forceQuit) 1 + +# Invoke the simulator +# -gui Open the GUI without loading a design +# -novopt Force incremental mode (pre-6.0 behavior) +# -L Search library for design units instantiated from Verilog and for VHDL default component binding +vsim -gui -novopt -L unisims_ver -L xilinxcorelib_ver work.versatile_mem_ctrl_tb work.glbl + +# Open waveform viewer +view wave -title "${DESIGN_NAME}" + +# Open signal viewer +view signals + +# Run the .do file to load signals to the waveform viewer +do $WAVE_FILE + +# Run the simulation +run 330 us + Index: versatile_mem_ctrl/tags/Rev2/syn/altera/bin/versatile_memory_controller.sdc =================================================================== --- versatile_mem_ctrl/tags/Rev2/syn/altera/bin/versatile_memory_controller.sdc (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/syn/altera/bin/versatile_memory_controller.sdc (revision 109) @@ -0,0 +1,248 @@ +#************************************************************** +# Timimg Information for DDR2 SDRAM +#************************************************************** +# Timing specifications from Micron Data Sheet (DDR2 SDRAM MT47H32M16-5E) + +# Clock cycle time: min=5.00ns, max=8.00ns +set tCK 8.000 + +# Data Strobe Out +# DQS output access time from CK/CK# +set tDQSCKmin -0.500 +set tDQSCKmax 0.500 + +# Data Strobe In +# DQS rising edge to CK rising edge +set tDQSSmin [expr -0.25 * $tCK] +set tDQSSmax [expr 0.25 * $tCK] +# DQS falling to CK rising: setup time +set tDSSmin [expr 0.2 * $tCK] +# DQS falling from CK rising: hold time +set tDSHmin [expr 0.2 * $tCK] + +# Data Out +# DQ output access time from CK/CK# +set tACmin -0.600 +set tACmax 0.600 + +# Data In +# DQ and DM input setup time to DQS +set tDSb 0.150 +# DQ and DM input hold time to DQS +set tDHb 0.275 +# DQ and DM input setup time to DQS +set tDSa 0.400 +# DQ and DM input hold time to DQS +set tDHa 0.400 + +# Command and Address +# Input setup time +set tISb 0.350 +set tISa 0.600 +# Input hold time +set tIHb 0.470 +set tIHa 0.600 + + +#************************************************************** +# Timimg Information +#************************************************************** + +# Trace delay for data +set tTDDmin 0.100 +set tTDDmax 0.200 + +# Trace delay for clock +set tTDCmin 0.100 +set tTDCmax 0.200 + + +#************************************************************** +# Create Clock +#************************************************************** + +# Clock frequency +set wb_clk_period 20.000 +set sdram_clk_period $tCK + +# Clocks +create_clock -name {wb_clk[*]} -period $wb_clk_period [get_ports {wb_clk[*]}] +create_clock -name {sdram_clk} -period $sdram_clk_period [get_ports {sdram_clk}] + +# Virtual clocks +#create_clock -name {v_wb_clk_in} -period $wb_clk_period +#create_clock -name {v_wb_clk_out} -period $wb_clk_period +#create_clock -name {v_sdram_clk_in} -period $sdram_clk_period +#create_clock -name {v_sdram_clk_out} -period $sdram_clk_period + + +#************************************************************** +# Create Generated Clock +#************************************************************** + +create_generated_clock -name sdram_clk_0 -phase 0 -source [get_ports {sdram_clk}] [get_pins {dcm_pll_0|altpll_internal|auto_generated|pll1|clk[0]}] +create_generated_clock -name sdram_clk_180 -phase 180 -source [get_ports {sdram_clk}] [get_pins {dcm_pll_0|altpll_internal|auto_generated|pll1|clk[2]}] +create_generated_clock -name sdram_clk_270 -phase 270 -source [get_ports {sdram_clk}] [get_pins {dcm_pll_0|altpll_internal|auto_generated|pll1|clk[3]}] +create_generated_clock -name ck_pad_o -phase 0 -source [get_pins {versatile_mem_ctrl_ddr_0|ddr_ff_out_ck|altddio_out_inst|auto_generated|ddio_outa[0]|clkhi}] [get_ports {ck_pad_o}] + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +derive_clock_uncertainty + + +#************************************************************** +# Set Input Delay +#************************************************************** +# Double Data Rate requires constraints for both rising and falling clock edge +# Input max delay value = max trace delay for data + tCO of external device – min trace delay for clock +# Input min delay value = min trace delay for data + tCOmin of external device – max trace delay for clock +# Assume (for now): max trace delay for data = min trace delay for clock +# min trace delay for data = max trace delay for clock +# Data +set_input_delay -clock {ck_pad_o} -max $tACmax [get_ports {dq_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -max $tACmax -clock_fall [get_ports {dq_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -min $tACmin [get_ports {dq_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -min $tACmin -clock_fall [get_ports {dq_pad_io[*]}] -add_delay +# Data Strobe +set_input_delay -clock {ck_pad_o} -max $tDQSCKmax [get_ports {dqs_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -max $tDQSCKmax -clock_fall [get_ports {dqs_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -min $tDQSCKmin [get_ports {dqs_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -min $tDQSCKmin -clock_fall [get_ports {dqs_pad_io[*]}] -add_delay +# Data Strobe +set_input_delay -clock {ck_pad_o} -max $tDQSCKmax [get_ports {dqs_n_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -max $tDQSCKmax -clock_fall [get_ports {dqs_n_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -min $tDQSCKmin [get_ports {dqs_n_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -min $tDQSCKmin -clock_fall [get_ports {dqs_n_pad_io[*]}] -add_delay +# Data Mask +set_input_delay -clock {ck_pad_o} -max $tDQSCKmax [get_ports {dm_rdqs_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -max $tDQSCKmax -clock_fall [get_ports {dm_rdqs_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -min $tDQSCKmin [get_ports {dm_rdqs_pad_io[*]}] -add_delay +set_input_delay -clock {ck_pad_o} -min $tDQSCKmin -clock_fall [get_ports {dm_rdqs_pad_io[*]}] -add_delay + +# Single Data Rate requires constraints for rising clock edge only + + +#************************************************************** +# Set Output Delay +#************************************************************** +# Double Data Rate requires constraints for both rising and falling clock edge +# Output max delay = max trace delay for data + tSU of external register – min trace delay for clock +# Output min delay = min trace delay for data – tH of external register – max trace delay for clock +# Assume (for now): max trace delay for data = min trace delay for clock +# min trace delay for data = max trace delay for clock +# Data +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {dq_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -max $tISa -clock_fall [get_ports {dq_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {dq_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa -clock_fall [get_ports {dq_pad_io[*]}] -add_delay +# Data Strobe +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {dqs_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -max $tISa -clock_fall [get_ports {dqs_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {dqs_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa -clock_fall [get_ports {dqs_pad_io[*]}] -add_delay +# Data Strobe +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {dqs_n_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -max $tISa -clock_fall [get_ports {dqs_n_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {dqs_n_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa -clock_fall [get_ports {dqs_n_pad_io[*]}] -add_delay +# Data Mask +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {dm_rdqs_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -max $tISa -clock_fall [get_ports {dm_rdqs_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {dm_rdqs_pad_io[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa -clock_fall [get_ports {dm_rdqs_pad_io[*]}] -add_delay + +# Single Data Rate requires constraints for rising clock edge only +# Chip Select +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {cs_n_pad_o}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {cs_n_pad_o}] -add_delay +# Row Address Strobe +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {ras_pad_o}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {ras_pad_o}] -add_delay +# Column Address Strobe +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {cas_pad_o}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {cas_pad_o}] -add_delay +# Write Enable +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {we_pad_o}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {we_pad_o}] -add_delay +# Bank Address +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {ba_pad_o[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {ba_pad_o[*]}] -add_delay +# Address +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {addr_pad_o[*]}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {addr_pad_o[*]}] -add_delay +# Clock Enable +set_output_delay -clock {ck_pad_o} -max $tISa [get_ports {cke_pad_o}] -add_delay +set_output_delay -clock {ck_pad_o} -min -$tIHa [get_ports {cke_pad_o}] -add_delay + + +#************************************************************** +# Set Clock Groups +#************************************************************** + + + +#************************************************************** +# Set False Path +#************************************************************** + +# Reset +set_false_path -from [get_ports {wb_rst[*]}] + +# Input Timing Exceptions +# False path exceptions for opposite-edge transfer +# Data +set_false_path -setup -fall_from [get_clocks ck_pad_o] -fall_to [get_clocks sdram_clk_270] +set_false_path -setup -rise_from [get_clocks ck_pad_o] -rise_to [get_clocks sdram_clk_270] +set_false_path -hold -rise_from [get_clocks ck_pad_o] -rise_to [get_clocks sdram_clk_270] +set_false_path -hold -fall_from [get_clocks ck_pad_o] -fall_to [get_clocks sdram_clk_270] +# Data Strobe +#set_false_path -setup -fall_from [get_clocks ck_pad_o] -fall_to [get_clocks sdram_clk_0] +#set_false_path -setup -rise_from [get_clocks ck_pad_o] -rise_to [get_clocks sdram_clk_0] +#set_false_path -hold -rise_from [get_clocks ck_pad_o] -rise_to [get_clocks sdram_clk_0] +#set_false_path -hold -fall_from [get_clocks ck_pad_o] -fall_to [get_clocks sdram_clk_0] + +# Output Timing Exceptions +# False path exceptions for opposite-edge transfer +# Data +set_false_path -setup -rise_from [get_clocks sdram_clk_270] -fall_to [get_clocks ck_pad_o] +set_false_path -setup -fall_from [get_clocks sdram_clk_270] -rise_to [get_clocks ck_pad_o] +set_false_path -hold -rise_from [get_clocks sdram_clk_270] -rise_to [get_clocks ck_pad_o] +set_false_path -hold -fall_from [get_clocks sdram_clk_270] -fall_to [get_clocks ck_pad_o] +# Data Strobe +set_false_path -setup -rise_from [get_clocks sdram_clk_0] -fall_to [get_clocks ck_pad_o] +set_false_path -setup -fall_from [get_clocks sdram_clk_0] -rise_to [get_clocks ck_pad_o] +set_false_path -hold -rise_from [get_clocks sdram_clk_0] -rise_to [get_clocks ck_pad_o] +set_false_path -hold -fall_from [get_clocks sdram_clk_0] -fall_to [get_clocks ck_pad_o] + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + + + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + + Index: versatile_mem_ctrl/tags/Rev2/syn/altera/bin/versatile_memory_controller.tcl =================================================================== --- versatile_mem_ctrl/tags/Rev2/syn/altera/bin/versatile_memory_controller.tcl (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/syn/altera/bin/versatile_memory_controller.tcl (revision 109) @@ -0,0 +1,67 @@ +# Usage: +# cd /versatile_mem_ctrl/trunk/syn/altera/run/ +# quartus_sh -t ../bin/versatile_memory_controller.tcl + +# Load Quartus II Tcl Project package +package require ::quartus::project + +# Add the next line to get the execute_flow command +package require ::quartus::flow + +set need_to_close_project 0 +set make_assignments 1 + +# Check that the right project is open +if {[is_project_open]} { + if {[string compare $quartus(project) "versatile_memory_controller"]} { + puts "Project versatile_memory_controller is not open" + set make_assignments 0 + } +} else { + # Only open if not already open + if {[project_exists versatile_memory_controller]} { + project_open -revision versatile_mem_ctrl_top versatile_memory_controller + } else { + project_new -revision versatile_mem_ctrl_top versatile_memory_controller + } + set need_to_close_project 1 +} + +# Make assignments +if {$make_assignments} { + set_global_assignment -name FAMILY "Stratix III" + set_global_assignment -name DEVICE AUTO + set_global_assignment -name ORIGINAL_QUARTUS_VERSION "9.0 SP2" + set_global_assignment -name PROJECT_CREATION_TIME_DATE "09:18:52 DECEMBER 14, 2009" + set_global_assignment -name LAST_QUARTUS_VERSION "9.0 SP2" + set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS OFF -section_id eda_blast_fpga + set_global_assignment -name SEARCH_PATH core_prbs/rtl/ + set_global_assignment -name SEARCH_PATH core_prbs/ + set_global_assignment -name SEARCH_PATH NPU1C_XCVR_reconfig/ + set_global_assignment -name SEARCH_PATH Bacchus_PTP_ALTLVDS_DYN_LINERATE_MULTICHANNEL/ + set_global_assignment -name SEARCH_PATH Bacchus_PTP_ALTLVDS_DYN_LINERATE_MULTICHANNEL/rate_match_fifo/ + set_global_assignment -name SEARCH_PATH Bacchus_PTP_ALTLVDS_DYN_LINERATE_MULTICHANNEL/tx_phase_comp_fifo/ + set_global_assignment -name SEARCH_PATH altera/90/ip/altera/sopc_builder_ip/altera_avalon_clock_adapter/ + set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top + set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top + set_global_assignment -name LL_ROOT_REGION ON -section_id "Root Region" + set_global_assignment -name LL_MEMBER_STATE LOCKED -section_id "Root Region" + set_global_assignment -name MISC_FILE /home/mikael/opencores/versatile_mem_ctrl/trunk/syn/altera/run/versatile_mem_ctrl_top.dpf + set_global_assignment -name SDC_FILE ../bin/versatile_memory_controller.sdc + set_global_assignment -name VERILOG_FILE ../../../rtl/verilog/versatile_mem_ctrl_ip.v + set_global_assignment -name EDA_USER_COMPILED_SIMULATION_LIBRARY_DIRECTORY /home/mikael/opencores/versatile_mem_ctrl/trunk/syn/altera/run -section_id eda_simulation + set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim (Verilog)" + set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top + + # Commit assignments + export_assignments + + # Compile + execute_flow -compile + + + # Close project + if {$need_to_close_project} { + project_close + } +} Index: versatile_mem_ctrl/tags/Rev2/syn/xilinx/bin/versatile_memory_controller.ucf =================================================================== --- versatile_mem_ctrl/tags/Rev2/syn/xilinx/bin/versatile_memory_controller.ucf (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/syn/xilinx/bin/versatile_memory_controller.ucf (revision 109) @@ -0,0 +1,122 @@ +#************************************************************** +# System Level Constraints +#************************************************************** +NET sdram_clk LOC = "F13" | IOSTANDARD = LVCMOS33; +NET wb_clk LOC = "K14" | IOSTANDARD = LVCMOS33; +NET wb_rst LOC = "Y16" | IOSTANDARD = LVTTL; +NET wb_rst TIG; + +#************************************************************** +# Timing Constraints +#************************************************************** + +#************************************************************** +# Clocks +#************************************************************** +NET "sdram_clk" TNM_NET = sdram_clk; +TIMESPEC TS_sdram_clk = PERIOD "sdram_clk" 8 ns HIGH 50%; # 125 MHz +NET "wb_clk" TNM_NET = wb_clk; +TIMESPEC TS_wb_clk = PERIOD "wb_clk" 40 ns HIGH 50%; # 25 MHz + +# External feedback to DCM +NET "ck_fb_pad_i" FEEDBACK = 2 ns NET "ck_fb_pad_o"; + +# +NET "wb_clk" CLOCK_DEDICATED_ROUTE = FALSE; +NET "sdram_clk" CLOCK_DEDICATED_ROUTE = FALSE; +PIN "dcm_pll_0/DCM_external/DCM_SP.CLKIN" CLOCK_DEDICATED_ROUTE = FALSE; + +#************************************************************** +# DDR2 IF +#************************************************************** +# Data +#NET dq_pad_io<31> LOC="U9" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<30> LOC="V8" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<29> LOC="AB1" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<28> LOC="AC1" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<27> LOC="Y5" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<26> LOC="Y6" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<25> LOC="U7" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<24> LOC="U8" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<23> LOC="AA2" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<22> LOC="AA3" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<21> LOC="Y1" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<20> LOC="Y2" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<19> LOC="T7" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<18> LOC="U6" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<17> LOC="U5" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dq_pad_io<16> LOC="V5" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +NET dq_pad_io<15> LOC="R8" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<14> LOC="R7" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<13> LOC="U1" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<12> LOC="U2" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<11> LOC="P8" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<10> LOC="P9" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<9> LOC="R5" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<8> LOC="R6" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<7> LOC="P7" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<6> LOC="P6" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<5> LOC="T3" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<4> LOC="T4" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<3> LOC="N9" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<2> LOC="P10" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<1> LOC="P4" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dq_pad_io<0> LOC="P3" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +# Address +NET addr_pad_o<0> LOC="M4" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<1> LOC="M3" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<2> LOC="M8" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<3> LOC="M7" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<4> LOC="L4" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<5> LOC="L3" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<6> LOC="K3" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<7> LOC="K2" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<8> LOC="K5" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<9> LOC="K4" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<10> LOC="M10" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<11> LOC="M9" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET addr_pad_o<12> LOC="J5" |IOSTANDARD = SSTL18_I |IOB = TRUE; +# Bank address +NET ba_pad_o<0> LOC="J4" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET ba_pad_o<1> LOC="K6" |IOSTANDARD = SSTL18_I |IOB = TRUE; +# Control +NET cas_pad_o LOC="L10" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET cke_pad_o LOC="L7" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET cs_n_pad_o LOC="H2" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET ras_pad_o LOC="H1" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET we_pad_o LOC="L9" |IOSTANDARD = SSTL18_I |IOB = TRUE; +# Data mask +NET dm_rdqs_pad_io<0> LOC="M6" |IOSTANDARD = SSTL18_II |IOB = TRUE; +NET dm_rdqs_pad_io<1> LOC="R2" |IOSTANDARD = SSTL18_II |IOB = TRUE; +#NET dm_rdqs_pad_io<2> LOC="V1" | IOSTANDARD = SSTL18_II | IOB = TRUE; +#NET dm_rdqs_pad_io<3> LOC="V2" | IOSTANDARD = SSTL18_II | IOB = TRUE; +# Strobe +NET dqs_pad_io<0> LOC="R3" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +NET dqs_pad_io<1> LOC="T5" |IOSTANDARD = SSTL18_II |IOB = TRUE |FAST; +#NET dqs_pad_io<2> LOC="W3" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +#NET dqs_pad_io<3> LOC="V7" | IOSTANDARD = SSTL18_II | IOB = TRUE | FAST; +# Clocks +NET ck_pad_o LOC="N5" |IOSTANDARD = SSTL18_I |IOB = TRUE; +NET ck_n_pad_o LOC="N4" |IOSTANDARD = SSTL18_I |IOB = TRUE; +#NET ck_pad_o<1> LOC="N1" | IOSTANDARD = SSTL18_I | IOB = TRUE; +#NET ck_n_pad_o<1> LOC="N2" | IOSTANDARD = SSTL18_I | IOB = TRUE; +NET ck_fb_pad_o LOC="M2" |IOSTANDARD = LVCMOS18 |IOB = TRUE; +NET ck_fb_pad_i LOC="N7" |IOSTANDARD = LVCMOS18 |IOB = TRUE; +# +INST "dq_pad_io<0>" TNM = TNM_dq_in; +INST "dq_pad_io<1>" TNM = TNM_dq_in; +INST "dq_pad_io<2>" TNM = TNM_dq_in; +INST "dq_pad_io<3>" TNM = TNM_dq_in; +INST "dq_pad_io<4>" TNM = TNM_dq_in; +INST "dq_pad_io<5>" TNM = TNM_dq_in; +INST "dq_pad_io<6>" TNM = TNM_dq_in; +INST "dq_pad_io<7>" TNM = TNM_dq_in; +INST "dq_pad_io<8>" TNM = TNM_dq_in; +INST "dq_pad_io<9>" TNM = TNM_dq_in; +INST "dq_pad_io<10>" TNM = TNM_dq_in; +INST "dq_pad_io<11>" TNM = TNM_dq_in; +INST "dq_pad_io<12>" TNM = TNM_dq_in; +INST "dq_pad_io<13>" TNM = TNM_dq_in; +INST "dq_pad_io<14>" TNM = TNM_dq_in; +INST "dq_pad_io<15>" TNM = TNM_dq_in; + Index: versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36_work.ixf =================================================================== --- versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36_work.ixf (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36_work.ixf (revision 109) @@ -0,0 +1 @@ +TwoPortRAM_256x36WENinfalsefalsetrueRENinfalsefalsetrueWCLKinfalsefalsetrueRCLKinfalsefalsetrueWDin350falsefalsetrueRDout350falsefalsetrueWADDRin70falsefalsetrueRADDRin70falsefalsetrue \ No newline at end of file Index: versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.v =================================================================== --- versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.v (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.v (revision 109) @@ -0,0 +1,55 @@ +`timescale 1 ns/100 ps +// Version: 8.5 SP2 8.5.2.4 + + +module TwoPortRAM_256x36(WD,RD,WEN,REN,WADDR,RADDR,WCLK,RCLK); +input [35:0] WD; +output [35:0] RD; +input WEN, REN; +input [7:0] WADDR, RADDR; +input WCLK, RCLK; + + wire WEAP, WEBP, VCC, GND; + + VCC VCC_1_net(.Y(VCC)); + GND GND_1_net(.Y(GND)); + RAM512X18 TwoPortRAM_256x36_R0C1(.RADDR8(GND), .RADDR7( + RADDR[7]), .RADDR6(RADDR[6]), .RADDR5(RADDR[5]), .RADDR4( + RADDR[4]), .RADDR3(RADDR[3]), .RADDR2(RADDR[2]), .RADDR1( + RADDR[1]), .RADDR0(RADDR[0]), .WADDR8(GND), .WADDR7( + WADDR[7]), .WADDR6(WADDR[6]), .WADDR5(WADDR[5]), .WADDR4( + WADDR[4]), .WADDR3(WADDR[3]), .WADDR2(WADDR[2]), .WADDR1( + WADDR[1]), .WADDR0(WADDR[0]), .WD17(WD[35]), .WD16(WD[34]) + , .WD15(WD[33]), .WD14(WD[32]), .WD13(WD[31]), .WD12( + WD[30]), .WD11(WD[29]), .WD10(WD[28]), .WD9(WD[27]), .WD8( + WD[26]), .WD7(WD[25]), .WD6(WD[24]), .WD5(WD[23]), .WD4( + WD[22]), .WD3(WD[21]), .WD2(WD[20]), .WD1(WD[19]), .WD0( + WD[18]), .RW0(GND), .RW1(VCC), .WW0(GND), .WW1(VCC), + .PIPE(GND), .REN(WEBP), .WEN(WEAP), .RCLK(RCLK), .WCLK( + WCLK), .RESET(VCC), .RD17(RD[35]), .RD16(RD[34]), .RD15( + RD[33]), .RD14(RD[32]), .RD13(RD[31]), .RD12(RD[30]), + .RD11(RD[29]), .RD10(RD[28]), .RD9(RD[27]), .RD8(RD[26]), + .RD7(RD[25]), .RD6(RD[24]), .RD5(RD[23]), .RD4(RD[22]), + .RD3(RD[21]), .RD2(RD[20]), .RD1(RD[19]), .RD0(RD[18])); + RAM512X18 TwoPortRAM_256x36_R0C0(.RADDR8(GND), .RADDR7( + RADDR[7]), .RADDR6(RADDR[6]), .RADDR5(RADDR[5]), .RADDR4( + RADDR[4]), .RADDR3(RADDR[3]), .RADDR2(RADDR[2]), .RADDR1( + RADDR[1]), .RADDR0(RADDR[0]), .WADDR8(GND), .WADDR7( + WADDR[7]), .WADDR6(WADDR[6]), .WADDR5(WADDR[5]), .WADDR4( + WADDR[4]), .WADDR3(WADDR[3]), .WADDR2(WADDR[2]), .WADDR1( + WADDR[1]), .WADDR0(WADDR[0]), .WD17(WD[17]), .WD16(WD[16]) + , .WD15(WD[15]), .WD14(WD[14]), .WD13(WD[13]), .WD12( + WD[12]), .WD11(WD[11]), .WD10(WD[10]), .WD9(WD[9]), .WD8( + WD[8]), .WD7(WD[7]), .WD6(WD[6]), .WD5(WD[5]), .WD4(WD[4]) + , .WD3(WD[3]), .WD2(WD[2]), .WD1(WD[1]), .WD0(WD[0]), + .RW0(GND), .RW1(VCC), .WW0(GND), .WW1(VCC), .PIPE(GND), + .REN(WEBP), .WEN(WEAP), .RCLK(RCLK), .WCLK(WCLK), .RESET( + VCC), .RD17(RD[17]), .RD16(RD[16]), .RD15(RD[15]), .RD14( + RD[14]), .RD13(RD[13]), .RD12(RD[12]), .RD11(RD[11]), + .RD10(RD[10]), .RD9(RD[9]), .RD8(RD[8]), .RD7(RD[7]), + .RD6(RD[6]), .RD5(RD[5]), .RD4(RD[4]), .RD3(RD[3]), .RD2( + RD[2]), .RD1(RD[1]), .RD0(RD[0])); + INV WEBUBBLEB(.A(REN), .Y(WEBP)); + INV WEBUBBLEA(.A(WEN), .Y(WEAP)); + +endmodule Index: versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.gen =================================================================== --- versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.gen (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.gen (revision 109) @@ -0,0 +1,41 @@ +Version:8.5.2.4 +ACTGENU_CALL:1 +BATCH:T +FAM:ProASIC3 +OUTFORMAT:Verilog +LPMTYPE:LPM_RAM +LPM_HINT:TWO +INSERT_PAD:NO +INSERT_IOREG:NO +GEN_BHV_VHDL_VAL:F +GEN_BHV_VERILOG_VAL:F +MGNTIMER:F +MGNCMPL:T +DESDIR:L:/work/ocsvn/versatile_mem_ctrl/syn/ACTEL/vmc/smartgen\TwoPortRAM_256x36 +GEN_BEHV_MODULE:T +SMARTGEN_DIE:IS8X8M2 +SMARTGEN_PACKAGE:pq208 +AGENIII_IS_SUBPROJECT_LIBERO:T +WWIDTH:36 +WDEPTH:256 +RWIDTH:36 +RDEPTH:256 +CLKS:2 +RESET_POLARITY:2 +INIT_RAM:F +DEFAULT_WORD:0x000000000 +CASCADE:0 +WCLK_EDGE:RISE +RCLK_EDGE:RISE +WCLOCK_PN:WCLK +RCLOCK_PN:RCLK +PMODE2:0 +DATA_IN_PN:WD +WADDRESS_PN:WADDR +WE_PN:WEN +DATA_OUT_PN:RD +RADDRESS_PN:RADDR +RE_PN:REN +WE_POLARITY:1 +RE_POLARITY:1 +PTYPE:1 Index: versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.cxf =================================================================== --- versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.cxf (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.cxf (revision 109) @@ -0,0 +1 @@ +TwoPortRAM_256x36TwoPortRAM_256x36.vverilogSourceTwoPortRAM_256x36.genGENTwoPortRAM_256x36.logLOGTwoPortRAM_256x36.shxOtherTwoPortRAM_256x36_R0C0.memMEMTwoPortRAM_256x36_R0C1.memMEMHDL_FILESETHDLOTHER_FILESETOTHERANY_SIMULATION_FILESETSIMULATIONRAMRAMTwo Port RAMActel2.2WDin350falsefalsetrueRDout350falsefalsetrueWENinfalsefalsetrueRENinfalsefalsetrueWADDRin70falsefalsetrueRADDRin70falsefalsetrueWCLKinfalsefalsetrueRCLKinfalsefalsetrue \ No newline at end of file Index: versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.log =================================================================== --- versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.log (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.log (revision 109) @@ -0,0 +1,87 @@ + ** Message System Log + ** Database: + ** Date: Thu Jun 25 17:18:45 2009 + + +**************** +Macro Parameters +**************** + +Name : TwoPortRAM_256x36 +Family : ProASIC3 +Output Format : VERILOG +Type : RAM +Write Enable : Active High +Read Enable : Active High +Reset : None +LP : None +FF : None +Read Clock : Rising +Write Clock : Rising +Write Depth : 256 +Write Width : 36 +Read Depth : 256 +Read Width : 36 +RAM Type : Two Port +Clocks : Independent Read and Write Clocks +Write Mode A : Hold Data +Write Mode B : Hold Data +Read Pipeline A : No +Read Pipeline B : No +Optimized for : Speed +Portname DataIn : WD +Portname DataOut : RD +Portname Write En : WEN +Portname Read En : REN +Portname WClock : WCLK +Portname RClock : RCLK +Portname WAddress : WADDR +Portname RAddress : RADDR +Portname Reset : +Portname Clock : +Portname DataAIn : +Portname DataBIn : +Portname DataAOut : +Portname DataBOut : +Portname AddressA : +Portname AddressB : +Portname CLKA : +Portname CLKB : +Portname RWA : +Portname RWB : +Portname BLKA : +Portname BLKB : +Portname LP : +Portname FF : +Initialize RAM : False + +Cascade Configuration: + Write Port configuration : 256x18 + Read Port configuration : 256x18 + Number of blocks depth wise: 1 + Number of blocks width wise: 2 + +************** +Compile Report +************** + + +Netlist Resource Report +======================= + + CORE Used: 2 Total: 24576 (0.01%) + IO (W/ clocks) Used: 0 Total: 154 (0.00%) + Differential IO Used: 0 Total: 35 (0.00%) + GLOBAL (Chip+Quadrant) Used: 0 Total: 18 (0.00%) + PLL Used: 0 Total: 1 (0.00%) + RAM/FIFO Used: 2 Total: 32 (6.25%) + Low Static ICC Used: 0 Total: 1 (0.00%) + FlashROM Used: 0 Total: 1 (0.00%) + User JTAG Used: 0 Total: 1 (0.00%) + +Wrote Verilog netlist to +L:/work/ocsvn/versatile_mem_ctrl/syn/ACTEL/vmc/smartgen\TwoPortRAM_256x36\Two\ +PortRAM_256x36.v. + + ** Log Ended: Thu Jun 25 17:18:46 2009 + Index: versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.shx =================================================================== --- versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.shx (nonexistent) +++ versatile_mem_ctrl/tags/Rev2/backend/ACTEL/TwoPortRAM_256x36/TwoPortRAM_256x36.shx (revision 109) @@ -0,0 +1,256 @@ +0:0000000000 +1:0000000000 +2:0000000000 +3:0000000000 +4:0000000000 +5:0000000000 +6:0000000000 +7:0000000000 +8:0000000000 +9:0000000000 +A:0000000000 +B:0000000000 +C:0000000000 +D:0000000000 +E:0000000000 +F:0000000000 +10:0000000000 +11:0000000000 +12:0000000000 +13:0000000000 +14:0000000000 +15:0000000000 +16:0000000000 +17:0000000000 +18:0000000000 +19:0000000000 +1A:0000000000 +1B:0000000000 +1C:0000000000 +1D:0000000000 +1E:0000000000 +1F:0000000000 +20:0000000000 +21:0000000000 +22:0000000000 +23:0000000000 +24:0000000000 +25:0000000000 +26:0000000000 +27:0000000000 +28:0000000000 +29:0000000000 +2A:0000000000 +2B:0000000000 +2C:0000000000 +2D:0000000000 +2E:0000000000 +2F:0000000000 +30:0000000000 +31:0000000000 +32:0000000000 +33:0000000000 +34:0000000000 +35:0000000000 +36:0000000000 +37:0000000000 +38:0000000000 +39:0000000000 +3A:0000000000 +3B:0000000000 +3C:0000000000 +3D:0000000000 +3E:0000000000 +3F:0000000000 +40:0000000000 +41:0000000000 +42:0000000000 +43:0000000000 +44:0000000000 +45:0000000000 +46:0000000000 +47:0000000000 +48:0000000000 +49:0000000000 +4A:0000000000 +4B:0000000000 +4C:0000000000 +4D:0000000000 +4E:0000000000 +4F:0000000000 +50:0000000000 +51:0000000000 +52:0000000000 +53:0000000000 +54:0000000000 +55:0000000000 +56:0000000000 +57:0000000000 +58:0000000000 +59:0000000000 +5A:0000000000 +5B:0000000000 +5C:0000000000 +5D:0000000000 +5E:0000000000 +5F:0000000000 +60:0000000000 +61:0000000000 +62:0000000000 +63:0000000000 +64:0000000000 +65:0000000000 +66:0000000000 +67:0000000000 +68:0000000000 +69:0000000000 +6A:0000000000 +6B:0000000000 +6C:0000000000 +6D:0000000000 +6E:0000000000 +6F:0000000000 +70:0000000000 +71:0000000000 +72:0000000000 +73:0000000000 +74:0000000000 +75:0000000000 +76:0000000000 +77:0000000000 +78:0000000000 +79:0000000000 +7A:0000000000 +7B:0000000000 +7C:0000000000 +7D:0000000000 +7E:0000000000 +7F:0000000000 +80:0000000000 +81:0000000000 +82:0000000000 +83:0000000000 +84:0000000000 +85:0000000000 +86:0000000000 +87:0000000000 +88:0000000000 +89:0000000000 +8A:0000000000 +8B:0000000000 +8C:0000000000 +8D:0000000000 +8E:0000000000 +8F:0000000000 +90:0000000000 +91:0000000000 +92:0000000000 +93:0000000000 +94:0000000000 +95:0000000000 +96:0000000000 +97:0000000000 +98:0000000000 +99:0000000000 +9A:0000000000 +9B:0000000000 +9C:0000000000 +9D:0000000000 +9E:0000000000 +9F:0000000000 +A0:0000000000 +A1:0000000000 +A2:0000000000 +A3:0000000000 +A4:0000000000 +A5:0000000000 +A6:0000000000 +A7:0000000000 +A8:0000000000 +A9:0000000000 +AA:0000000000 +AB:0000000000 +AC:0000000000 +AD:0000000000 +AE:0000000000 +AF:0000000000 +B0:0000000000 +B1:0000000000 +B2:0000000000 +B3:0000000000 +B4:0000000000 +B5:0000000000 +B6:0000000000 +B7:0000000000 +B8:0000000000 +B9:0000000000 +BA:0000000000 +BB:0000000000 +BC:0000000000 +BD:0000000000 +BE:0000000000 +BF:0000000000 +C0:0000000000 +C1:0000000000 +C2:0000000000 +C3:0000000000 +C4:0000000000 +C5:0000000000 +C6:0000000000 +C7:0000000000 +C8:0000000000 +C9:0000000000 +CA:0000000000 +CB:0000000000 +CC:0000000000 +CD:0000000000 +CE:0000000000 +CF:0000000000 +D0:0000000000 +D1:0000000000 +D2:0000000000 +D3:0000000000 +D4:0000000000 +D5:0000000000 +D6:0000000000 +D7:0000000000 +D8:0000000000 +D9:0000000000 +DA:0000000000 +DB:0000000000 +DC:0000000000 +DD:0000000000 +DE:0000000000 +DF:0000000000 +E0:0000000000 +E1:0000000000 +E2:0000000000 +E3:0000000000 +E4:0000000000 +E5:0000000000 +E6:0000000000 +E7:0000000000 +E8:0000000000 +E9:0000000000 +EA:0000000000 +EB:0000000000 +EC:0000000000 +ED:0000000000 +EE:0000000000 +EF:0000000000 +F0:0000000000 +F1:0000000000 +F2:0000000000 +F3:0000000000 +F4:0000000000 +F5:0000000000 +F6:0000000000 +F7:0000000000 +F8:0000000000 +F9:0000000000 +FA:0000000000 +FB:0000000000 +FC:0000000000 +FD:0000000000 +FE:0000000000 +FF:0000000000

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.