3.1.1. PMA/FEC Direct PHY Multirate Design Example: Simulation Testbench
The testbench program controls the testbench components via Avalon® memory-mapped interface access, status and control signals. The Avalon® memory-mapped interface arbiter decodes the Avalon® memory-mapped interface access from the testbench program into multiple Avalon® memory-mapped interface slaves.
- PMA testwrap – used in PMA direct configurations.
- FEC testwrap – used in FEC direct configuration.
- Reference clock of 156.25MHz is used for Ethernet protocol data rate (i.e. 53.125G (PAM4) PMA Direct, 53.125G (PAM4) FEC Direct, 25.7812G (NRZ) PMA Direct and 10.3125G (NRZ) PMA Direct).
- Reference clock of 153.6MHz is used for 9.8304G (NRZ) PMA Direct, 4.9152G (NRZ) PMA Direct and 2.4576G (NRZ) PMA Direct CPRI protocol data rates,
- Reference clock of 184.32MHz is used for 24.3302G (NRZ) PMA Direct and 10.1376G (NRZ) PMA Direct CPRI protocol data rates.
For 400G-8 base variant design, one reference clock (156.25MHz) is fed into the system clock.
Simulation Flow:
- The PMA/FEC Direct PHY Multirate IP is power-up based on base profile.
- Initialize the testbench variables based on power-up profile. The parameter settings, located in the top_tst.sv file, are:
- DR_NUM: To indicate the number of dynamic reconfiguration transitions.
- DR_SEQ: To indicate the dynamic reconfiguration sequence.
- Perform dynamic reconfiguration based on the sequence in the parameter settings.
- Check the testbench error flag and determine whether testbench passed or failed. The error flag is set to 1 if there is any error after dynamic reconfiguration traffic tests.
For customization, you can modify the DR_NUM and DR_SEQ localparam, located in the top_tst.sv file to configure the test flow. The profile ID is passed to the IP to configure the intended dynamic reconfiguration task.
// Available Modes
localparam DR_MODE_50G_1 = 4'b0000; // ETH
localparam DR_MODE_25G_1 = 4'b0001; // ETH
localparam DR_MODE_24G_1 = 4'b0010; // CPRI
localparam DR_MODE_10p1G_1 = 4'b0011; // CPRI
localparam DR_MODE_9p8G_1 = 4'b0100; // CPRI
localparam DR_MODE_4p9G_1 = 4'b0101; // CPRI
localparam DR_MODE_2p4G_1 = 4'b0110; // CPRI
localparam DR_MODE_10G_1 = 4'b0111; // ETH
localparam DR_MODE_50GKP_1 = 4'b1000; // ETH
// DR from base variant (DR_MODE_50G_1) to other variants in the following order, starting from left.
localparam DR_NUM = 4;
localparam [3:0] DR_SEQ [0 : DR_NUM-1] = {DR_MODE_25G_1,DR_MODE_50GKP_1,DR_MODE_24G_1,DR_MODE_50G_1};
// Available Modes
localparam DR_MODE_50G_1 = 4'b0000; // ETH
localparam DR_MODE_25G_1 = 4'b0001; // ETH
localparam DR_MODE_24G_1 = 4'b0010; // CPRI
localparam DR_MODE_10p1G_1 = 4'b0011; // CPRI
localparam DR_MODE_9p8G_1 = 4'b0100; // CPRI
localparam DR_MODE_4p9G_1 = 4'b0101; // CPRI
localparam DR_MODE_2p4G_1 = 4'b0110; // CPRI
localparam DR_MODE_10G_1 = 4'b0111; // ETH
localparam DR_MODE_50GKP_1 = 4'b1000; // ETH
// DR from base variant (DR_MODE_50G_1) to other variants in the following order, starting from left.
localparam DR_NUM = 2;
localparam [3:0] DR_SEQ [0 : DR_NUM-1] = {DR_MODE_9p8G_1,DR_MODE_4p9G_1};
// Available Modes
localparam DR_MODE_400G_8 = 4'b0000;
localparam DR_MODE_200G_4 = 4'b0001;
localparam DR_MODE_100G_4 = 4'b0010;
// DR from base variant (DR_MODE_400G_8) to other variants in the following order, starting from left.
localparam DR_NUM = 3;
localparam [3:0] DR_SEQ [0 : DR_NUM-1] = {DR_MODE_100G_4,DR_MODE_400G_8,DR_MODE_200G_4};