Kestrel-3

ByteLink
Login

ByteLink

This is my attempt at exposing the TileLink v1.7 TL-UL specification out over just two PMOD 2x6 ports. When clocked at 25MHz, best-case throughput should reach 4.5MB/s, which for a 640x480 16-color display, should be good for 29 frames per second.

This interconnect is not intended to be switched over a larger fabric. Rather, it's designed to meet a very specific need.

Except in the case of errors, all data transactions take either 28 clock cycles, 30 clock cycles, 34 clock cycles, or 42 clock cycles to complete depending on the ss (payload size) field:

ss  Size          Bits
00  Byte          8
01  Half-word     16
10  Word          32
11  Double-word   64

Interconnect Signals

Signal Name CPU Card I/O Card Description
A0-A3 OUT IN 4-bit A-channel packet data bus
ACLK OUT IN A-channel clock (25MHz)
AFRAME OUT IN A-channel message boundary indicator
B0-B3 IN OUT 4-bit B-channel packet data bus
BCLK IN OUT B-channel clock (25MHz)
BFRAME IN OUT B-channel message boundary indicator

NOTE: When sending data, Nyb0 is sent first, then Nyb1. This generally follows the RISC-V convention of little-endian formats.

The xFRAME signal asserts only when sending Nyb0 of the first byte of a new packet.

Message Formats

GET

         Nyb1 Nyb0

BYTE 1   00.. 0...  Must be zero
         ..ss ....  Size field
         .... .opc  Opcode (see TileLink spec)
BYTE 2   tttt tttt  Transaction ID
BYTE 3   mmmm mmmm  Read Mask (Unused)
BYTE 4   aaaa a...  Address bits 0-7
         .... .000  Must be zero
BYTE 5   aaaa aaaa  Address bits 8-15
BYTE 6   aaaa aaaa  Address bits 16-23
BYTE 7   aaaa aaaa  Address bits 24-31
BYTE 8   aaaa aaaa  Address bits 32-39
BYTE 9   aaaa aaaa  Address bits 40-47
BYTE 10  aaaa aaaa  Address bits 48-55
BYTE 11  aaaa aaaa  Address bits 56-63

PUT PARTIAL and PUT FULL

         Nyb1 Nyb0

BYTE 1   00.. 0...  Must be zero
         ..ss ....  Size field
         .... .opc  Opcode (see TileLink spec)
BYTE 2   tttt tttt  Transaction ID
BYTE 3   mmmm mmmm  Write Mask
BYTE 4   aaaa a...  Address bits 0-7
         .... .000  Must be zero
BYTE 5   aaaa aaaa  Address bits 8-15
BYTE 6   aaaa aaaa  Address bits 16-23
BYTE 7   aaaa aaaa  Address bits 24-31
BYTE 8   aaaa aaaa  Address bits 32-39
BYTE 9   aaaa aaaa  Address bits 40-47
BYTE 10  aaaa aaaa  Address bits 48-55
BYTE 11  aaaa aaaa  Address bits 56-63
BYTE 12  dddd dddd  Data bits 0-7    (required)
BYTE 13  dddd dddd  Data bits 8-15   (only if ss >= 1)
BYTE 14  dddd dddd  Data bits 16-23  (only if ss >= 2)
BYTE 15  dddd dddd  Data bits 24-31  (only if ss >= 2)
BYTE 16  dddd dddd  Data bits 32-39  (only if ss = 3)
BYTE 17  dddd dddd  Data bits 40-47  (only if ss = 3)
BYTE 18  dddd dddd  Data bits 48-55  (only if ss = 3)
BYTE 19  dddd dddd  Data bits 56-63  (only if ss = 3)

ACK

BYTE 1   0... ....  Must be zero
         .E.. ....  Set if error; clear otherwise
         ..ss ....  Size field
         .... 1...  Must be one
         .... .opc  Opcode (see TileLink spec)
BYTE 2   tttt tttt  Transaction ID

ACK DATA

BYTE 1   0... ....  Must be zero
         .E.. ....  Set if error; clear otherwise
         ..ss ....  Size field
         .... 1...  Must be one
         .... .opc  Opcode (see TileLink spec)
BYTE 2   tttt tttt  Transaction ID
BYTE 3   dddd dddd  Data bits 0-7    (required)
BYTE 4   dddd dddd  Data bits 8-15   (only if ss >= 1)
BYTE 5   dddd dddd  Data bits 16-23  (only if ss >= 2)
BYTE 6   dddd dddd  Data bits 24-31  (only if ss >= 2)
BYTE 7   dddd dddd  Data bits 32-39  (only if ss = 3)
BYTE 8   dddd dddd  Data bits 40-47  (only if ss = 3)
BYTE 9   dddd dddd  Data bits 48-55  (only if ss = 3)
BYTE 10  dddd dddd  Data bits 56-63  (only if ss = 3)