ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

DP(edp)符号错误率(SER, Symbol Error Rate)

DP(edp)符号错误率(SER, Symbol Error Rate) 目录寄存器描述00102h0010Bh-0010Eh00210h-00217h 错误计数3.5.1.4 Link Quality Measurement2.9.3.6 Link Quality Test Support2.9.3.6.2 Symbol Error Rate Measurement Pattern测试图案说明接收器行为测量流程测量时间建议符号错误率计算公式在不同速率下的计算公式结果单位为 10⁻⁹脚本工具2lane脚本4lane 脚本总结寄存器描述由于版本不同采用不同的寄存器。 对于1.1 版本采用102H寄存器产生LINK QUAL PATTERN SET而对于1.2及之后的版本则更精细化对于每个lane都有一个单独的寄存器以控制LINK QUAL PATTERN00102h00102hTRAINING_PATTERN_SETBits 1:0 TRAINING_PATTERN_SELECT : Link Training Pattern Selection00 – Training not in progress (or disabled)01 – Training Pattern 110 – Training Pattern 211 – Training Pattern 3For DPCD Version 1.1Bits 3:2 LINK_QUAL_PATTERN_SET00 – Link quality test pattern not transmitted01 – D10.2 test pattern (unscrambled) transmitted (same as TrainingPattern 1)10 –Symbol Error Rate measurement pattern transmitted11 – PRBS7 transmittedThe PRBS7 bit sequence must be:----- direction ---0010000011000010100011110010001011001110101001111101000011100010010011011010110111101100011010010111011100110010101011111110000Note: Upper left is transmitted first and lower right is transmitted last.For DPCD Version 1.2Bits 3:2 are RESERVED (always 00), replaced with per-lane control in LINK_QUAL_LANEn_SET(DPCD 0010Bh-0010Eh)Bit 4 RECOVERED_CLOCK_OUT_EN0 – Recovered clock output from a test pad of DisplayPort RX not enabled1 – Recovered clock output from a test pad of DisplayPort RX enabled.Bit 5 SCRAMBLING_DISABLE0 – DP transmitter scrambles data symbols before transmission1 – DP transmitter disables scrambler and transmits all symbols withoutscramblingFor DPCD Version 1.0:Bits 7:6 RESERVED, read as zeros.For DPCD Version 1.1 and laterBits 7:6 SYMBOL ERROR COUNT SEL00: Disparity error and Illegal Symbol error01: Disparity error10: Illegal symbol error11: RESERVEDSYMBOL_ERROR_COUNT_SEL applies to the main lanes0010Bh-0010Eh每个寄存器对应一个lane0010BhLINK_QUAL_LANE0_SETThe controls in this register supersede the controls in TRAINING_PATTERN_SET (DPCD 00102h).Bits 2:0 LINK_QUAL_PATTERN_SET000 – Link quality test pattern not transmitted001 – D10.2 test pattern (unscrambled) transmitted (same as TrainingPattern 1)010 –Symbol Error Rate Measurement Pattern transmitted011 – PRBS7 transmitted100 – 80 bit custom pattern transmitted101 – HBR2 Compliance EYE pattern transmitted110-111 – RESERVED Bits7:3 RESERVED00210h-00217h 错误计数00210h – 00211hSYMBOL_ERROR_COUNT_LANE0 :15-bit value storing the symbol error count of Lane000210h bits 7:0 Error Count Bits 7:000211h bits 6:0 Error Count Bits 14:800211h bit 7 Error count validSet to 1 when the error count value is valid.For Symbol Error Rate Measurement (repetition of scrambled 00h before ANSI8B/10B encoding)Measures the number of mismatched symbols.For PRBS7 pattern Measures the number of mismatched bits.For HBR2 Compliance EYE pattern (repetition of scrambled 00h before ANSI8B/10B encoding)Measures the number of mismatched symbols.When no test pattern is being transmitted (normal operation)Measures the number of illegal symbols or disparity errors as controlled by the SYMBOL ERROR COUNT SEL field of TRAINING_PATTERN_SET (DPCD 00102h)The 15 bit value is cleared upon an AUX CH read by the transmitter.When the symbol error count exceeds 215-1( 32,767), the value must be kept at 215- 1, instead of wrapping around当没有测试图案正在传输时正常操作错误计数器测量的是非法符号或差异错误的数量具体测量哪种错误由TRAINING_PATTERN_SETDPCD 0x00102h寄存器中的SYMBOL ERROR COUNT SEL字段控制3.5.1.4 Link Quality Measurement链路符号错误率测量当 DP 上游设备将LINK_QUAL_LANEn_SET字节写入010b时接收器统计解扰后不是 00h的数据符号数量并将该计数存储在 DPCD 的SYMBOL_ERROR_COUNT_LANEx字节中。链路质量可通过第 2.9.3.6 节中描述的方法进行评估。当下游设备接收 PRBS7 图案或 HBR2 合规性 EYE 图案时它必须统计与对应图案不匹配的比特数PRBS7或符号数HBR2 合规性 EYE 图案。该计数同样存储在 DPCD 的SYMBOL_ERROR_COUNT_LANEx字节中。正常操作下的错误统计任何时候当链路已训练且下游设备未接收符号错误率测量图案、PRBS7 图案或 HBR2 合规性 EYE 图案时下游设备必须在收到无效的 8b/10b 符号时递增SYMBOL_ERROR_COUNT_LANEx计数器。TRAINING_PATTERN_SET寄存器的bits 7:6决定统计哪些错误值统计内容00校验错误 非法符号错误01仅校验错误10仅非法符号错误11保留2.9.3.6 Link Quality Test Support2.9.3.6.2 Symbol Error Rate Measurement Pattern测试图案说明该测试图案由重复的数据 00h在 ANSI 8B/10B 编码之前组成这些数据由发射器进行加扰处理。有关加扰多项式的详细信息请参阅第 10 节。DP 源设备必须周期性地每213或8192个符号传输一个单流传输 BS 符号序列。PHY 层必须将每512个 BS 符号序列中的一个替换为 SR 符号序列以重置加扰器。在传输符号错误率测量图案期间VB-ID/Mvid/Maud 值以及其他数据符号都必须设置为 00h。接收器行为当 DP 接收器Sink被告知正在传输此测试图案时它必须开始增加 SYMBOL_ERROR_COUNT_LANEx 计数器的值每次它解扰后的数据值不是 00h时计数器就增加一次。测量流程DP 源设备必须在一段时间后读取 SYMBOL_ERROR_COUNT_LANEx 寄存器的值。然后使用读取到的值和经过的时间计算近似的符号错误率。测量时间建议传输 10 亿1E9个链路符号大约需要 10 秒。因此建议发射器在读取接收器的符号错误计数之前等待 10 到 100 秒。符号错误率计算公式在不同速率下的计算公式结果单位为 10⁻⁹链路速率公式说明5.4 Gbps(HBR2)SER Error_Count / (0.54 × 测量秒数)分母系数 0.542.7 Gbps(HBR)SER Error_Count / (0.27 × 测量秒数)分母系数 0.271.62 Gbps(RBR)SER Error_Count / (0.162 × 测量秒数)分母系数 0.162脚本工具2lane脚本#!/bin/sh # Error_Count / (0.27 * Measurement Period in second) # Transmitting 1E9 link symbols takes roughly 10 seconds. Therefore, the transmitter is recommended to wait # for 10 to 100 seconds before reading the Symbol Error count from a receiver. # # 配置参数 # MEASURE_TIME${1:-50} LINK_RATE2.7 case $LINK_RATE in 5.4) COEFF0.54 RATE_NAMEHBR2 (5.4 Gbps) ;; 2.7) COEFF0.27 RATE_NAMEHBR (2.7 Gbps) ;; 1.62) COEFF0.162 RATE_NAMERBR (1.62 Gbps) ;; *) echo 错误: 未知链路速率 $LINK_RATE echo 支持: 5.4, 2.7, 1.62 exit 1 ;; esac chmod 777 ./dpcd_reg CMD./dpcd_reg # # 步骤1清空计数器 # echo echo DP 符号错误率测量 echo echo 速率: $RATE_NAME echo 测量时间: ${MEASURE_TIME} 秒 echo 公式: SER Error_Count / (${COEFF} × ${MEASURE_TIME}) echo echo echo 步骤1: 清空错误计数器... $CMD --offset210 read /dev/null $CMD --offset211 read /dev/null $CMD --offset212 read /dev/null $CMD --offset213 read /dev/null echo ✅ 计数器已清零 echo # # 步骤2等待测量周期 # echo 步骤2: 测量周期 ${MEASURE_TIME} 秒... echo (传输 1E9 个符号 ≈ 10 秒) sleep $MEASURE_TIME echo # # 步骤3读取 Lane 0 # echo echo Lane 0 echo err_l$($CMD --offset210 read) err_h$($CMD --offset211 read) err_l_val$(echo $err_l | awk -F : {print $2} | sed s/[[:space:]]//g) err_h_val$(echo $err_h | awk -F : {print $2} | sed s/[[:space:]]//g) # 十六进制转十进制dash 兼容 val_l$(printf %d 0x$err_l_val 2/dev/null) val_h$(printf %d 0x$err_h_val 2/dev/null) # 提取 valid 标志bit7 valid$(( (val_h 7) 1 )) # 合成错误计数高7位 低8位 err_count$(( ((val_h 0x7F) 8) | val_l )) echo 寄存器: 0x0211$err_h_val, 0x0210$err_l_val if [ $valid -eq 1 ]; then echo 有效标志: ✅ 有效 else echo 有效标志: ❌ 无效 fi echo 错误计数: $err_count (0x$(printf %04X $err_count)) if [ $valid -eq 0 ]; then echo 状态: ⚠️ 错误计数无效 lane0_serN/A elif [ $err_count -eq 32767 ]; then echo 状态: ⚠️ 计数器饱和(≥32767) lane0_ser$(echo scale2; 32767 / ($COEFF * $MEASURE_TIME) | bc 2/dev/null) lane0_ser≥ $lane0_ser echo SER: ${lane0_ser} × 10⁻⁹ elif [ $err_count -eq 0 ]; then echo 状态: ✅ 无符号错误 lane0_ser0 echo SER: 0 × 10⁻⁹ else echo 状态: 有错误 lane0_ser$(echo scale2; $err_count / ($COEFF * $MEASURE_TIME) | bc 2/dev/null) ser_actual$(echo scale10; $lane0_ser / 1000000000 | bc 2/dev/null) echo SER: ${lane0_ser} × 10⁻⁹ (${ser_actual}) fi echo # # 步骤4读取 Lane 1 # echo echo Lane 1 echo err_l$($CMD --offset212 read) err_h$($CMD --offset213 read) err_l_val$(echo $err_l | awk -F : {print $2} | sed s/[[:space:]]//g) err_h_val$(echo $err_h | awk -F : {print $2} | sed s/[[:space:]]//g) val_l$(printf %d 0x$err_l_val 2/dev/null) val_h$(printf %d 0x$err_h_val 2/dev/null) valid$(( (val_h 7) 1 )) err_count$(( ((val_h 0x7F) 8) | val_l )) echo 寄存器: 0x0213$err_h_val, 0x0212$err_l_val if [ $valid -eq 1 ]; then echo 有效标志: ✅ 有效 else echo 有效标志: ❌ 无效 fi echo 错误计数: $err_count (0x$(printf %04X $err_count)) if [ $valid -eq 0 ]; then echo 状态: ⚠️ 错误计数无效 lane1_serN/A elif [ $err_count -eq 32767 ]; then echo 状态: ⚠️ 计数器饱和(≥32767) lane1_ser$(echo scale2; 32767 / ($COEFF * $MEASURE_TIME) | bc 2/dev/null) lane1_ser≥ $lane1_ser echo SER: ${lane1_ser} × 10⁻⁹ elif [ $err_count -eq 0 ]; then echo 状态: ✅ 无符号错误 lane1_ser0 echo SER: 0 × 10⁻⁹ else echo 状态: 有错误 lane1_ser$(echo scale2; $err_count / ($COEFF * $MEASURE_TIME) | bc 2/dev/null) ser_actual$(echo scale10; $lane1_ser / 1000000000 | bc 2/dev/null) echo SER: ${lane1_ser} × 10⁻⁹ (${ser_actual}) fi echo # # 步骤5汇总 # echo echo 测量汇总 echo echo Lane 0 SER: ${lane0_ser} × 10⁻⁹ echo Lane 1 SER: ${lane1_ser} × 10⁻⁹ echo 4lane 脚本#!/bin/sh # Error_Count / (0.27 * Measurement Period in second) # Transmitting 1E9 link symbols takes roughly 10 seconds. Therefore, the transmitter is recommended to wait # for 10 to 100 seconds before reading the Symbol Error count from a receiver. # # 配置参数 # MEASURE_TIME${1:-10} LINK_RATE2.7 case $LINK_RATE in 5.4) COEFF0.54 RATE_NAMEHBR2 (5.4 Gbps) ;; 2.7) COEFF0.27 RATE_NAMEHBR (2.7 Gbps) ;; 1.62) COEFF0.162 RATE_NAMERBR (1.62 Gbps) ;; *) echo 错误: 未知链路速率 $LINK_RATE echo 支持: 5.4, 2.7, 1.62 exit 1 ;; esac chmod 777 ./dpcd_reg CMD./dpcd_reg # # 函数读取并打印 Lane 结果 # print_lane_result() { lane_name$1 addr_l$2 addr_h$3 err_l$($CMD --offset$addr_l read) err_h$($CMD --offset$addr_h read) err_l_val$(echo $err_l | awk -F : {print $2} | sed s/[[:space:]]//g) err_h_val$(echo $err_h | awk -F : {print $2} | sed s/[[:space:]]//g) val_l$(printf %d 0x$err_l_val 2/dev/null) val_h$(printf %d 0x$err_h_val 2/dev/null) valid$(( (val_h 7) 1 )) err_count$(( ((val_h 0x7F) 8) | val_l )) printf 寄存器: 0x%04X%s, 0x%04X%s\n $addr_h $err_h_val $addr_l $err_l_val if [ $valid -eq 1 ]; then echo 有效标志: ✅ 有效 else echo 有效标志: ❌ 无效 fi printf 错误计数: %d (0x%04X)\n $err_count $err_count if [ $valid -eq 0 ]; then echo 状态: ⚠️ 错误计数无效 eval ${lane_name}_SERN/A elif [ $err_count -eq 32767 ]; then echo 状态: ⚠️ 计数器饱和(≥32767) ser$(echo scale2; 32767 / ($COEFF * $MEASURE_TIME) | bc 2/dev/null) eval ${lane_name}_SER\≥ $ser\ echo SER: ≥ ${ser} × 10⁻⁹ elif [ $err_count -eq 0 ]; then echo 状态: ✅ 无符号错误 eval ${lane_name}_SER0 echo SER: 0 × 10⁻⁹ else echo 状态: 有错误 ser$(echo scale2; $err_count / ($COEFF * $MEASURE_TIME) | bc 2/dev/null) ser_actual$(echo scale10; $ser / 1000000000 | bc 2/dev/null) eval ${lane_name}_SER\$ser\ echo SER: ${ser} × 10⁻⁹ (${ser_actual}) fi echo } # # 步骤1清空计数器 # echo echo DP 符号错误率测量 echo echo 速率: $RATE_NAME echo 测量时间: ${MEASURE_TIME} 秒 echo 公式: SER Error_Count / (${COEFF} × ${MEASURE_TIME}) echo echo echo 步骤1: 清空错误计数器... $CMD --offset0x210 read /dev/null $CMD --offset0x211 read /dev/null $CMD --offset0x212 read /dev/null $CMD --offset0x213 read /dev/null $CMD --offset0x214 read /dev/null $CMD --offset0x215 read /dev/null $CMD --offset0x216 read /dev/null $CMD --offset0x217 read /dev/null echo ✅ 计数器已清零 echo # # 步骤2等待测量周期 # echo 步骤2: 测量周期 ${MEASURE_TIME} 秒... echo (传输 1E9 个符号 ≈ 10 秒) sleep $MEASURE_TIME echo # # 步骤3读取 4 条 Lane # echo echo Lane 0 echo print_lane_result LANE0 0x210 0x211 echo echo Lane 1 echo print_lane_result LANE1 0x212 0x213 echo echo Lane 2 echo print_lane_result LANE2 0x214 0x215 echo echo Lane 3 echo print_lane_result LANE3 0x216 0x217 # # 步骤4汇总 # echo echo 测量汇总 echo echo Lane 0 SER: ${LANE0_SER} × 10⁻⁹ echo Lane 1 SER: ${LANE1_SER} × 10⁻⁹ echo Lane 2 SER: ${LANE2_SER} × 10⁻⁹ echo Lane 3 SER: ${LANE3_SER} × 10⁻⁹ echo 总结1 设置SINK 的DPCD PATTERN就可以使得source发送对应的pattern2 多少error rate合适AI给的结果如果你的测量结果不是0可以参考以下标准来判断问题的严重程度✅ 目标值 (0)理想情况下错误计数应为0代表链路传输完美无误。✅ 优秀 ( 1)符号错误率(SER)小于1 × 10⁻⁹属于非常好的链路质量。⚠️ 可接受 ( 10)SER小于10 × 10⁻⁹链路质量尚可但建议留意。答案应该是看你的产品要求。如果你的场景是DP线缆生产测试可能要求0 错误如果是系统级信号完整性测试SER 10⁻⁹ 就算通过如果是抗干扰/压力测试可能允许更高的值根据前期的经验只要非零屏幕显示异常的概率就很高。这是在正常未加具体pattern的环境中。加入pattern的实际效果待验证。参考规范\DP协议\DP v1.2a.pdf
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进