Expand description
A functional implementation of a fabric with very basic timing.
Assumes that all traffic will move a Manhattan distance through the fabric to get from ingress to egress.
The fabric is assumed to be rectangular with a configurable num_rows and
num_columns. The grid has a configurable number of ports at each node
within the fabric grid.
§Ports
Each point in the fabric grid has a configurable number
- N input ports:
rx[row][column][0, N-1] - N output ports:
tx[row][column][0, N-1]
where:
- N = number of ingress/egress ports.
The Node is constructed with fabric row and column ports in addition to the N ingress/egress ports:
+-------------------------------------------------------+
| ingress[0..N-1] row_minus |
| |
| col_minus col_plus |
| |
| egress[0..N-1] row_plus |
+-------------------------------------------------------+A full fabric model is built of existing limiters, buffers, arbiters and routers such that the path of a frame from ingress to egress could look like:
+-------------------------------------+ +-------------------------------------+
| NODE0 | | NODE1 |
INGRESS -> LIMIT -> BUF -> ROUTER -> ARBITER -> DELAY -> ROUTER -> ARBITER -> LIMIT -> BUF -> EGRESS
| | | |
+-------------------------------------+ +-------------------------------------+Each Router performs the task of taking the frame from an input and deciding which arbiter to send the frame to. For example, if there were two fabric ingress/egress ports per node then the router at one of those ingress ports would look like:
+--------------------------------------------+
| NODE |
| +---------------+ |
| | ROUTER | ARBITERS |
| | | |
| | /-> tx[0] -> col_minus |
| | +-> tx[1] -> col_plus |
ingress[0] -> LIMIT -> BUF -> rx +-> tx[2] -> row_minus |
| | +-> tx[3] -> row_plus |
| | \-> tx[4] -> egress[1] |
| +---------------+ |
+--------------------------------------------+Each Arbiter does the job of deciding which frame to send next from those available on their inputs. For example, again considering a fabric with two ingress/egress ports per node, the arbiter at one of the egress ports would look like:
+-------------------------------------------+
| NODE |
| +---------------+ |
| ROUTERS | ARBITER | |
| | | |
| col_minus -> rx[0] \ | |
| col_plus -> rx[1] + | |
| row_minus -> rx[2] +-> tx -> LIMIT -> BUF -> egress[0]
| row_plus -> rx[3] + | |
| egress[1] -> rx[4] / | |
| +---------------+ |
+-------------------------------------------+