LiteSATA Documentation Release 0.9.0 Kermarrec

LiteSATA Documentation
Release 0.9.0
Kermarrec Florent
May 26, 2015
CONTENTS
1
Introducing LiteSATA
1.1 About LiteSATA . . .
1.2 Open Source License .
1.3 Release Notes . . . .
1.4 Talks and Publications
.
.
.
.
3
3
5
5
6
2
Getting Started
2.1 Download and installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Bug Reporting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
7
7
7
3
SATA Specification
3.1 Dword - Data Representation
3.2 Primitives . . . . . . . . . . .
3.3 8b/10b - Encoding . . . . . .
3.4 Out of Band Signaling . . . .
3.5 Physical Layer . . . . . . . .
3.6 Link Layer . . . . . . . . . .
3.7 Transport Layer . . . . . . .
3.8 Command Layer . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
10
10
10
11
11
12
13
4
PHY
15
5
Core
17
6
Frontend interfaces
6.1 Packet description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2 User Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.3 User Responses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
19
20
20
7
Frontend modules
7.1 Crossbar . . . . . . .
7.2 Striping . . . . . . . .
7.3 Mirroring . . . . . . .
7.4 Module combinations
7.5 Examples . . . . . . .
21
21
21
22
22
22
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
Simulation
25
9
Test
27
i
ii
LiteSATA Documentation, Release 0.9.0
• First 0.9.0 release supporting Xilinx Kintex7.
CONTENTS
1
LiteSATA Documentation, Release 0.9.0
2
CONTENTS
CHAPTER
ONE
INTRODUCING LITESATA
This section explains what LiteSATA does, why it is needed, its limitations and its licensing. After reading, you will
understand whether LiteSATA is the right core for you, and where to go if you have further questions.
1.1 About LiteSATA
LiteSATA provides a small footprint and configurable SATA gen1/2 core.
LiteSATA is part of the MiSoC libraries whose aims are to lower entry level of complex FPGA cores by providing
simple, elegant and efficient implementations of components used in modern SoCs such as Ethernet, SATA, PCIe,
SDRAM controller...
The core uses simple and specific streaming buses and will provide in the future adapters to use standardized AXI or
Avalon-ST streaming buses.
Since Python is used to describe the gateware, the core is highly and easily configurable.
The synthetizable BIST can be used as a starting point to integrate SATA in your own SoC.
LiteSATA uses technologies developed in partnership with M-Labs Ltd:
• Migen enables generating HDL with Python in an efficient way.
• MiSoC provides the basic blocks to build a powerful and small footprint SoC.
LiteSATA can be used as a Python library or can be integrated with your standard design flow by generating the Verilog
RTL that you will use as a standard core.
1.1.1 Features
PHY:
• OOB, COMWAKE, COMINIT
• ALIGN inserter/remover and bytes alignment on K28.5
• 8B/10B encoding/decoding in transceiver
• Errors detection and reporting
• 32 bits interface
• 1.5/3.0/6.0GBps supported speeds (respectively 37.5/75/150MHz system clk)
Core:
Link:
3
LiteSATA Documentation, Release 0.9.0
• CONT inserter/remover
• Scrambling/Descrambling of data
• CRC inserter/checker
• HOLD insertion/detection
• Errors detection and reporting
Transport/Command:
• Easy to use user interfaces (Can be used with or without CPU)
• 48 bits sector addressing
• 3 supported commands: READ_DMA(_EXT), WRITE_DMA(_EXT), IDENTIFY_DEVICE
• Errors detection and reporting
Frontend:
• Configurable crossbar (simply declare your crossbar and use core.crossbar.get_port() to add a new port!)
• Ports arbitration transparent to the user
• Synthesizable BIST
• Striping module to segment data on multiple HDDs and increase write/read speed and capacity. (RAID0
equivalent)
• Mirroring module for data redundancy and increase read speeds. (RAID1 equivalent)
1.1.2 Possibles improvements
• add standardized interfaces (AXI, Avalon-ST)
• add NCQ support
• add AES hardware encryption
• add on-the-flow compression/decompression
• add support for Altera PHYs.
• add support for Lattice PHYs.
• add support for Xilinx 7-Series GTP/GTH (currently only 7-Series GTX are supported)
• add Zynq Linux drivers.
• ... See below Support and Consulting :)
1.1.3 Support and Consulting
We love open-source hardware and like sharing our designs with others.
LiteSATA is developed and maintained by EnjoyDigital.
If you would like to know more about LiteSATA or if you are already a happy user and would like to extend it for your
needs, EnjoyDigital can provide standard commercial support as well as consulting services.
So feel free to contact us, we’d love to work with you! (and eventually shorten the list of the possible improvements :)
4
Chapter 1. Introducing LiteSATA
LiteSATA Documentation, Release 0.9.0
1.1.4 Contact
E-mail: florent [AT] enjoy-digital.fr
1.2 Open Source License
LiteSATA is released under the very permissive two-clause BSD license. Under the terms of this license, you are
authorized to use LiteSATA for closed-source proprietary designs. Even though we do not require you to do so, those
things are awesome, so please do them if possible:
• tell us that you are using LiteSATA
• cite LiteSATA in publications related to research it has helped
• send us feedback and suggestions for improvements
• send us bug reports when something goes wrong
• send us the modifications and improvements you have done to LiteSATA.
Unless otherwise noted, LiteSATA is copyright (C) 2014-2015 HKU.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Other authors retain ownership of their contributions. If a submission can
reasonably be considered independently copyrightable, it's yours and we
encourage you to claim it with appropriate copyright notices. This submission
then falls under the "otherwise noted" category. All submissions are strongly
encouraged to use the two-clause BSD license reproduced above.
1.3 Release Notes
1.3.1 ChangeLog
0.9.0:
• First release supporting Xilinx Kintex7.
1.2. Open Source License
5
LiteSATA Documentation, Release 0.9.0
1.4 Talks and Publications
• Migen / MiSoC documentation: - User guide (m-labs) - Tutorial: An introduction to Migen (m-labs)
• Migen / MiSoC presentations: - Lecture slides (sbourdeauducq) - EHSM 2012 presentation (sbourdeauducq) ORCONF2014 (fallen)
6
Chapter 1. Introducing LiteSATA
CHAPTER
TWO
GETTING STARTED
Now that you know why LiteSATA is the core for you, it’s time to get started.
This section explains the procedure for downloading and installing the tools.
2.1 Download and installation
Please follow the “Getting started” section of the LiteSATA README.
2.2 FAQ
Note: Please contribute to this document.
2.3 Bug Reporting
• send us feedback and suggestions for improvements
• send us bug reports when something goes wrong
• send us the modifications and improvements you have done to LiteSATA. The use of “git format-patch” is
recommended. If your submission is large and complex and/or you are not sure how to proceed, feel free to
discuss it with us.
7
LiteSATA Documentation, Release 0.9.0
8
Chapter 2. Getting Started
CHAPTER
THREE
SATA SPECIFICATION
Note: This chapter is a lightly modified version of the excellent SATA summary found in Chapter 2 of Erik Landström’s Thesis.
Serial Advanced Technology Attachment (SATA) is a serial link replacement of Parallel ATA (PATA), both standards
for communication with mass storage devices. This high-speed serial link is a differential layer that utilizes Gigabit
technology and 8b/10b encoding. The link supports full duplex but the protocol only permits frames in one direction
at a time. The other non-data direction is used for flow control of the data stream
Figure 3.1: SATA layers.
SATA’s architecture consists of four layers, Application, Transport, Link, and Physical. The Application layer is
responsible for overall ATA commands and of controlling SATA register accesses. The transport layer places control
information and data to be transferred between the host and corresponding SATA device in a data packets. One such
packet is called a frame information structure (FIS). The Link layer is responsible for taking data from a FIS and
encode/decode it using 8b/10b. It also inserts control characters for flow control and calculates the cyclic redundancy
check (CRC) for error detection. Finally the Phy layer’s task is to deliver and receive the encoded serial data stream
on the wire.
3.1 Dword - Data Representation
In the SATA standard the smallest allowed data is a Dword, its 32 bits are divided into four bytes. Where each pair of
bytes represent a word and a pair of words represent a Dword. In this way it’s easy to see that odd number of bytes is
not allowed in SATA communication.
9
LiteSATA Documentation, Release 0.9.0
Figure 3.2: Byte, Word, Dword definitions.
The Dwords can be represented by either a data Dword or a so called primitive. A primitive is a predefined Dword
like for example start of frame (SOF) and end of frame (EOF).
3.2 Primitives
Primitives are Dwords with a purpose to enable and control the serial communication. They all begin with a control
character followed by three other characters to fill up the Dword. The control character makes it easy to recognize a
primitive from a ordinary Dword of a frame. There is 18 different primitives, all with a dedicated task like for example
mark a frame with a SOF or to provide synchronization with the SYNC.
3.3 8b/10b - Encoding
8b/10b encoding is rather common in high speed applications, it’s used to provide bounded disparity but still provide
enough toggling to make clock recovery possible (synchronize internal clock with the data stream). The bounded
disparity means that in a string of twenty bits the difference between zeros and ones shall be -2, 0, or 2 and with a
maximum runlength of five. The drawback is the created overhead of two bits per byte making the actual transfer
speed of for example 1.5 Gbps link to 1.2 Gbps, a loss of 20 %. Since the 8b/10b extends the possible alphabet from
256 symbols to 1024 it can provide detection and encoding of special characters (also called k-characters) in an easy
and effective way. This is used in the SATA standard by encoding every primitive as such special characters.
3.4 Out of Band Signaling
Since SATA devices and hosts always sends junk over its differential channels, when it is idle (otherwise the link is
considered lost), there has to be a way of recognizing a signal before a link has been initialized. For this SATA uses
so called out of band signaling (OOB) to initialize a connection between a host and a device. The OOB mechanism
supports low speed transmission over a high speed connection, such as a SATA link. The OOB signals are nondifferential but are sent over a differential channel. This is possible by letting the differential transmitters drive their
output pins to the same voltage, resulting in a reduced difference and when a preset threshold limit is reached the
receiver can recognize the signal as OOB.
Figure 3.3: OOB signals.
10
Chapter 3. SATA Specification
LiteSATA Documentation, Release 0.9.0
As can be seen in the figure there are three types of (actually two since COMINIT and COMRESET are equal) valid
OOB signals where bursts of six ALIGN are sent with different timing. The importance in the signaling lies in the
timing, it does not really matter if an ALIGN or something else are sent because the receiver only detects the drop
of voltage difference between rx+ and rx-. In the next figure the complete startup sequence is visualized and the
calibration steps in it are optional to implement. The host sends COMRESET until the device is powered on and
can respond with a COMINIT. Upon reception of the COMINIT the host sends a COMWAKE to the device which
shall send a COMWAKE back. If this procedure is finished within a correct time the OOB signaling ends and the
differential communication can proceed with determining the link speed (right part of the figure).
Figure 3.4: OOB init sequence.
3.5 Physical Layer
This section describes the physical interface towards the actual SATA link. The features of the phy can be summarized
to:
• Transmit/Receive a 1.5 Gbps, 3.0 or 6.0 Gbps differential signal
• Speed negotiation
• OOB detection and transmission
• Serialize a 10, 20, or other width parallel data from the link layer
• Extract data from the serial data stream
• Parallelize the data stream and send it to the link layer
• Handle spread spectrum clocking (SSC), a clock modulation technique used to reduce unintentional interference
to radio signals
At startup the physical layer is in its OOB state and after a link has been initiated it changes to Idle Bus condition
and normal SATA communication is now supported. Since the SATA connection is noisy the physical layer detects
a frame when it receives a SOF primitive and it will keep on listening to the incoming signal until an EOF primitive
is received. Except from FIS the SATA traffic also consists of single primitives which all are easy for the PHY to
recognize because of their starting control character.
3.6 Link Layer
This section describes the SATA link layer. The link layer’s major tasks are:
• Flow control
3.5. Physical Layer
11
LiteSATA Documentation, Release 0.9.0
• Encapsulate FISes received from transport layer
• CRC generation and CRC check
• FIS scrambling and de-scrambling
• 8b/10b encoding/decoding
A FIS is framed between a SOF and a EOF creating the boundaries of a frame. The last Dword before a EOF is the
CRC value for the FIS. The CRC is calculated by applying the 32-bits generator polynomial G(x) in Equation on every
bit in every non-primitive Dword in a FIS and then summarize (modulo 2) all these terms together with the Initial
Value. The CRC is fixed to value of 0x52325032.
Figure 3.5: CRC polynom.
Scrambling a FIS reduces EMI by spreading the noise over a broader frequency spectrum. The scrambling algorithm
can be expressed as a polynomial or as a linear feedback shift register. The scrambling creates a pseudorandom bit
pattern of the data that reduces EMI. The algorithm resets to a of value of 0xFFFF every time a SOF is encountered at
the scrambler. The de-scrambler uses the same algorithm on scrambled data so it retakes its original form.
Figure 3.6: Scrambler LFSR polynom.
It is important that the CRC calculations are made at original data and that the scrambling/de-scrambling are made
between the CRC and the 8b/10b encoding/decoding. The flow control between host and device is managed by sending
primitives to one another telling its status (which originates from the transport layer). Some of these primitives can be
inserted into FIS. Primitives are not supposed to be scrambled or added to the CRC sum. Internally the flow control
are regulated by signaling between the layers.
3.7 Transport Layer
The main task for the SATA transport layer is to handle FISes and a brief description of the layer’s features follows:
• Flow control
• Error control
• Error reporting
• FIS construction
• FIS decomposition
• FIS buffering for retransmission
There are eight types of FISes each with its specific 8-bit ID and unique header. FISes vary in size from 1 Dword up
to 2049 Dwords. The number of bytes in a FIS are always a multiple of four so the transport layer has to fill up with
zeros if there are bytes or bits missing for an entire Dword. The flow control in this case is only to report to the link
layer that the data buffers are close to over- or underflow. Errors detected are supposed to be reported to the application
layer and the detectable errors are:
• Errors from lower layers like 8b/10b disparity error or CRC errors.
• SATA state or protocol errors caused by standard violation.
12
Chapter 3. SATA Specification
LiteSATA Documentation, Release 0.9.0
• Frame errors like malformed header.
• Internal transport layer errors like buffer overflow.
Errors are handled in different ways, for example are resending of complete FISes supported for all kind of FISes
besides the data FISes (and the BIST FIS which is used typically during testing), because that would need buffers in
size of 8192 bytes (maximum supported FIS size). The max sized non-data FIS is 28 bytes so the costs of a large
buffer can be spared.
3.8 Command Layer
The command layer tells the transport layer what kind of FISes to send and receive for each specific command and in
which order those FISes are expexted to be delivered.
Note: This chapter is a lightly modified version of the excellent SATA summary found in Chapter 2 of Erik Landström’s Thesis.
3.8. Command Layer
13
LiteSATA Documentation, Release 0.9.0
14
Chapter 3. SATA Specification
CHAPTER
FOUR
PHY
Note: Please contribute to this document, or support us financially to write it.
15
LiteSATA Documentation, Release 0.9.0
16
Chapter 4. PHY
CHAPTER
FIVE
CORE
Note: Please contribute to this document, or support us financially to write it.
17
LiteSATA Documentation, Release 0.9.0
18
Chapter 5. Core
CHAPTER
SIX
FRONTEND INTERFACES
All frontend modules of LiteSATA share the same user interface based on packets. An interface has 2 endpoints:
• A Sink used to send commands and write data.
• A Source used to receive commands acknowledges and read data.
Packets and user commands/responses are described in the next sections.
6.1 Packet description
Sink and Source endpoints use packets with additional parameters. A packet has the following signals:
• stb: Strobe signal, indicates that command or data is valid.
• sop: Start Of Packet signal, indicates that current command or data is the first of the packet.
• eop: End Of Packet signal, indicates that current command or data is the last of the packet.
• ack: Acknowledge signal, indicates the destination is able to accept current data.
• data: Data signal.
Figure 6.1: An example of packet transaction between endpoints.
Tip:
• When a packet only has a data, sop and eop must be set to 1 on the same clock cycle.
• A data is accepted when stb =1 and ack =1.
19
LiteSATA Documentation, Release 0.9.0
6.2 User Commands
All transfers are initiated using the Sink endpoint of the interface which has the following signals:
• write: 1 bit signal, indicates if we want to write data to the HDD.
• read: 1 bit signal, indicates if we want to read data from the HDD.
• identify: 1 bit signal, indicates if the command is an identify device command (use to get HDD information).
• sector: 48 bits signal, the sector number we are going to write or read.
• count: 16 bits signal, the number of sectors we are going to write or read.
• data: n x 32 bits signal, the write data. (n depends of the frontend module)
Tip:
• write, read, identify, sector, count are parameters which must remain constant for the duration of
the packet.
• sector, count are ignored during an identify command.
• data is ignored during a read or identify command.
6.3 User Responses
Responses are obtained from the Source endpoint which has the following signals:
• write: 1 bit signal, indicates if the command was a write.
• read: 1 bit signal, indicates if the command was a read.
• identify: 1 bit signal, indicates if the command was an identify device command.
• last: 1 bit signal, indicates if this is the last packet of the response. (A response can be return in several
packets)
• failed: 1 bit signal, indicates if an error was detected in the response (CRC, FIS...)
• data: n x 32 bits signal, the read data. (n depends of the frontend module)
Tip:
• write, read, identify, last are parameters that must remain constant for the duration of a packet.
• data can be ignored in the case of a write or identify command.
• in case of a read command, read data packets are presented followed by an empty packet indicating the end of
the transaction (last=1).
20
Chapter 6. Frontend interfaces
CHAPTER
SEVEN
FRONTEND MODULES
LiteSATA provides a configurable and flexible frontend that can be used to:
• Provides any number of user ports.
• Generate RAID configurations when used with multiple HDDs.
7.1 Crossbar
The crossbar allows the user to request any number of ports for their application. It automatically arbitrates requests
and dispatches responses to the corresponding ports.
The following example creates a crossbar and 2 user ports:
self.submodules.sata_crossbar = LiteSATACrossbar(self.sata_core)
user_port0 = self.sata_crossbar.get_port()
user_port1 = self.sata_crossbar.get_port()
7.2 Striping
The striping module segments data so that data is stored on N different controllers (RAID0 equivalent).
+----> controller0 (dw)
port (N*dw) <----+----> controllerX (dw)
+----> controllerN (dw)
Characteristics:
• port‘s visible capacity = N x controller‘s visible capacity
• port‘s throughput = N x (slowest) controller‘s throughput
It can be used to increase capacity and writes/reads speed.
The following example creates a striping with 2 HDDs:
self.submodules.sata_striping = LiteSATAStriping([self.sata_core0, self.sata_core1])
sata_striping‘s Sink and Source are the user interface.
21
LiteSATA Documentation, Release 0.9.0
7.3 Mirroring
The mirroring module handles N controllers and provides N ports (RAID1 equivalent).
Each port has its dedicated controller for reads:
port0 <----> controller0
portX <----> controllerX
portN <----> controllerN
Writes are mirrored on each controller:
(port0 write)
port0 ----------+----> controller0
portX (stalled) +----> controllerX
portN (stalled) +----> controllerN
|
|
|
|
(portN write)
port0 (stalled) +-----> controller0
portX (stalled) +-----> controllerX
portN ----------+-----> controllerN
Writes have priority on reads. When a write is presented on one of the ports, the module waits for all ongoing reads to
finish and commute to write mode. Once all writes are serviced it returns to read mode.
Characteristics:
• port‘s visible capacity = controller‘s visible capacity
• total writes throughput = (slowest) controller‘s throughput
• total reads throughput = N x controller‘s throughput
It can be used for data redundancy and/or to increase the total read speed.
The following example creates a mirroring with 2 HDDs:
self.submodules.sata_mirroring = LiteSATAMirroring([self.sata_core0, self.sata_core1])
sata_striping‘s ports[0] and ports[1] are the user interfaces.
7.4 Module combinations
Since all frontend modules share the same interface, it’s easy to combine them together.
In the following code, we have 4 HDDs, do a striping with (0,1) and (2,3), a mirroring on top of that and then create a
crossbar on the first port of our mirroring module:
self.submodules.sata_striping0 = LiteSATAStriping([self.sata_core0, self.sata_core1])
self.submodules.sata_striping1 = LiteSATAStriping([self.sata_core2, self.sata_core3])
self.submodules.sata_mirroring = LiteSATAMirroring([self.sata_striping0, self.sata_striping1])
self.submodules.sata_crossbar = LiteSATACrossbar(self.sata_mirroring.ports[0])
self.user_port0 = self.sata_crossbar.get_port()
self.user_port1 = self.sata_crossbar.get_port()
This code provides the following user interfaces:
self.sata_mirroring.ports[1].
self.user_port0,
self.user_port1 and
7.5 Examples
Since it’s probably easier to figure out how to use the frontend modules with real use cases, we provides example
designs:
22
Chapter 7. Frontend modules
LiteSATA Documentation, Release 0.9.0
• A BIST (Data generator and checker) design that can be used to understand how to connect your logic to the
user_port provided by the crossbar.
• A Striping design that can be used to understand how to combine 4 HDDs together in striping mode and do a
BIST on it.
• A Mirroring design that can be used to understand how to combine 4 HDDs together in mirroring mode and do
a BIST on it.
7.5. Examples
23
LiteSATA Documentation, Release 0.9.0
24
Chapter 7. Frontend modules
CHAPTER
EIGHT
SIMULATION
Note: Please contribute to this document, or support us financially to write it.
Simulations are available in ./test:
• crc_tb
• scrambler_tb
• phy_datapath_tb
• link_tb
• command_tb
• bist_tb
• striping_tb
• mirroring_tb
Models for all the layers of SATA and a simplified HDD model are provided. To run a simulation, go to ./test and run:
• make <simulation_name>
25
LiteSATA Documentation, Release 0.9.0
26
Chapter 8. Simulation
CHAPTER
NINE
TEST
Note: Please contribute to this document, or support us financially to write it.
A synthetizable BIST is provided and can be controlled with ./test/bist.py. By using LiteScope and the provided
./test/test_link.py example you are able to visualize the internal logic of the design and even inject the captured data
into the HDD model!
27