Level: AMS Sub-module (RX)
Class Name: RxDfeSummerTdf
Current Version: v0.5 (2025-12-21)
Status: In Development
DFE Summer (Decision Feedback Equalization Summation) is located in the RX receive chain after CTLE/VGA and before the Sampler, and is the core module for implementing Decision Feedback Equalization (DFE). Its main function is to sum (subtract) the differential signal from the main path with the feedback signal generated based on historical decision bits, thereby canceling post-cursor inter-symbol interference (ISI), increasing eye opening, and reducing bit error rate.
The core design concept of DFE is to use already-decided historical symbols to predict and cancel the post-cursor ISI affecting the current symbol:
- Source of Post-cursor ISI: Frequency-dependent attenuation and group delay of high-speed channels cause each transmitted symbol to "smear" in the time domain, affecting the sampling point voltage of subsequent symbols
- Feedback Compensation Mechanism: Already-decided historical symbols (b[n-1], b[n-2], ...) generate feedback voltage through an FIR filter structure, which is subtracted from the current input signal
- Causality Constraint: The feedback path must have at least 1 UI delay to avoid forming an algebraic loop (current decision depends on current output, and current output depends on current decision)
The mathematical expression for the feedback voltage is:
v_fb = Σ_{k=1}^{N} c_k × map(b[n-k]) × vtap
Where:
- c_k: The k-th tap coefficient
- b[n-k]: The decision bit at the n-k-th UI (0 or 1)
- map(): Bit mapping function (0→-1, 1→+1 or 0→0, 1→1)
- vtap: Voltage scaling factor, converting bit mapping value to volts
The equalized output is: v_eq = v_main - v_fb
- Differential Architecture: Complete differential signal path, compatible with preceding CTLE/VGA and subsequent Sampler
- Multi-tap Support: Supports 1-9 taps (typical configuration is 3-5), flexibly configurable according to channel characteristics
- Bit Mapping Modes: Supports ±1 mapping (recommended, more robust against DC offset) and 0/1 mapping
- Adaptive Interface: Receives real-time tap updates from the Adaption module through DE→TDF bridging ports
- Soft Saturation Mechanism: Optional output limiting to prevent signal distortion caused by over-compensation
- Historical Bit Interface: Receives externally maintained historical decision array through data_in port, simplifying module responsibilities
| Version | Date | Major Changes |
|---|---|---|
| v0.1 | 2025-10-22 | Initial version, basic DFE summation function |
| v0.2 | 2025-10-22 | Configuration key taps renamed to tap_coeffs |
| v0.3 | 2025-12-18 | Added DE→TDF tap update port for integration with Adaption module |
| v0.4 | 2025-12-18 | Improved data_in interface to array form, clarified length constraints |
| v0.5 | 2025-12-21 | Improved document structure, added testbench architecture and simulation analysis chapters |
| Port Name | Direction | Type | Description |
|---|---|---|---|
in_p |
Input | double | Differential input positive (from VGA) |
in_n |
Input | double | Differential input negative (from VGA) |
data_in |
Input | vector<int> | Historical decision data array |
out_p |
Output | double | Differential output positive (to Sampler) |
out_n |
Output | double | Differential output negative (to Sampler) |
DE→TDF Parameter Update Port (Optional):
| Port Name | Direction | Type | Description |
|---|---|---|---|
tap_coeffs_de |
Input | vector<double> | Tap coefficient updates from Adaption |
About data_in Port:
- Array length is determined by the length N of
tap_coeffsdata_in[0]is the most recent decision b[n-1],data_in[1]is b[n-2], ...,data_in[N-1]is b[n-N]- Array is maintained and updated by RX top-level module or Sampler, DFE Summer only reads and does not modify
| Parameter | Type | Default | Description |
|---|---|---|---|
tap_coeffs |
vector<double> | [] | Post-cursor tap coefficient list, in k=1...N order |
ui |
double | 2.5e-11 | Unit interval (seconds), for TDF timestep |
vcm_out |
double | 0.0 | Differential output common-mode voltage (V) |
vtap |
double | 1.0 | Bit mapping voltage scaling factor |
map_mode |
string | "pm1" | Bit mapping mode: "pm1" (±1) or "01" |
enable |
bool | true | Module enable, false for pass-through mode |
| Parameter | Type | Default | Description |
|---|---|---|---|
sat_enable |
bool | false | Enable output limiting |
sat_min |
double | -0.5 | Minimum output voltage (V) |
sat_max |
double | 0.5 | Maximum output voltage (V) |
| Parameter | Type | Default | Description |
|---|---|---|---|
init_bits |
vector<double> | [0,...] | Historical bit initialization values, length must equal N |
| Parameter | Description |
|---|---|
tap_count |
Number of taps N, equals tap_coeffs.size(), determines data_in array length |
-
pm1 Mode (Recommended): 0 → -1, 1 → +1
- Feedback voltage is symmetric, resistant to DC offset
- When all historical bits are 0, feedback voltage is negative
-
01 Mode: 0 → 0, 1 → 1
- Feedback voltage is asymmetric
- Requires additional DC offset compensation
DFE Summer module's processing() method adopts a strict multi-step processing architecture:
Input reading → Enable check → Historical data validation → Feedback calculation → Differential summation → Optional limiting → Common-mode synthesis → Output
Step 1 - Input Reading: Read signals from differential input ports, calculate differential component v_main = in_p - in_n.
Step 2 - Enable Check: If enable=false, directly pass input signals through common-mode synthesis to output (pass-through mode).
Step 3 - Historical Data Validation: Read data_in array, validate if length equals tap_count. If mismatched:
- Length insufficient: Pad with 0
- Length excessive: Truncate
- Warning log should be output
Step 4 - Feedback Calculation: Iterate through all taps, calculate total feedback voltage:
v_fb = 0.0;
for (int k = 0; k < tap_count; k++) {
double bit_val = map(data_in[k], map_mode); // Bit mapping
v_fb += tap_coeffs[k] * bit_val * vtap;
}Step 5 - Differential Summation: Subtract feedback voltage from main path signal: v_eq = v_main - v_fb
Step 6 - Optional Limiting: If sat_enable is enabled, use soft saturation function:
if (sat_enable) {
double Vsat = 0.5 * (sat_max - sat_min);
v_eq = tanh(v_eq / Vsat) * Vsat;
}Step 7 - Common-mode Synthesis: Generate differential output based on common-mode voltage:
out_p = vcm_out + 0.5 * v_eq
out_n = vcm_out - 0.5 * v_eq
DFE Summer supports two tap configuration modes:
- Internal
tap_coeffsmaintains initial values from configuration file - Applicable to scenarios where channel characteristics are known and stable
- Tap coefficients can be pre-determined through offline training or channel simulation
- Initialization Phase: DFE Summer initializes internal coefficients according to
tap_coeffsin configuration - Runtime Update:
- Adaption module executes LMS/Sign-LMS algorithms in DE domain
- New taps are passed through
tap_coeffs_deport - DFE Summer reads latest coefficients in each TDF period
- Updates take effect at the start of next UI
Length Consistency Constraint: Runtime updated tap array length must match initial configuration, if mismatched should error or truncate/pad.
Problem Essence: If current bit b[n] is directly used for current output feedback calculation, an algebraic loop forms:
- Current output v_eq[n] depends on feedback v_fb[n]
- Feedback v_fb[n] depends on decision b[n]
- Decision b[n] depends on sampling value, which comes from v_eq[n]
Consequences:
- Numerical instability, simulation timestep drastically reduced
- May cause simulation stall or divergence
- Physically unrealistic "instantaneous perfect cancellation" behavior
Avoidance Solution:
- Strictly use historical symbols b[n-k] (k≥1) for feedback calculation
data_inarray mechanism naturally guarantees this:data_in[0]is at least b[n-1]- Array update is performed by external module after current UI decision completes, before next UI processing
DFE Summer is equivalent to pass-through when any of the following conditions are met:
- Explicit Disable:
enable = false - All-zero Taps: All elements of
tap_coeffsare 0 - Empty Tap Configuration:
tap_coeffsis empty array
In pass-through mode:
v_fb = 0, output = input (after common-mode synthesis)data_inarray values do not affect output- But
data_inshould still maintain valid length for compatibility with subsequent adaptive enablement
DFE Summer testbench (DfeSummerTransientTestbench) adopts modular design with core concepts:
- Scenario-driven: Select different test scenarios through enumeration types, each scenario automatically configures signal source, tap coefficients, and historical bits
- Component Reuse: Differential signal source, historical bit generator, signal monitor and other auxiliary modules are reusable
- Eye Diagram Comparison: Focus on verifying eye opening changes before and after DFE enablement
| Scenario | Command Line Parameter | Test Objective | Output File |
|---|---|---|---|
| BYPASS_TEST | bypass / 0 |
Verify pass-through mode consistency | dfe_summer_bypass.csv |
| BASIC_DFE | basic / 1 |
Basic DFE feedback function | dfe_summer_basic.csv |
| MULTI_TAP | multi / 2 |
Multi-tap configuration test | dfe_summer_multi.csv |
| ADAPTATION | adapt / 3 |
Adaptive tap update | dfe_summer_adapt.csv |
| SATURATION | sat / 4 |
Large signal saturation test | dfe_summer_sat.csv |
Verify that output matches input when DFE is disabled or taps are all zero.
- Signal Source: PRBS-7 pseudo-random sequence
- Input Amplitude: 100mV
- Tap Configuration:
tap_coeffs = [0, 0, 0]orenable = false - Verification Point:
out_diff ≈ in_diff(allowing minor numerical error)
Verify basic feedback function under single-tap or few-tap configuration.
- Signal Source: PRBS signal with ISI (channel effect simulated through ISI injection module)
- Tap Configuration:
tap_coeffs = [0.1](single tap) - Historical Bits: Synchronized generation with input PRBS
- Verification Points:
- Feedback voltage matches formula calculation
- Output ISI reduced
Verify performance under typical 3-5 tap configuration.
- Signal Source: PRBS signal with multi-cursor ISI
- Tap Configuration:
tap_coeffs = [0.08, 0.05, 0.03] - Verification Points:
- Each tap independently effective
- Total feedback voltage correctly accumulated
Verify linkage function with Adaption module.
- Initial Taps:
tap_coeffs = [0, 0, 0] - Update Sequence: Gradually inject new tap values through
tap_coeffs_deport - Verification Points:
- Tap updates take effect at next UI
- Update process glitch-free
Verify limiting behavior under large signal input.
- Signal Source: Large amplitude square wave (500mV)
- Tap Configuration: Large coefficients
tap_coeffs = [0.3, 0.2, 0.1] - Saturation Configuration:
sat_min = -0.4V, sat_max = 0.4V - Verification Point: Output amplitude limited to sat_min/sat_max range
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ DiffSignalSrc │ │ RxDfeSummerTdf │ │ SignalMonitor │
│ │ │ │ │ │
│ out_p ─────────┼───────▶ in_p │ │ │
│ out_n ─────────┼───────▶ in_n │ │ │
└─────────────────┘ │ │ │ │
│ out_p ─────────┼───────▶ in_p │
┌─────────────────┐ │ out_n ─────────┼───────▶ in_n │
│ HistoryBitGen │ │ │ │ → Statistical Analysis │
│ │ │ │ │ → CSV Save │
│ data ──────────┼───────▶ data_in │ └─────────────────┘
└─────────────────┘ │ │
│ │
┌─────────────────┐ │ │
│ AdaptionMock │ │ │
│ (DE Domain) │ │ │
│ taps ──────────┼───────▶ tap_coeffs_de │
└─────────────────┘ └─────────────────┘
Reused with CTLE testbench, supports:
- DC, SINE, SQUARE, PRBS waveforms
- Configurable amplitude, frequency, common-mode voltage
Generates historical decision array synchronized with input signal:
- Input: Current bit stream (reference PRBS)
- Output: Historical bit array of length N
- Function: Maintains FIFO queue, shifts and updates every UI
Adds controllable post-cursor ISI to input signal:
- Parameters: ISI coefficients for each cursor
- Used to simulate channel effects, verify DFE cancellation capability
Simulates Adaption module behavior:
- Outputs tap updates according to preset schedule
- Used to verify DE→TDF port function
| Metric | Calculation Method | Significance |
|---|---|---|
| Mean | Arithmetic average of all sampling points | Reflects DC component of signal |
| RMS | Root mean square |
Reflects effective value/power of signal |
| Peak-to-Peak | Maximum - Minimum | Reflects dynamic range of signal |
| Max/Min | Extreme value statistics | Used to judge saturation and other boundary behaviors |
| Metric | Calculation Method | Significance |
|---|---|---|
| Eye Height | Eye diagram center vertical opening | Reflects signal quality, should increase after DFE |
| Eye Width | Eye diagram center horizontal opening | Reflects timing margin |
| ISI Residual | Post-cursor ISI component of DFE output | Should be close to zero, reflecting equalization effect |
| Feedback Voltage Error | Difference between actual v_fb and theoretical |
Verifies implementation correctness |
| Equalization Gain | (Eye height after DFE - Eye height before DFE) / Eye height before DFE | Quantifies equalization improvement |
Eye Height Calculation:
eye_height = min(V_1_low) - max(V_0_high)
Where V_1_low is the lower boundary distribution of logic "1" sampling points, V_0_high is the upper boundary distribution of logic "0" sampling points.
ISI Residual Calculation:
ISI_residual = Σ|h_k - c_k| for k = 1 to N
Where h_k is the channel post-cursor response, c_k is the DFE tap coefficient. Ideally c_k = h_k, residual is zero.
Configuration: tap_coeffs = [0, 0, 0], 100mV PRBS input
Expected Results:
- Differential output peak-to-peak ≈ Input peak-to-peak (200mV)
- Output waveform completely matches input waveform
- Any measurable difference should be < 1μV (numerical precision range)
Analysis Method:
- Calculate cross-correlation coefficient of input and output differential signals, should be > 0.9999
- Plot input-output difference waveform, verify no systematic offset
Configuration: Single tap tap_coeffs = [0.1], PRBS with 10% h1 ISI
Assumed Scenario:
- Input signal:
v_in[n] = v_data[n] + 0.1 × v_data[n-1](post-cursor ISI) - DFE feedback:
v_fb[n] = 0.1 × map(b[n-1])
Expected Results:
- If tap coefficient matches ISI coefficient, post-cursor ISI should be completely canceled
- Eye diagram vertical opening should increase by about 10%
- Peak-to-peak standard deviation of output differential signal should decrease
Analysis Method:
- Compare eye diagram overlays before and after DFE enablement
- Calculate eye height improvement percentage:
(eye_height_after - eye_height_before) / eye_height_before × 100%
Configuration: 3 taps tap_coeffs = [0.08, 0.05, 0.03], PRBS with multi-cursor ISI
Assumed Scenario:
- Channel impulse response: h0=1.0, h1=0.08, h2=0.05, h3=0.03
- Input signal contains 3 post-cursor ISI components
Expected Results:
- Tap 1 cancels h1 ISI
- Tap 2 cancels h2 ISI
- Tap 3 cancels h3 ISI
- Total ISI residual < 5% (considering quantization and noise)
Analysis Method:
- Independently verify each tap's contribution: zero out individual taps, observe corresponding ISI component recovery
- Plot pulse response comparison: channel response vs DFE response
Numerical Example:
| Configuration | Eye Height (mV) | Eye Height Improvement |
|---|---|---|
| No DFE | 160 | - |
| Single tap (c1=0.08) | 176 | +10% |
| 3 taps (c1/c2/c3) | 192 | +20% |
Initial taps all zero, updated to [0.05, 0.03] at t=100ns
Expected Results:
- t < 100ns: Output = pass-through (no DFE effect)
- t ≥ 100ns + 1 UI: New taps take effect, DFE compensation begins
- No output glitches or discontinuities during transition
Analysis Method:
- Take 10 UI waveforms before and after tap update moment
- Verify update effective delay = 1 UI (causality guarantee)
- Check waveform continuity at transition point
Verification Points:
- Feedback voltage change before and after update matches formula calculation
- If update moment coincides with symbol transition, no abnormal pulse should appear
Configuration: Large coefficients tap_coeffs = [0.3, 0.2, 0.1], sat_min = -0.4V, sat_max = 0.4V
Assumed Scenario:
- Input signal: 500mV square wave
- Theoretical output (without saturation): may exceed ±0.6V
Expected Results:
- Output differential signal limited to ±0.4V range
- Limiting uses soft saturation (tanh), waveform has no hard clipping artifacts
- Gain compression near saturation region, linear away from saturation region
Analysis Method:
- Plot input-output transfer curve, verify soft saturation characteristic
- Measure output peak-to-peak, confirm ≤ 0.8V (sat_max - sat_min)
Numerical Example:
| Input Diff (mV) | Unlimited Output (mV) | Limited Output (mV) |
|---|---|---|
| 300 | 300 | 295 |
| 400 | 400 | 375 |
| 500 | 500 | 395 |
| 600 | 600 | 399 |
CSV Output Format:
Time(s),Input Diff(V),Output Diff(V),Feedback Voltage(V),Historical Bits
0.000000e+00,0.100000,0.100000,0.000000,"[0,0,0]"
2.500000e-11,0.095000,0.085000,0.010000,"[1,0,0]"
5.000000e-11,0.102000,0.092000,0.010000,"[1,1,0]"
...
| Column Name | Unit | Description |
|---|---|---|
| Time | seconds (s) | Simulation timestamp |
| Input Diff | volts (V) | in_p - in_n |
| Output Diff | volts (V) | out_p - out_n |
| Feedback Voltage | volts (V) | v_fb = Σ c_k × map(b[n-k]) × vtap |
| Historical Bits | - | JSON format array, e.g. "[1,0,1]" |
- Default Sampling Rate: One data point per UI
- High Resolution Mode: 10-20 sampling points per UI (for eye diagram plotting)
- File Size Estimate: 1μs simulation @ 40Gbps ≈ 40,000 lines ≈ 2MB
import pandas as pd
import numpy as np
# Read CSV
df = pd.read_csv('dfe_summer_basic.csv')
# Calculate eye height (simplified)
v_diff = df['Output Diff(V)']
eye_height = np.percentile(v_diff[v_diff > 0], 5) - np.percentile(v_diff[v_diff < 0], 95)
print(f"Eye Height: {eye_height*1000:.2f} mV")
# Calculate equalization gain
v_in = df['Input Diff(V)']
eye_height_in = np.percentile(v_in[v_in > 0], 5) - np.percentile(v_in[v_in < 0], 95)
eq_gain = (eye_height - eye_height_in) / eye_height_in * 100
print(f"Equalization Gain: {eq_gain:.1f}%")Environment variables need to be configured before running tests:
source scripts/setup_env.shOr manually set:
export SYSTEMC_HOME=/usr/local/systemc-2.3.4
export SYSTEMC_AMS_HOME=/usr/local/systemc-ams-2.3.4Verify environment configuration:
echo $SYSTEMC_HOME # Should output SystemC installation path
echo $SYSTEMC_AMS_HOME # Should output SystemC-AMS installation path# Create build directory and compile
mkdir -p build && cd build
cmake ..
make dfe_summer_tran_tb
# Run test (in tb directory)
cd tb
./dfe_summer_tran_tb [scenario]Scenario Parameters:
| Parameter | Number | Description |
|---|---|---|
bypass |
0 |
Pass-through mode test (default) |
basic |
1 |
Basic DFE single-tap test |
multi |
2 |
Multi-tap configuration test |
adapt |
3 |
Adaptive tap update test |
sat |
4 |
Large signal saturation test |
Run Examples:
# Run basic DFE test
./dfe_summer_tran_tb basic
# Run multi-tap test
./dfe_summer_tran_tb 2
# Run all scenarios (batch test)
for i in 0 1 2 3 4; do ./dfe_summer_tran_tb $i; doneDFE Summer supports parameterization through JSON configuration files. Below are quick-start configurations for different application scenarios.
Suitable for preliminary function verification and debugging:
{
"dfe_summer": {
"tap_coeffs": [0.1],
"ui": 2.5e-11,
"vcm_out": 0.6,
"vtap": 1.0,
"map_mode": "pm1",
"enable": true
}
}Suitable for regular applications with moderate ISI channels:
{
"dfe_summer": {
"tap_coeffs": [0.08, 0.05, 0.03],
"ui": 2.5e-11,
"vcm_out": 0.6,
"vtap": 1.0,
"map_mode": "pm1",
"enable": true,
"sat_enable": false
}
}Suitable for severe ISI channels requiring more taps and output protection:
{
"dfe_summer": {
"tap_coeffs": [0.10, 0.07, 0.05, 0.03, 0.02],
"ui": 2.5e-11,
"vcm_out": 0.6,
"vtap": 1.0,
"map_mode": "pm1",
"enable": true,
"sat_enable": true,
"sat_min": -0.5,
"sat_max": 0.5,
"init_bits": [0, 0, 0, 0, 0]
}
}# Use command line parameter to specify configuration file
./dfe_summer_tran_tb basic --config config/dfe_3tap.json
# Or through environment variable
export SERDES_CONFIG=config/dfe_5tap.json
./dfe_summer_tran_tb multiAfter test completion, console outputs statistical results, waveform data is saved to CSV file.
=== DFE Summer Transient Simulation ===
Scenario: BASIC_DFE
Duration: 1.0 us
Tap count: 1
Tap coeffs: [0.10]
--- Statistics ---
Input diff: mean=0.000 mV, pp=200.0 mV, rms=70.7 mV
Output diff: mean=0.000 mV, pp=185.2 mV, rms=65.3 mV
Feedback: mean=0.000 mV, pp=100.0 mV, rms=35.4 mV
Eye height improvement: +8.5%
Output file: dfe_summer_basic.csv
# Basic waveform viewing
python scripts/plot_dfe_waveform.py dfe_summer_basic.csv
# Input-output comparison
python scripts/plot_dfe_waveform.py dfe_summer_basic.csv --compare
# Eye diagram overlay plotting
python scripts/plot_eye.py dfe_summer_basic.csv --samples-per-ui 20Compare eye diagram changes before and after DFE enablement, quantify equalization effect:
# Generate comparison report
python scripts/compare_eye_dfe.py \
--before dfe_summer_bypass.csv \
--after dfe_summer_basic.csv \
--output report/dfe_comparison.html
# Batch compare multi-tap configurations
python scripts/compare_eye_dfe.py \
--before dfe_summer_bypass.csv \
--after dfe_summer_basic.csv dfe_summer_multi.csv \
--labels "1-tap" "3-tap" \
--output report/dfe_multi_comparison.html| Scenario | Output File | Main Analysis Content |
|---|---|---|
| BYPASS | dfe_summer_bypass.csv | Baseline reference, no DFE effect |
| BASIC_DFE | dfe_summer_basic.csv | Single-tap eye height improvement |
| MULTI_TAP | dfe_summer_multi.csv | Multi-tap cumulative effect |
| ADAPTATION | dfe_summer_adapt.csv | Tap update transition behavior |
| SATURATION | dfe_summer_sat.csv | Limiting transfer curve |
DFE feedback must strictly guarantee at least 1 UI delay. This design achieves through following mechanisms:
- data_in Interface Design:
data_in[0]corresponds to b[n-1], not b[n] - External Update Responsibility: Historical bit array is updated by RX top-level, DFE Summer only reads
- Update Timing: Array update occurs after current UI decision completes, before next UI processing
If current bit is mistakenly used for feedback, SystemC-AMS may report algebraic loop errors or abnormally slow simulation.
- Typical Range: 0.01 ~ 0.3 (depending on channel ISI characteristics)
- Sign Convention: Positive coefficients used to cancel in-phase ISI, negative coefficients used to cancel anti-phase ISI
- Stability Constraint: Sum of absolute tap values should be < 1 to avoid feedback divergence
It is recommended to determine optimal tap values through channel simulation or adaptive algorithms.
| Tap Count | Applicable Scenario | Complexity |
|---|---|---|
| 1-2 | Short channel, low ISI | Low |
| 3-5 | Medium channel, typical application | Medium |
| 6-9 | Long channel, severe ISI | High |
More taps can cancel more post-cursor ISI, but increase:
- Power consumption and area
- Adaptive convergence time
- Error propagation risk
DFE Summer itself does not contain adaptive algorithms, responsibilities are separated as follows:
| Module | Responsibility |
|---|---|
| DFE Summer | Read taps and historical bits, calculate feedback, execute summation |
| Adaption | Read error signal, execute LMS algorithm, output new taps |
| RX Top-level | Maintain historical bit array, coordinate module timing |
This separation simplifies each module design, facilitates independent testing and replacement.
| Characteristic | pm1 Mode | 01 Mode |
|---|---|---|
| Mapping Rule | 0→-1, 1→+1 | 0→0, 1→1 |
| Feedback Symmetry | Symmetric | Asymmetric |
| DC Component | None (average is 0) | Present (average is 0.5×vtap) |
| Recommended Scenario | General (default) | Specific protocol requirements |
- TDF timestep should be set to UI:
set_timestep(ui) - Consistent with CDR/Sampler UI
- Too small timestep increases computational overhead, too large loses signal details
This module implementation has following known limitations and constraints:
Tap Count Limitation:
- Current implementation supports 1-9 taps
- More than 9 taps may cause:
- Feedback calculation delay too large, cannot complete within 1 UI
- Error propagation accumulation, affecting adaptive convergence
- If channel ISI exceeds 9 UI, it is recommended to combine with FFE for pre-cursor equalization
Numerical Precision Limitation:
- Tap coefficient precision: recommended to keep 4 significant digits
- Too small tap coefficients (< 0.005) may be drowned by noise, limited practical effect
- Floating-point accumulation error: when tap count is large, accumulation order may affect last few digits of precision
Timing Constraints:
data_inarray update must be performed after current UI decision completes- Tap update (through
tap_coeffs_de) takes effect at start of next UI - If tap update frequency exceeds UI period, only last update takes effect
Simulation Performance Impact:
- 5-tap configuration compared to pass-through mode, simulation speed reduced by about 10-15%
- Enabling saturation limiting (sat_enable) adds about 5% computational overhead
- Large-scale simulation (> 10M UI) recommended to use compilation optimization (-O2/-O3)
DFE (Decision Feedback Equalizer) and FFE (Feed-Forward Equalizer) are two complementary equalization technologies with different applicable scenarios:
| Characteristic | DFE | FFE |
|---|---|---|
| Location | Receiver (RX) | Transmitter (TX) |
| Equalization Target | Post-cursor ISI | Pre-cursor + Post-cursor ISI |
| Noise Impact | Does not amplify noise (feedback based on decisions) | Amplifies high-frequency noise |
| Error Propagation | Yes (wrong decision leads to wrong feedback) | No |
| Power Consumption | Lower | Higher (requires high-speed FIR) |
| Implementation Complexity | Medium | Lower |
Design Selection Guide:
- Mild ISI Channel: Use FFE only, 2-3 taps sufficient
- Moderate ISI Channel: FFE + DFE combination, FFE handles pre-cursor + main cursor, DFE handles post-cursor
- Severe ISI Channel: FFE + CTLE + DFE full-link equalization
This Module Positioning:
- DFE Summer focuses on post-cursor ISI cancellation
- Cooperates with TX-side FFE module
- Achieves tap adaptation through Adaption module, can be jointly optimized with FFE taps
| File | Path | Description |
|---|---|---|
| Parameter Definition | /include/common/parameters.h |
RxDfeSummerParams structure |
| Header File | /include/ams/rx_dfe_summer.h |
RxDfeSummerTdf class declaration |
| Implementation File | /src/ams/rx_dfe_summer.cpp |
RxDfeSummerTdf class implementation |
| Testbench | /tb/rx/dfe_summer/dfe_summer_tran_tb.cpp |
Transient simulation test |
| Test Helpers | /tb/rx/dfe_summer/dfe_summer_helpers.h |
Signal source and monitor |
| Unit Test | /tests/unit/test_dfe_summer_basic.cpp |
GoogleTest unit test |
| Adaption Documentation | /docs/modules/adaption.md |
Adaption module interface description |
- SystemC 2.3.4
- SystemC-AMS 2.3.4
- C++14 standard
- GoogleTest 1.12.1 (unit test)
Basic Configuration (3-tap DFE):
{
"dfe_summer": {
"tap_coeffs": [0.08, 0.05, 0.03],
"ui": 2.5e-11,
"vcm_out": 0.6,
"vtap": 1.0,
"map_mode": "pm1",
"enable": true
}
}Configuration with Limiting:
{
"dfe_summer": {
"tap_coeffs": [0.1, 0.06, 0.04, 0.02],
"ui": 2.5e-11,
"vcm_out": 0.6,
"vtap": 1.0,
"map_mode": "pm1",
"sat_enable": true,
"sat_min": -0.5,
"sat_max": 0.5,
"init_bits": [0, 0, 0, 0],
"enable": true
}
}Configuration with Adaptation:
{
"dfe_summer": {
"tap_coeffs": [0, 0, 0],
"ui": 2.5e-11,
"vcm_out": 0.6,
"vtap": 1.0,
"map_mode": "pm1",
"enable": true
},
"adaption": {
"dfe_enable": true,
"dfe_mu": 0.01,
"dfe_algorithm": "sign_lms"
}
}Document Version: v0.5
Last Updated: 2025-12-21
Author: SerDes Design Team