You can open the FEC-Only example design through Vivado when the core is generated in the FEC-Only mode. You can view the hierarchy of the design below.
Design Overview
The FEC-only example design consists of a traffigenerator, which connects to each TX FEC only interface. The data that this block generates encoded by the RS-FEC encoders present in ILKNF. Given each symbol is 10 bits long, an FEC sends data through the TX SerDes interface as follows:
- In 100G mode, each FEC transmits 32 symbols per clock cycle through four
tx_serdes_data
pins, sending one codeword in 17 clock cycles. - In 50G mode, each slice in the FEC slice transmits 16 symbols per clock
cycle through two
tx_serdes_data
pins, sending one codeword in 34 clock cycles.
An error injector located at the TX SerDes Interface injects a fixed or arbitrary number of errors in each codeword. The corrupted data is then passed to the RS FEC decoder though the RX SerDes interface, and then sent to the traffic checker at the RX FEC-only interface to assess the data integrity.
TX Traffic Generator
Name | Address | Description |
---|---|---|
CTL_CFG_RATE_100G_REG | 0x0024 | A 6-bit register, where each bit configures both the slices of the corresponding segment to operate together at 100G mode. |
CTL_CFG_RATE_1X50G_A_REG | 0x0018 | A 6-bit register, where each bit configures slice A of the corresponding segment to operate at 50G mode. |
CTL_CFG_RATE_1X50G_B_REG | 0x001C | A 6-bit register, where each bit configures slice B of the corresponding segment to operate at 50G mode. |
|
Each slice or segment can transmit a fixed number of frames as per its mode of
operation. You can program this through CTL_CFG_NUM_FRAMES_REG
(0x0020). End of the transmission is indicated
by setting the corresponding bits in TX_DONE_REG
(0x0330).
There are other control registers such as
CTL_CFG_FECONLY_GAPS_EN_REG
(0x0028), which inserts gaps
between two consecutive codewords and CTL_CFG_FECONLY_SHORT_EN_REG
(0x002C) which enables the generation of short codewords, that is, less than 5440
bits. These are not used with ILKN FEC.
RX Traffic Checker
Name | Address | Description |
---|---|---|
DATA_MATCH_A_REG [N] | 0x00A8 + N*0x20 |
100G Mode: The number of 320-bit words received that have matched with the transmitted data. 50G Mode: The number of 160-bit words received that have matched with the transmitted data. |
DATA_MATCH_B_REG [N] | 0x00B0 + N*0x20 | 50G Mode: The number of 160-bit words received that have matched with the transmitted data. Unused when the segment is in 100G mode. |
DATA_MISMATCH_A_REG [N] | 0x00B8 + N*0x20 | 100G Mode: The number
of 320-bit words received that have not matched with the
transmitted data. 50G Mode: The number of 160-bit words received that have not matched with the transmitted data. |
DATA_MISMATCH_B_REG [N] | 0x00C0 + N*0x20 | 50G Mode: The number of 160-bit words received that have not matched with the transmitted data. Unused when the segment is in 100G mode. |
|
Error Injector
Name | Address | Description |
---|---|---|
CTL_CFG_ERRINJ_EN_FIXED_SYMERR_A_REG | 0x0030 | Setting bit N enables the injection of a fixed number of symbol errors in each codeword being received by slice 0 of FEC<N> in 50G mode and FEC<N> 100G mode. |
CTL_CFG_ERRINJ_EN_FIXED_SYMERR_B_REG | 0x0034 |
Setting bit enables the injection of a fixed number of symbol errors in each codeword received by slice 1 of FEC<N> in 50G mode. Unused in 100G mode. |
CTL_CFG_ERRINJ_ALWAYS_CORRECTABLE_A_REG | 0x0038 | In case the number of symbol errors are not fixed, setting bit N of this register ensures that the number of errors inserted in each codeword being received by FEC<N> Slice 0 always less than 16. Applies to both slices in 100G mode. |
CTL_CFG_ERRINJ_ALWAYS_CORRECTABLE_B_REG | 0x003C | In case the number of symbol errors are not fixed, setting bit N of this register ensures that the number of errors inserted in each codeword being received by FEC<N> Slice 1 is always less than 16. Unused in 100G mode. |
CTL_CFG_ERRINJ_SYM_ERR_PER_CWA_REG [N] | 0x0044 + N*0x10 | The fixed number of symbol errors per codeword received by slice 0 of FEC<N> in 50G mode and by FEC<N> in 100G mode. |
CTL_CFG_ERRINJ_SYM_ERR_PER_CWB_REG [N] |
0x0048 + N*0x10 | The fixed number of symbol errors per codeword received by slice 1 of FEC<N> in 50G mode. Unused in 100G mode. |
CTL_CFG_ERRINJ_CORRUPTION_PROB_A_REG [N] | 0x004C + N*0x10 | The value written to this register divided by 256 is the probability with which a codeword can be corrupted. Applies to slice 0 of FEC<N> in 50G mode and FEC<N> in 100G mode. |
CTL_CFG_ERRINJ_CORRUPTION_PROB_B_REG [N] | 0x0050 + N*0x10 | The value written to this register divided by 256 is the probability with which a codeword can be corrupted. Applies to slice 1 of FEC<N> in 50G mode. Unused in 100G mode. |
|
AXI4-Lite Register Map
C_S_AXI_BASE_ADDR
parameter of the register map module.
Name | Address | Description |
---|---|---|
FEC<N>_SLICE0_CCW_REG | 0x019C + N*0x4C | Number of codewords corrected by Slice 0 of FEC<N> in 50G mode or FEC<N> in 100G mode. |
FEC<N>_SLICE0_TCW_REG | 0x01A0 + N*0x4C | Total number of codewords processed by Slice 0 of FEC<N> in 50G mode or FEC<N> in 100G mode. |
FEC<N>_SLICE0_UCW_REG | 0x01A4 + N*0x4C | Number of codewords Slice 0 of FEC<N> could not correct in 50G mode or FEC<N> in 100G mode. |
FEC<N>_SLICE1_CCW_REG | 0x01A8 + N*0x4C | Number of codewords corrected by Slice 1 of FEC<N> in 50G mode. Unused in 100G mode. |
FEC<N>_SLICE1_TCW_REG | 0x01AC + N*0x4C | Total number of codewords processed by Slice 1 of FEC<N> in 50G mode. Unused in 100G mode. |
FEC<N>_SLICE1_UCW_REG | 0x01B0 + N*0x4C | Number of codewords which could not be corrected by Slice 1 of FEC<N> in 50G mode. Unused in 100G mode. |
|
Calculating the Symbol Errors Seen by ILKN FEC
For a given FEC instance N, the total number of symbols corrupted are determined as follows.
- Set the parameter C_ADDITIONAL_STATS of the register map module to 6’b111111.
- Read and store data values from the addresses 0x174 + N*0x4C, 0x180 + N*0x4C, 0x18C + N*0x4C, 0x198 + N*0x4C and let them be E0, E1, E2, and E3.
- Add the values obtained to get the total errors while using the FEC in 100G mode.
- In case of 50G mode, the total errors seen by slice 0 is E0 + E1 while for slice 1 it is given by E2 + E3.