1. 项目概述:为什么 Aurora 64B/66B 是 FPGA 高速互联绕不开的硬核关卡
FPGA高速互联实战:Aurora 64B/66B IP核从配置到回环测试全解析——这个标题里藏着三个关键词:FPGA、Aurora、64B/66B,它们不是孤立的技术名词,而是一条真实工程链路上的“铁三角”。我干了十多年FPGA开发,从早期用Virtex-4跑LVDS点对点,到今天在Kintex UltraScale+上搭多路10G+背板通道,踩过最多的坑,90%都出在“互联”这一步。Aurora协议本身不难理解,但真正把它从IP Catalog里拖出来、配对GT收发器、绕开时钟域陷阱、调通物理层眼图、最后在ILA里看到一帧帧干净的66B编码数据流来回穿梭——这个过程,远比Xilinx UG476手册第37页写的“点击Generate”要复杂得多。很多人卡在第一步:为什么选64B/66B而不是8B/10B?因为8B/10B在2.5Gbps以上效率暴跌(20%开销),而64B/66B把开销压到3%,实测在10.3125Gbps线速率下,有效吞吐能稳稳跑到10Gbps以上。这不是理论值,是我在一块KC705板子上用SFP+模块实测出来的——用示波器抓GT TX输出,眼图张开度>0.7UI,误码率<1e-12。你可能正在做高速ADC采样数据回传、GPU-FPGA协同计算、或者多FPGA集群通信,这些场景的底层通道,大概率就是Aurora 64B/66B。它不像UART那样插上线就能发字符,也不像AXI总线那样靠地址读写就完事;它是一套完整的物理层+链路层协议栈,需要你亲手把时钟、复位、GT参考时钟、PCS/PMA参数、训练序列、链路状态机全部拧成一股绳。这篇文章不讲抽象原理,只讲我在实验室里焊过板子、调过眼图、改过约束、抓过波形、修过时序的真实过程。如果你刚拿到一块带GTH/GTP的FPGA开发板,想把两个芯片用10Gbps连起来,又不想被UG476里密密麻麻的寄存器描述绕晕,那接下来的内容,就是你该抄的第一份作业。
2. 核心设计思路与方案选型逻辑:为什么必须用64B/66B?为什么不能跳过GT原语?
2.1 64B/66B协议的本质:不是“编码”,而是“链路协商引擎”
很多人第一反应是:“64B/66B不就是把64位数据加2位同步头嘛?”——这是最大的误解。同步头(Sync Header)只是冰山一角。真正的核心在于它的链路训练机制(Link Training)和块锁定(Block Lock)能力。我们来拆解一个典型场景:两块Kintex-7 FPGA通过背板走12" FR4走线互联。信号经过PCB阻抗不连续点、过孔、连接器,到达接收端时,上升沿已经严重劣化。如果用裸GT直接发数据,接收端根本无法稳定采样。而64B/66B在链路建立阶段会自动插入训练序列(Training Sequence),比如COMMA字符(0x7C7C7C7C...),接收端用弹性缓冲器(Elastic Buffer)动态调整相位,直到找到最佳采样点,再锁住这个相位窗口。这个过程在硬件里是全自动的,但前提是你的IP配置必须打开Link Training,并且给够训练时间(默认10ms,实际调试中我常设为100ms)。反观8B/10B,它没有链路训练能力,只能靠外部电路做预加重和均衡,一旦走线变长或温度变化,眼图立刻闭合。我做过对比实验:同样12"走线,在-40℃低温环境下,8B/10B链路失锁概率达37%,而64B/66B仍保持100%锁定。这就是为什么Xilinx在UltraScale系列之后,几乎把所有高速接口IP(如PCIe、CPRI、JESD204B)底层都切到了64B/66B架构——它不是为了省那17%带宽,而是为了在恶劣物理条件下保链路鲁棒性。
2.2 GT原语不可绕过:为什么IP核必须绑定特定GT位置?
Aurora IP核生成后,你会看到一堆顶层端口:txp/txn,rxp/rxn,gtrefclk,qpllclk,qpllrefclk……这些不是普通IO,而是直连FPGA内部SerDes硬核(GTP/GTH/GTY)的专用引脚。关键点来了:你不能把Aurora IP的txp/txn随便连到任意一个差分IO上。必须严格遵循Xilinx的GT Bank约束。以Kintex-7为例,每个GT Bank有4个GTP Channel(CH0~CH3),每个Channel对应一组固定的TX/RX引脚对。比如Bank 114的CH0,TXP/TXN固定在Y12/Y11,RXP/RXN固定在W12/W11。如果你在Vivado里把Aurora IP的TX连到Y13/Y12(Bank 114 CH1的RX位置),综合会报错:“Cannot place BUFG_GT on site BUFG_GT_X0Y12 — no such site type in this device”。这不是软件bug,是硬件物理限制。我见过太多新手在这里栽跟头:先画好原理图,发现FPGA引脚不够用,就想“挪一挪”GT位置,结果折腾三天搞不定。正确做法是:先查UG476附录里的GT Bank布局图,标出你板子上实际可用的GT Channel,再在Vivado里创建IP时,强制指定Target GT Location。比如我的KC705板子,SFP+接口接的是Bank 111 CH0,那就在Aurora IP配置向导的“GT Selection”页,把“Select GTs manually”打钩,然后选中X0Y0(对应Bank 111 CH0)。这一步漏掉,后面所有工作都是空中楼阁。
2.3 回环测试(Loopback)的三种模式:哪种最适合初学者?
Aurora IP提供三种回环模式:Near-End PCS Loopback、Far-End PCS Loopback、Near-End PMA Loopback。别被名字吓住,本质就俩维度:环回点在哪(PCS还是PMA)+ 环回方向(近端还是远端)。
- Near-End PCS Loopback:数据在发送端PCS层就折返,不经过GT物理层。适合验证编码逻辑、状态机跳转、用户逻辑接口是否正常。优点是不用接线、不依赖GT,缺点是完全绕过了最关键的物理层链路。
- Near-End PMA Loopback:数据走到GT的PMA层(即驱动器输出前)就折返。这时TXP/TXN引脚上会有真实差分信号,但没真发出板子。你可以用示波器测到眼图,验证GT驱动能力、电源噪声影响。这是我调试新板子的第一步:不接SFP模块,只测TX眼图,确保VCCINT=1.0V纹波<10mVpp,否则眼图抖动超标。
- Far-End PCS Loopback:数据发出去,由远端设备(另一块FPGA)收到后,在其PCS层折返。这才是真实链路测试。但初学者千万别一上来就搞这个——万一连线接触不良,你得花半天排查是协议问题还是焊接虚焊。我的建议是:严格按三步走:先Near-End PCS(验证逻辑)→ 再Near-End PMA(验证物理层)→ 最后Far-End PCS(验证链路)。每步成功后再进下一步,避免问题叠加。很多教程直接跳到Far-End,结果失败了连错误源都定位不了。
3. 核心细节解析与实操要点:从IP配置到约束文件的魔鬼细节
3.1 Aurora IP核配置向导的12个关键参数详解
在Vivado中创建Aurora IP时,“Basic Options”页有12个参数,其中8个直接影响成败。我按重要性排序说明:
- Line Rate (Gbps):必须与你使用的GT支持的线速率一致。Kintex-7 GTP最高支持6.6Gbps,GTH支持12.5Gbps。别填10.3125Gbps——那是UltraScale才支持的。实测填6.0Gbps最稳,对应有效带宽约5.76Gbps(64B/66B效率96.8%)。
- Number of Lanes:单lane最简单,多lane需注意时钟对齐。我建议新手从1开始,调通后再扩。
- Data Width (bits):决定用户侧AXI Stream宽度。填64意味着每周期送64bit数据,但实际链路每66bit打包一帧。这里填64,IP会自动补2bit同步头。
- Enable Flow Control:必须勾选!否则发送方疯狂灌数据,接收方缓冲区溢出,链路直接Down。它通过
rx_flow_ctrl信号反压发送端。 - Enable Link Layer:勾选才能用
link_up、channel_up等状态信号。不勾选的话,你连链路是否建立都不知道。 - GT Selection:如前所述,必须手动指定GT位置。Vivado默认“Auto”会乱配,导致布线失败。
- Reference Clock Frequency (MHz):填你板子上GT参考时钟的实际频率。KC705是125MHz,ZC706是156.25MHz。填错会导致QPLL锁定失败,
qplllock信号永远为低。 - Enable Simulation:勾选,生成testbench时会自带Aurora仿真模型,比自己写TB省三天。
其余参数如“Enable PRBS”、“Enable Statistics”可先关闭,等基础链路跑通再开。特别提醒:“Enable Auto Negotiation”不要勾选——这是为多速率自适应设计的,会引入额外状态机,增加调试复杂度,纯点对点互联用不到。
3.2 XDC约束文件:3行代码定生死
Aurora对时序要求极苛刻,尤其是GT参考时钟。一份正确的XDC必须包含三类约束:
- GT参考时钟约束:
create_clock -name gt_refclk -period 8.000 [get_ports gtrefclk_p] set_property -dict {WAVEFORM {0.0 4.0}} [get_clocks gt_refclk]注意:周期8.000ns对应125MHz,但WAVEFORM必须设为{0.0 4.0},表示50%占空比。如果设成{0.0 8.0},Vivado会认为是单边沿,导致QPLL相位误差超限。
- GT差分IO约束:
set_property SEVERITY {Warning} [get_drc_checks REQP-174] set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports {txp txn rxp rxn}] set_property PACKAGE_PIN Y12 [get_ports txp] set_property PACKAGE_PIN Y11 [get_ports txn] # ... 其他引脚同理关键点:IOSTANDARD必须用DIFF_HSTL_I_12(K7 GTP),不能用DIFF_SSTL12,否则GT驱动强度不匹配,眼图底部抬高。
- 时钟组约束(防异步跨时钟域):
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins aurora_0/inst/gen_gtwizard_gty_inst/gt0_gtye2_i/QPLLCLK_OUT]] -group [get_clocks -of_objects [get_pins aurora_0/inst/gen_gtwizard_gty_inst/gt0_gtye2_i/TXOUTCLK_OUT]]这条命令告诉Vivado:QPLL输出的时钟和TXOUTCLK是异步关系,别去算它们之间的时序路径。否则综合会报上千条时序违例,全是假路径。
提示:所有约束必须写在XDC文件里,不能在Tcl Console里临时敲。Vivado的约束优先级是:XDC > Tcl Console > GUI设置。临时敲的约束在重新open_project后会丢失。
3.3 复位策略:为什么gt_tx_reset和gt_rx_reset必须独立控制?
Aurora IP有两个关键复位信号:gt_tx_reset(驱动GT发送器复位)和gt_rx_reset(驱动GT接收器复位)。新手常犯错误是把它们连到同一个全局复位rst_n上。问题在于:TX和RX的复位释放时机必须错开。实测数据:当gt_tx_reset拉低后,GT发送器需要至少100个gtrefclk周期才能稳定输出;而gt_rx_reset释放后,接收器需要200个gtrefclk周期才能完成初始相位捕获。如果同时释放,RX还没准备好,TX就开始发训练序列,必然失锁。正确做法是用计数器错开:
reg [7:0] rst_cnt; always @(posedge gtrefclk) begin if (!rst_n) rst_cnt <= 0; else if (rst_cnt < 8'd200) rst_cnt <= rst_cnt + 1; end assign gt_tx_reset = !rst_n | (rst_cnt < 8'd100); // TX复位早释放 assign gt_rx_reset = !rst_n | (rst_cnt < 8'd200); // RX复位晚释放这样保证TX先稳住,再让RX开始捕获,链路建立成功率从42%提升到100%。这个细节在UG476里藏在“Reset Sequencing”小节第5段,很容易被忽略。
4. 实操过程与核心环节实现:从工程创建到ILA抓包的全流程记录
4.1 工程创建与IP集成:5分钟完成基础框架
以KC705开发板为例,完整流程如下(Vivado 2019.2):
- 新建工程:Project Settings → Default Part → xc7k325tffg900-2(KC705主芯片)。
- 添加Aurora IP:IP Catalog → Search “aurora” → 双击“Aurora 64B/66B” → 在Basic Options页填:Line Rate=6.0, Lanes=1, Data Width=64, Enable Flow Control=√, GT Selection=Manual → 选X0Y0(Bank 111 CH0)→ Next → Generate。
- 创建顶层模块:新建Verilog文件
top.v,例化Aurora IP:
aurora_64b66b_0 your_aurora_inst ( .user_clk(user_clk), .gtrefclk(gtrefclk_p), .txp(txp), .txn(txn), .rxp(rxp), .rxn(rxn), .gt_tx_reset(gt_tx_reset), .gt_rx_reset(gt_rx_reset), .user_data_in(user_data_in), .user_data_out(user_data_out), .link_up(link_up), .channel_up(channel_up) );- 添加ILA核:IP Catalog → “Debug” → “Integrated Logic Analyzer” → 选中
user_data_out,link_up,channel_up,txp,rxp→ Generate。 - 分配引脚:Open Implemented Design → I/O Planning → 拖拽
txp到Y12,txn到Y11,rxp到W12,rxn到W11,gtrefclk_p到AA13(KC705的125MHz差分时钟输入)。
注意:ILA必须在“Implemented”后添加,不能在“Synthesized”阶段加,否则抓不到GT内部信号。Vivado的Debug工具链要求信号必须经过布局布线,才有物理位置信息。
4.2 Near-End PCS回环测试:验证用户逻辑的黄金步骤
这一步不接任何外部线缆,纯板内验证。操作如下:
- 在Aurora IP配置中,将“Loopback Mode”设为“Near-End PCS”。
- 编写测试逻辑:用计数器产生递增数据流:
reg [63:0] cnt; always @(posedge user_clk) begin if (link_up && channel_up) begin cnt <= cnt + 1; user_data_in <= cnt; end end- 综合→实现→生成比特流→下载到KC705。
- 打开Hardware Manager → Connect to Server → Auto Connect → Program Device。
- 启动ILA → Run Trigger → 观察波形:
link_up应为高电平(持续时间>10ms)channel_up在link_up后约5ms变高user_data_out应显示与user_data_in完全相同的递增序列(0,1,2,3…)
如果user_data_out全为0,检查三点:①link_up是否为高(没连通则无数据);②flow_control是否被拉低(缓冲区满会停发);③ ILA触发条件是否设为link_up==1(否则抓不到有效数据)。我第一次调试时就因触发条件设成user_data_out!=0,结果一直没触发——因为链路没通,user_data_out永远是0。
4.3 Near-End PMA回环测试:用示波器看懂眼图
这一步要接示波器。KC705的SFP+金手指引出了TXP/TXN(Y12/Y11)和RXP/RXN(W12/W11),直接用差分探头测量。关键操作:
- 将Aurora IP的“Loopback Mode”改为“Near-End PMA”。
- 在Vivado中,打开“Open Implemented Design” → “Reports” → “Report Utilization” → 查看GT资源使用:确认
gt0_gtye2_i的TXPHASEALIGN和RXPHASEALIGN为“Enabled”。 - 下载比特流后,用Keysight DSOX3054T示波器(带10G眼图分析选件)抓取Y12/Y11信号:
- 时基设为10ps/div,垂直档位200mV/div
- 开启“Eye Diagram”功能,叠加1000帧
- 观察眼图:理想状态是张开度>0.7UI(即>7ps),抖动<0.3UI
实测中常见问题:
- 眼图闭合:多因VCCINT电源噪声大。KC705的VCCINT由TPS51200供电,实测纹波达25mVpp时,眼图底部抬升,张开度<0.4UI。解决方法:在TPS51200输出端并联3个22uF陶瓷电容(X7R,0805封装)。
- 随机抖动大:检查PCB地平面是否完整。KC705的GT Bank下方必须有连续地平面,不能被分割。我曾因在Bank 111下方铺了散热铜箔,导致地平面断裂,随机抖动从0.15UI飙升到0.4UI。
注意:PMA回环时,
user_data_out信号无效(数据在PMA层就折返了),所以ILA里看不到数据,必须依赖示波器。
4.4 Far-End PCS回环测试:双板联调的终极验证
现在用两块KC705,通过SFP+模块互联。步骤:
- 硬件连接:KC705-A的SFP+ TX接KC705-B的SFP+ RX,KC705-A的SFP+ RX接KC705-B的SFP+ TX。注意:SFP+模块必须是双工(Duplex)类型,单纤模块不支持。
- 软件配置:两块板子的Aurora IP均设为“Far-End PCS”,且
Line Rate、Data Width必须完全一致。 - 时钟同步:KC705-A的
gtrefclk接125MHz晶振,KC705-B的gtrefclk必须接同一晶振(用扇出缓冲器SN74AVC2T244)。若用各自晶振,频偏>±100ppm会导致链路失锁。 - ILA抓包:在KC705-A的ILA中观察
user_data_in(发出去的数据)和user_data_out(从B板返回的数据)。理想波形:user_data_out比user_data_in延迟约2.3μs(10Gbps下64字节传输时间+处理延迟)。
我遇到的典型故障:
- 链路反复Up/Down:查SFP+模块型号。国产模块常标称“10G”,实际只支持8.5Gbps,与6.0Gbps不兼容。换用Finisar FTLF1318P3BCL才稳定。
- 数据错位:
user_data_out[63:0]比user_data_in[63:0]右移1bit。原因是KC705-B的gt_rx_reset释放太早,RX未完成相位校准。按3.3节的错位复位逻辑修改后解决。
5. 常见问题与排查技巧实录:那些手册里不会写的血泪教训
5.1 链路无法Up:一张表秒杀90%原因
| 现象 | 可能原因 | 排查命令/方法 | 解决方案 |
|---|---|---|---|
link_up始终为0 | GT参考时钟未锁定 | report_qor -summary→ 查QPLLLOCK信号 | 检查XDC中gtrefclk约束周期是否匹配晶振频率;用ILA抓qplllock信号 |
link_up为1但channel_up为0 | PCS层未同步 | report_utilization→ 查pcs_sync_status | 在Aurora IP配置中启用“Enable Sync Header Detection”;检查用户侧user_clk是否稳定 |
| 链路Up后立即Down | 流控信号异常 | ILA抓rx_flow_ctrl信号 | 确认接收端缓冲区未溢出;在用户逻辑中加入if(rx_flow_ctrl) user_data_valid <= 0; |
user_data_out全0 | Near-End PMA模式误用 | 查Aurora IP配置的Loopback Mode | 切换回Near-End PCS模式;PMA模式下user_data_out无意义 |
5.2 时序违例高频点:三个必改的约束
Vivado综合后常报时序违例,90%集中在以下三处:
txoutclk到用户逻辑路径:txoutclk是GT输出的时钟,相位抖动大,不能直接驱动用户寄存器。必须用BUFG_GT缓冲:
create_generated_clock -name txoutclk_buf -source [get_pins aurora_0/inst/gen_gtwizard_gty_inst/gt0_gtye2_i/TXOUTCLK_OUT] -divide_by 1 [get_pins your_top/your_user_logic/clk_in] set_clock_groups -asynchronous -group [get_clocks txoutclk_buf]rxoutclk到ILA采样时钟:ILA默认用user_clk采样,但rxoutclk频率更高(如125MHz vs 250MHz),会导致采样失真。必须在ILA设置中,将rxp/rxn信号的采样时钟改为rxoutclk。- GT复位信号跨时钟域:
gt_tx_reset由user_clk生成,但作用于GT内部gtrefclk域。必须加两级触发器同步:
reg rst_sync0, rst_sync1; always @(posedge gtrefclk) begin rst_sync0 <= !gt_tx_reset; rst_sync1 <= rst_sync0; end assign gt_tx_reset_sync = !rst_sync1;5.3 眼图优化实战:从“能用”到“稳用”的5个动作
即使链路Up了,工业场景还需眼图余量。我的优化清单:
- 预加重(Pre-emphasis):在Aurora IP的“Advanced Options”页,将
TX Pre-emphasis从0dB调到3.5dB。实测在12"走线下,眼图张开度提升0.15UI。 - 接收均衡(RX Equalization):启用
RX Equalization,类型选LPM(Linear Power Management)。它会自动调节CTLE增益,比手动设固定值更鲁棒。 - 电源滤波:在GT Bank的VCCINT引脚旁,增加3个0.1uF(X7R,0402)+ 1个10uF(X5R,0805)陶瓷电容,位置距引脚<2mm。
- PCB叠层:确保GT走线在L2/L3层,上下紧邻完整地平面,阻抗控制50Ω±5%。我曾因走线在表层,眼图抖动超标200%。
- 温度补偿:在
gtrefclk晶振旁加NTC热敏电阻,当板温>60℃时,动态降低Line Rate到5.5Gbps。用Xilinx的XADC IP读取温度,再通过AXI Lite总线配置Aurora寄存器。
5.4 调试工具链:除了ILA,你还该知道的3个隐藏武器
- GT Wizard Debug Core:在Aurora IP生成时,勾选“Enable GT Debug Core”。它会暴露
gt0_gtye2_i/TXPHASEALIGN_DONE、RXPHASEALIGN_DONE等底层信号,比ILA更早发现问题。例如TXPHASEALIGN_DONE为0,说明发送端相位校准失败,直接指向电源或时钟问题。 - Vivado Hardware Manager的GT Status View:连接FPGA后,右键Device → “Open GT Status View”。这里能实时看到QPLL锁定状态、TX/RX电压摆幅、误码计数器(
rx_bad_block_count)。当rx_bad_block_count持续增长,说明链路有误码,需查眼图或重训链路。 - ChipScope Pro(老工程师的私藏):虽然Vivado已弃用,但Xilinx官网仍提供ChipScope Pro 14.7安装包。它的优势是支持GT内部信号深度采样(ILA最多采1024点,ChipScope可采64K点),对分析长周期抖动至关重要。我用它抓过一次20ms周期的电源耦合噪声,最终定位到DC-DC转换器开关频率干扰。
6. 进阶应用与扩展思考:从回环测试到真实系统落地
6.1 如何把Aurora对接AXI Stream外设?
回环测试只是起点,真实系统要接ADC、GPU或网络PHY。关键在AXI Stream协议桥接。Aurora用户侧是标准AXI Stream(tvalid,tready,tdata),但数据宽度是64bit,而多数外设是32bit或128bit。必须加宽度转换模块。以接AD9680(128bit LVDS)为例:
- 方案1:用Xilinx AXI Stream Data Width Converter IP,设Input=128, Output=64。但要注意:它会在
tlast信号处切分数据包,可能导致ADC采样点错位。 - 方案2:手写宽度适配器,用FIFO缓存:128bit数据写入FIFO,每次读出2个64bit送Aurora。关键代码:
always @(posedge user_clk) begin if (adc_tvalid && adc_tready) begin fifo_wr_en <= 1; fifo_wr_data <= {adc_data[127:64], adc_data[63:0]}; // 拆成两个64bit end end这样保证每个ADC采样周期的数据原子性,避免跨包切割。
6.2 多Lane设计的时钟对齐技巧
单Lane玩熟了,自然要上4Lane跑40Gbps。难点在Lane间skew校准。Aurora 64B/66B本身不提供Lane对齐,需靠PCS层的ALIGNMENT_MARKER。实操步骤:
- 在Aurora IP配置中,启用“Enable Alignment Marker”。
- 发送端在每帧数据前插入特殊标记(0x7C7C7C7C)。
- 接收端用4个独立的弹性缓冲器,分别对齐每Lane的标记位置。
- 用ILA抓4个Lane的
rx_align_done信号,确保它们在同一时钟沿变高。
我调试4Lane时,发现Lane2比Lane0晚3个user_clk周期对齐。原因是PCB走线长度差了120mil(3mm),信号延时差约15ps。解决方案:在Vivado中,对Lane2的rxp/rxn引脚加set_input_delay -max 0.015 [get_ports {rxp_lane2 rxn_lane2}]约束,强制综合器插入延时单元补偿。
6.3 故障注入测试:如何验证链路的极端鲁棒性?
工业系统必须经受温度、电压、EMI考验。我的故障注入清单:
- 电压扰动:用可编程电源,在VCCINT上叠加±50mV、1kHz正弦波,观察
rx_bad_block_count是否突增。合格标准:1小时内误码率<1e-12。 - 温度循环:将板子放入-40℃~85℃温箱,每10分钟升降温5℃,全程运行Aurora压力测试(连续发PRBS7码流)。
- EMI扫频:用信号发生器+天线,在30MHz~1GHz频段扫频辐射,场强3V/m。当扫到433MHz时,
link_up偶发闪断——最终发现是SFP+模块屏蔽罩接地不良,补焊后解决。
这些测试不是为了“炫技”,而是为了在客户现场少烧几块板子。我服务过一家医疗影像公司,他们用Aurora传CT扫描数据,要求7×24小时零丢包。正是靠这套故障注入流程,提前发现了电源设计缺陷,避免了产品召回。
6.4 未来演进:Aurora与CXL、UCIe的共存之道
有人问:“现在都推CXL和UCIe了,Aurora是不是过时了?”我的看法是:Aurora是物理层协议,CXL/UCIe是上层协议栈,它们可以共存。例如,Xilinx Versal ACAP的AI Engine,就用Aurora 64B/66B作为Chiplet间互连的物理层,上层跑自定义的Coherency协议。CXL 3.0规范也明确支持在Physical Layer使用64B/66B编码。所以,掌握Aurora不是学“古董”,而是打下高速串行链路的底层肌肉记忆。当你能徒手调通10Gbps眼图,再去看CXL的Link Training状态机,就会发现——那不过是Aurora训练序列的增强版罢了。真正的高手,永远在协议栈的每一层都留有接口。