1. From Data Link to Physical Layer
- TLPs (Transaction Layer Packets) and DLLPs (Data Link Layer Packets) move down into the Physical Layer.
- At this point, the PHY:
- Adds framing characters (Start + End markers) so the receiver knows exactly where each packet begins and ends.
- Sends everything into buffers before transmission.
2. Byte Striping Across Lanes
- PCIe Links can have multiple lanes (x1, x4, x8, x16).
- Each lane is a separate serial channel.
- Data is striped (split byte by byte) across all active lanes, then recombined at the receiver.
- Example: With 4 lanes, byte #1 goes on lane 0, byte #2 on lane 1, etc., in parallel.
3. Scrambling
- Before sending, data is scrambled (shuffled with a known pattern).
- Purpose: avoid repetitive bit patterns that cause electromagnetic interference (EMI) on the wires.
4. Encoding (depends on PCIe generation)
-
Gen1 / Gen2 (2.5 GT/s, 5 GT/s):
- Use 8b/10b encoding.
- Every 8 data bits are expanded into 10 transmission bits.
- Adds 25% overhead, but ensures:
- Enough “transitions” for clock recovery
- DC balance (no buildup of 1s or 0s)
- Special symbols for framing/management
-
Gen3 (8 GT/s):
- Uses 128b/130b encoding.
- Much more efficient: only ~1.5% overhead.
- Still provides transition density and error detection.
5. Serialization
- The encoded bytes are serialized (converted into a continuous bit stream).
- Each lane sends data differentially at its defined rate:
- Gen1 = 2.5 GT/s
- Gen2 = 5 GT/s
- Gen3 = 8 GT/s
6. Reception Path
When receiving:
- Deserializer converts serial bit stream back into parallel form (symbols/bytes).
- Elastic buffer absorbs tiny timing differences between transmitter and receiver clocks (clock tolerance compensation).
- Depending on generation:
- Gen1/Gen2:
- 10-bit symbols → pass elastic buffer → 8b/10b decode → 8-bit characters.
- Gen3:
- Bytes directly → pass elastic buffer → skip 8b/10b decode.
- Gen1/Gen2:
- De-scrambling recovers the original byte sequence.
- Un-striping recombines lanes into the single data stream.
- The original packet is now fully reconstructed and passed back up to the Data Link Layer.
✅ In short:
- Transmit side: Add framing → stripe → scramble → encode → serialize → send.
- Receive side: Deserialize → buffer → decode (if needed) → de-scramble → un-stripe → deliver.