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

Subversion Repositories srdydrdy_lib

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 16 to Rev 17
    Reverse comparison

Rev 16 → Rev 17

/srdydrdy_lib/trunk/doc/component_descriptions.txt
0,0 → 1,118
==========================
| Component Descriptions |
==========================
 
1.0 Timing Closure Components
 
The timing closure components are intended for designing custom blocks and pipeline
stages. Each block provides timing closure for block outputs, or for block inputs
and outputs.
 
The two most common design methodologies today are registered-output (RO) and
registered-input-registered-output (RIRO). The library is generally built around
an assumption of an RO design style but also supports RIRO.
 
1.1 sd_input
 
When using an RO design style, the sd_input provides timing closure for a block's
consumer interface. The only block output for the consumer interface is c_drdy.
sd_input also provides a one-word buffer on c_data, but doesn't provide timing
closure for this input.
 
1.2 sd_output
 
The sd_output is the companion block to sd_input, providing timing closure for a
block's producer interface (or interfaces). It provides timing closure on p_srdy
and p_data.
 
1.3 sd_iohalf
 
The sd_iohalf can be used as either an input or output timing closure block, as
it closes timing on all of its inputs and outputs. It has an efficiency of 0.5,
meaning it can only accept data on at most every other clock, so it is useful for
low-rate interfaces.
 
1.4 sd_iofull
 
Provided for completeness, this block can be used with a RIRO design style to
provide timing closure for all of a block's inputs and outputs. Combines an
sd_input and sd_output.
 
2.0 Buffers
 
The buffers section of the library contains FIFOs for rate-matching and storage.
Each buffer consists of a "head" (write) block, and a "tail" (read) block, so that
the user can construct their own FIFOs from the blocks provided without having to
modify the library code. Each buffer is built around a synthesizable memory-like
block, so the buffers can be synthesized as-is or the top-level blocks can be
used as a template for creating your own FIFO around a library-specific memory.
 
ECC generate/correct blocks can also be placed inside this wrapper if error
correction is needed (see https://sourceforge.net/projects/xtgenerate/ for ECC
generator/checker).
 
2.1 sd_fifo_s
 
This "small" (or "sync") FIFO is used for rate-matching between blocks. It also
has built-in grey code conversion, so it can be used for crossing clock domains.
When the "async" parameter is set, the FIFO switches to using grey code pointers,
and instantiates double-sync flops between the head and tail blocks.
 
sd_fifo_s can only be used in natural powers of 2, due to the async support.
 
2.2 sd_fifo_b
 
This "big" FIFO supports non-power-of-2 sizes, as well as abort/commit behavior on
both of its interfaces. It is intended for packet FIFOs where the writer may want
to "forget" about a partially-written packet when an error is detected. It is also
useful for blocks which want to read ahead in the FIFO without actually removing data
(p_abort rewinds the read pointer), or for retransmission.
 
3.0 Forks and Joins
 
This section provides pipeline fork (split) and join blocks. A fork refers to any
block which has multiple producer interfaces, with usually a single consumer
interface. A join is the corresponding block with multiple consumer interfaces and
a single producer interface.
 
3.1 sd_mirror
 
This block is used to implement a mirrored fork, i.e. one in which all producer
interfaces carry the same data. This is useful in control pipelines when a single
item of data needs to go to multiple blocks, which may all acknowledge at different
times.
 
It has an optional c_dst_vld input, which can be used to "steer" data to one or more
destinations, instead of all of them. c_dst_vld should be asserted with c_srdy, if
it is being used. If not used, tie this input to 0 and it will mirror to all
outputs.
 
Note that sd_mirror is low-throughput, as it waits until all downstream blocks have
acknoweldged before accepting another word.
 
3.2 sd_rrslow
 
This block implements a "slow" round-robin arbiter/mux. It has multiple modes
with options on whether a grant implies that input will "hold" the grant, or
whether it moves on.
 
Mode 0 multiplexes between single words of data. Mode 1 allows an interface to burst,
so once the interface begins transmitting it can transmit until it deasserts srdy.
 
Mode 2 is for multiplexing packets, or other data where multiple words need to be
kept together. Once srdy is asserted, the block will not switch inputs until the
end pattern is seen, even if srdy is deasserted.
 
Validation note: modes 1 and 2 have not been verified to date.
 
4.0 Utility
 
This section is currently empty, but is intended for blocks which do not fit
into one of the above categories. Utility blocks could be items like a switch
fabric, packet ring, or a scoreboard.
 
5.0 Memory
 
Contains synthesizable memories implemented as flops. These correspond to the
commonly used registered-output memories available in most technologies.
 

powered by: WebSVN 2.1.0

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