:Chip2Chip Aurora PHY配置實(shí)戰(zhàn))
前陣子調(diào)一塊板卡兩塊FPGA之間要傳一路視頻流再帶一路寄存器讀寫(xiě)控制加起來(lái)大概3.2Gbps。一開(kāi)始想走LVDS并行總線(xiàn)算了下差分對(duì)要三十多對(duì)PCB布線(xiàn)直接頭大換PCIe的話(huà)又覺(jué)得殺雞用牛刀光是枚舉和驅(qū)動(dòng)就夠折騰。后來(lái)在Vivado的IP Catalog里翻到Chip2Chip這個(gè)核才意識(shí)到這就是干這活的合適人選。從配置到仿真再到上板前后花了一周鏈路終于穩(wěn)定跑起來(lái)。這篇文章就把Chip2Chip IP核基于Aurora PHY的通信配置過(guò)程、仿真驗(yàn)證方法和我踩過(guò)的坑完整記下來(lái)給準(zhǔn)備用高速串行鏈路做板間互聯(lián)的朋友一個(gè)參考。1. 為什么需要Chip2Chip高速板間互聯(lián)方案怎么選1.1 LVDS、PCIe、Aurora和Chip2Chip的定位區(qū)別板間高速互聯(lián)的常規(guī)選擇無(wú)非這么幾種并行LVDS、PCIe、Aurora協(xié)議以及這里要重點(diǎn)說(shuō)的Chip2Chip IP核。它們之間不是簡(jiǎn)單的“誰(shuí)替代誰(shuí)”而是適用場(chǎng)景差別很大。方案典型帶寬資源開(kāi)銷(xiāo)復(fù)雜度適用場(chǎng)景LVDS并行總線(xiàn)幾百M(fèi)bps到2Gbps大量IO引腳低短距離、低速率、帶寬要求不高PCIe單通道2.5Gbps起硬核或PCIe IP DMA邏輯高主機(jī)與FPGA、系統(tǒng)級(jí)復(fù)雜互聯(lián)Aurora 8B/10B從1Gbps到10Gbps以上GT Aurora IP 用戶(hù)邏輯中任意兩點(diǎn)間的高速流式傳輸Chip2Chip和Aurora一致GT Chip2Chip IP中低兩塊FPGA之間點(diǎn)對(duì)點(diǎn)數(shù)據(jù)傳輸和寄存器訪問(wèn)PCIe最大的問(wèn)題不是性能而是“重”。一旦用了PCIe就得考慮鏈路訓(xùn)練、BAR空間映射、DMA引擎、驅(qū)動(dòng)適配如果只是兩塊FPGA之間互相傳數(shù)據(jù)這些全是額外負(fù)擔(dān)。而直接用Aurora 8B/10B IP核功能很強(qiáng)但需要自己處理初始化時(shí)序、流控、錯(cuò)誤恢復(fù)等一大堆協(xié)議細(xì)節(jié)對(duì)于只要“把數(shù)據(jù)從A點(diǎn)搬到B點(diǎn)”的場(chǎng)景來(lái)說(shuō)學(xué)習(xí)成本略高。Chip2Chip本質(zhì)上是在Aurora 8B/10B物理層之上包了一層簡(jiǎn)化協(xié)議把很多底層細(xì)節(jié)藏了起來(lái)用戶(hù)看到的基本上是AXI-Stream或AXI接口。它的優(yōu)勢(shì)在于不需要寫(xiě)復(fù)雜的Aurora協(xié)議狀態(tài)機(jī)配置完IP核后直接讀寫(xiě)數(shù)據(jù)即可。同時(shí)它還支持遠(yuǎn)程寄存器訪問(wèn)這對(duì)需要跨板卡讀寫(xiě)控制寄存器的場(chǎng)景特別實(shí)用。1.2 什么場(chǎng)景用Chip2Chip最劃算根據(jù)我的實(shí)際使用體會(huì)以下場(chǎng)景優(yōu)先考慮Chip2Chip兩塊FPGA之間需要穩(wěn)定跑2Gbps以上的數(shù)據(jù)流比如視頻流、高速ADC采樣數(shù)據(jù)、雷達(dá)中頻數(shù)據(jù)。需要跨板卡訪問(wèn)另一端的寄存器或存儲(chǔ)空間希望像訪問(wèn)本地地址一樣操作遠(yuǎn)端。不想自己維護(hù)Aurora協(xié)議的初始化、復(fù)位、錯(cuò)誤處理邏輯。希望鏈路有相對(duì)確定的延遲而非類(lèi)似以太網(wǎng)那樣的不確定性轉(zhuǎn)發(fā)。工程周期緊需要快速把物理層跑通把精力集中在業(yè)務(wù)邏輯上。反過(guò)來(lái)如果需要連接FPGA和主機(jī)CPU或者需要組網(wǎng)能力那還是老老實(shí)實(shí)用PCIe或EthernetChip2Chip只適合點(diǎn)對(duì)點(diǎn)場(chǎng)景這一點(diǎn)必須在方案定型前想清楚。2. 動(dòng)手配置前先算好參數(shù)時(shí)鐘、位寬和GT資源2.1 線(xiàn)速率與GT參考時(shí)鐘頻率的匹配關(guān)系Chip2Chip的物理層是GT收發(fā)器GT內(nèi)部靠QPLL或CPLL將參考時(shí)鐘倍頻到串行線(xiàn)速率。所以線(xiàn)速率和參考時(shí)鐘頻率之間必須滿(mǎn)足一個(gè)倍頻關(guān)系不是隨便組合都能用的。參考時(shí)鐘頻率、線(xiàn)速率和GT內(nèi)部倍頻系數(shù)的關(guān)系可以簡(jiǎn)單理解為線(xiàn)速率 參考時(shí)鐘頻率 × GT倍頻系數(shù)舉個(gè)例子如果線(xiàn)速率選2.5Gbps參考時(shí)鐘用125MHz那么GT倍頻系數(shù)就是20這在GT的合法配置范圍內(nèi)。如果線(xiàn)速率是3.125Gbps參考時(shí)鐘同樣給125MHz倍頻系數(shù)就是25也常見(jiàn)。再比如5Gbps線(xiàn)速率搭配156.25MHz參考時(shí)鐘倍頻系數(shù)是32。配置IP核時(shí)Vivado會(huì)自動(dòng)校驗(yàn)參考時(shí)鐘頻率和線(xiàn)速率是否匹配。如果匹配不上界面會(huì)直接報(bào)錯(cuò)或者在生成時(shí)彈警告。這里最容易踩的坑是自己想當(dāng)然地給一個(gè)參考時(shí)鐘覺(jué)得“FPGA內(nèi)部PLL總能搞定”實(shí)際上GT的PLL是有分頻系數(shù)范圍限制的不同F(xiàn)PGA器件、不同GT類(lèi)型的限制還不一樣。我的建議是先定線(xiàn)速率再查器件手冊(cè)或參考Vivado下拉列表里能選的參考時(shí)鐘頻率不要反推。Vivado的Chip2Chip配置界面里參考時(shí)鐘那欄會(huì)列出該線(xiàn)速率下支持的合法頻率選一個(gè)離自己板卡時(shí)鐘樹(shù)最近的值后面硬件設(shè)計(jì)會(huì)省很多事。2.2 用戶(hù)時(shí)鐘頻率與數(shù)據(jù)位寬怎么算Chip2Chip的用戶(hù)接口支持2字節(jié)和4字節(jié)兩種數(shù)據(jù)位寬用戶(hù)時(shí)鐘頻率直接取決于線(xiàn)速率和位寬計(jì)算公式如下用戶(hù)時(shí)鐘頻率 線(xiàn)速率 / (10 × 數(shù)據(jù)位寬字節(jié)數(shù))這里除以10是因?yàn)锳urora 8B/10B編碼把每字節(jié)擴(kuò)成了10bit傳輸。舉個(gè)例子線(xiàn)速率2.5Gbps、數(shù)據(jù)位寬2字節(jié)用戶(hù)時(shí)鐘 2.5G / (10 × 2) 125MHz。線(xiàn)速率3.125Gbps、數(shù)據(jù)位寬2字節(jié)用戶(hù)時(shí)鐘 3.125G / 20 156.25MHz。線(xiàn)速率6.6Gbps、數(shù)據(jù)位寬4字節(jié)用戶(hù)時(shí)鐘 6.6G / 40 165MHz。這個(gè)結(jié)果一定要在IP配置之前算清楚因?yàn)樗鼪Q定了工程里用戶(hù)邏輯的時(shí)鐘域。實(shí)際項(xiàng)目中很多第一次用Chip2Chip的人會(huì)在這一步犯迷糊尤其是選了4字節(jié)位寬后以為用戶(hù)時(shí)鐘還是和線(xiàn)速率差不多快結(jié)果后面跨時(shí)鐘域處理全亂了。另外要注意雖然數(shù)據(jù)位寬增大后用戶(hù)時(shí)鐘頻率會(huì)降低但GT通道占用數(shù)也會(huì)變化。2字節(jié)位寬對(duì)應(yīng)1個(gè)GT通道4字節(jié)位寬對(duì)應(yīng)2個(gè)GT通道這一點(diǎn)下面細(xì)說(shuō)。2.3 Chip2Chip占用幾個(gè)GT通道BANK怎么放Chip2Chip不像Aurora那樣配置多條lane擴(kuò)展它的通道數(shù)基本由數(shù)據(jù)位寬決定。2字節(jié)位寬單通道即可跑通4字節(jié)位寬需要2條GT通道兩路并行分?jǐn)倲?shù)據(jù)用戶(hù)側(cè)看到的就是更高帶寬的并行接口。通道數(shù)確定后還要考慮GT在FPGA物理位置上的約束。GT收發(fā)器是按Quad組織的每個(gè)Quad包含4個(gè)GT通道。單通道Chip2Chip隨便放雙通道就盡量放在同一個(gè)Quad里這樣QPLL資源可以共用時(shí)序也更容易收斂。如果板卡上有多個(gè)GT參考時(shí)鐘輸入務(wù)必讓Chip2Chip使用的GT通道和參考時(shí)鐘在同一個(gè)Quad或相鄰Quad。有些FPGA里GT參考時(shí)鐘的布線(xiàn)是有限制的跨太遠(yuǎn)會(huì)導(dǎo)致參考時(shí)鐘無(wú)法布線(xiàn)或者在實(shí)現(xiàn)階段出現(xiàn)嚴(yán)重的時(shí)序問(wèn)題。這個(gè)坑在原理圖設(shè)計(jì)階段就要避掉等PCB做回來(lái)再發(fā)現(xiàn)就麻煩了。3. Chip2Chip IP核核心配置實(shí)操3.1 生成主從兩個(gè)IP實(shí)例角色別選錯(cuò)Chip2Chip是成對(duì)使用的IP通信雙方一端為主Primary另一端為從Secondary。配置時(shí)需要在Vivado IP Catalog里搜索chip2chip然后分別生成兩個(gè)IP實(shí)例一個(gè)選Primary一個(gè)選Secondary。這里有個(gè)很容易忽略的細(xì)節(jié)兩個(gè)實(shí)例雖然在配置界面上選項(xiàng)很多但協(xié)議類(lèi)型、線(xiàn)速率、數(shù)據(jù)位寬必須完全一致否則物理層鏈路協(xié)商不起來(lái)。角色不同只影響初始化時(shí)的握手順序和部分控制信號(hào)極性不影響數(shù)據(jù)面格式。接口類(lèi)型按需選擇。典型用法是數(shù)據(jù)通道用AXI4-Stream控制寄存器用AXI4-Lite。如果只想傳流式數(shù)據(jù)AXI4-Stream就夠了配置也最簡(jiǎn)單如果還需要跨板卡讀寫(xiě)寄存器就再加上AXI4-Lite接口。兩個(gè)接口可以同時(shí)存在于一個(gè)Chip2Chip IP核里只是會(huì)多占一些內(nèi)部資源。生成完IP后建議先在IP Sources里打開(kāi)Example Design把它作為學(xué)習(xí)參考。Example Design里包含完整的初始化模塊、時(shí)鐘模塊和收發(fā)數(shù)據(jù)驗(yàn)證模塊比對(duì)著用戶(hù)手冊(cè)硬啃高效得多。我一般習(xí)慣直接基于Example Design改而不是從空工程開(kāi)始。3.2 協(xié)議層選項(xiàng)Aurora 8B/10B PHY、流控和CRCChip2Chip配置界面里物理層協(xié)議可以選擇Aurora 8B/10B PHY或簡(jiǎn)化物理層不使用Aurora協(xié)議。如果只要兩個(gè)Chip2Chip互相通信用哪種都能跑通。但考慮到可觀測(cè)性和通用性我推薦選Aurora 8B/10B PHY原因有三個(gè)鏈路初始化、字節(jié)對(duì)齊、通道綁定這些底層操作由Aurora PHY的狀態(tài)機(jī)管理穩(wěn)定可靠。調(diào)試時(shí)可以直接參考Aurora的lane_up和channel_up信號(hào)判斷物理層狀態(tài)。如果以后需要改成和其他Aurora設(shè)備互通至少物理層是一致的。流控建議根據(jù)業(yè)務(wù)需求決定。如果兩端的數(shù)據(jù)發(fā)送速率是固定的且接收端FIFO深度足夠可以不開(kāi)啟流控簡(jiǎn)化邏輯。如果存在突發(fā)流量建議開(kāi)啟Native Flow Control這樣接收端FIFO快滿(mǎn)時(shí)能通知對(duì)端暫停發(fā)送避免丟數(shù)據(jù)。CRC校驗(yàn)屬于可靠性增強(qiáng)選項(xiàng)。開(kāi)啟后Chip2Chip會(huì)在每個(gè)數(shù)據(jù)包尾部附加校驗(yàn)值接收端檢測(cè)錯(cuò)誤后可以上報(bào)。對(duì)于需要高可靠傳輸?shù)膱?chǎng)景我建議開(kāi)啟代價(jià)是有效帶寬略降但對(duì)于大多數(shù)Gbps級(jí)別的應(yīng)用來(lái)說(shuō)可以接受。3.3 復(fù)位與初始化邏輯千萬(wàn)別填錯(cuò)Chip2Chip的初始化過(guò)程并不是上電后自己就乖乖完成的它需要用戶(hù)側(cè)提供合適的復(fù)位時(shí)序和初始化時(shí)鐘。最核心的幾點(diǎn)channel_init_clk是初始化模塊的工作時(shí)鐘頻率不能太高通常建議50MHz左右。這個(gè)時(shí)鐘要保證在GT復(fù)位期間持續(xù)穩(wěn)定不能等channel_up之后再給。gt_reset信號(hào)必須有效復(fù)位一段時(shí)間后釋放。釋放太早可能導(dǎo)致GT的PLL還沒(méi)完成鎖定后面初始化卡死釋放太晚也不會(huì)有什么問(wèn)題就是浪費(fèi)時(shí)間。gt_txresetdone和gt_rxresetdone兩個(gè)信號(hào)是GT單元給出的復(fù)位完成標(biāo)志Chip2Chip內(nèi)部的Aurora初始化狀態(tài)機(jī)依賴(lài)這兩個(gè)信號(hào)推進(jìn)狀態(tài)。在Example Design里這些信號(hào)都被封裝好了基本不用自己動(dòng)。但如果自己搭工程最容易犯的錯(cuò)就是把channel_init_clk和user_clk接到同一個(gè)時(shí)鐘上。有些用戶(hù)時(shí)鐘頻率很高比如157MHz、165MHz拿來(lái)當(dāng)初始化時(shí)鐘可能會(huì)導(dǎo)致時(shí)序違例使初始化狀態(tài)機(jī)亂跳。穩(wěn)妥做法是單獨(dú)分出一個(gè)50MHz時(shí)鐘給初始化模塊數(shù)據(jù)通路再跑高速用戶(hù)時(shí)鐘。還有一點(diǎn)關(guān)于power_down信號(hào)通常保持低電平即可。如果把GT的power_down意外拉高GT會(huì)進(jìn)入低功耗模式鏈路怎么都練不起來(lái)初始化狀態(tài)機(jī)會(huì)一直卡在等待復(fù)位完成那一步。仿真時(shí)不注意還容易忽略因?yàn)榉抡婺P屠飌ower_down拉高并不一定立刻報(bào)錯(cuò)。4. 仿真搭建與Aurora PHY初始化避坑4.1 用Example Design快速搭一個(gè)雙端仿真工程Chip2Chip的仿真一定要由兩個(gè)IP實(shí)例配合完成一端主、一端從GT發(fā)送端的差分信號(hào)txp/txn接到對(duì)端接收端的rxp/rxn??梢栽陧攲幽K里先實(shí)例化兩個(gè)IP然后把信號(hào)連起來(lái)。最快的起步方式是在生成IP后使用Vivado Tcl命令行打開(kāi)Example Designopen_example_design -ip [get_ips chip2chip_0]Example Design里自帶時(shí)鐘模塊、復(fù)位模塊、數(shù)據(jù)生成和比對(duì)模塊直接跑行為仿真就能看到channel_up拉高的完整時(shí)序。我第一次做的時(shí)候就是先把主從兩端各自Example Design打開(kāi)然后把兩邊的頂層里面與GT相連的差分收發(fā)信號(hào)互相交叉連接再跑仿真。仿真時(shí)間要設(shè)夠。GT的PLL鎖定和復(fù)位完成在仿真模型里會(huì)模擬出真實(shí)硬件的時(shí)間尺度通常需要幾十微秒到幾百微秒。如果仿真時(shí)間只給幾微秒可能還沒(méi)看到channel_up就結(jié)束了。建議至少跑到500微秒等channel_up穩(wěn)定后再做數(shù)據(jù)收發(fā)驗(yàn)證。4.2 初始化時(shí)序里到底發(fā)生了什么Chip2Chip和Aurora PHY的初始化大致分三個(gè)階段PMA初始化GT的模擬部分上電復(fù)位QPLL/CPLL開(kāi)始鎖定gt_txresetdone和gt_rxresetdone依次拉高。lane初始化發(fā)送端開(kāi)始發(fā)送時(shí)鐘對(duì)齊序列接收端通過(guò)8B/10B的comma字符完成字節(jié)對(duì)齊lane_up拉高。channel初始化兩端交換初始化狀態(tài)機(jī)信息完成通道握手最終channel_up拉高用戶(hù)數(shù)據(jù)通路使能。仿真的時(shí)候可以拉出lane_up和channel_up信號(hào)觀察它們抬起的順序。正常情況下lane_up會(huì)先于channel_up。如果只看到lane_up拉高而channel_up一直不拉問(wèn)題多半出在主從兩端參數(shù)不一致或者狀態(tài)機(jī)配置有差異。值得一提的是用戶(hù)接口的復(fù)位信號(hào)通常是低有效復(fù)位也就是說(shuō)axi_resetn在channel_up拉高后才能釋放。如果外部邏輯不管三七二十一先把用戶(hù)邏輯復(fù)位釋放了而此時(shí)鏈路還沒(méi)建立數(shù)據(jù)就會(huì)在發(fā)送端堆積恢復(fù)后可能出現(xiàn)先入先出的對(duì)齊問(wèn)題。工程上建議直接用channel_up信號(hào)作為用戶(hù)邏輯復(fù)位釋放的條件或者至少用它做一次同步。4.3 數(shù)據(jù)回環(huán)驗(yàn)證從發(fā)計(jì)數(shù)器到收計(jì)數(shù)器比對(duì)鏈路初始化通過(guò)后第一件事不是跑業(yè)務(wù)數(shù)據(jù)而是做一個(gè)簡(jiǎn)單的回環(huán)驗(yàn)證。我常用的方法是在發(fā)送端用一個(gè)計(jì)數(shù)器循環(huán)發(fā)送0x0000到0xFFFF的數(shù)據(jù)接收端把收到的數(shù)據(jù)和本地產(chǎn)生的預(yù)期值進(jìn)行比對(duì)一旦不一致就拉高錯(cuò)誤標(biāo)志。在Example Design里自帶的驗(yàn)證模塊已經(jīng)做了類(lèi)似事情可以省不少事。如果想自己寫(xiě)一個(gè)精簡(jiǎn)版核心代碼邏輯大致是這樣// 發(fā)送端16bit計(jì)數(shù)器循環(huán)遞增 always (posedge user_clk) begin if (!tx_ready) tx_data tx_data 1b1; end // 接收端比對(duì)接收數(shù)據(jù)與本地遞增計(jì)數(shù) always (posedge user_clk) begin if (rx_valid) begin if (rx_data ! expected_data) error_flag 1b1; else expected_data expected_data 1b1; end end仿真時(shí)不要只比對(duì)一兩個(gè)包建議連續(xù)跑幾萬(wàn)個(gè)數(shù)據(jù)。如果鏈路存在偶發(fā)誤碼或者初始化過(guò)程復(fù)位不干凈短時(shí)間內(nèi)不一定暴露問(wèn)題但長(zhǎng)時(shí)間數(shù)據(jù)比對(duì)能大概率發(fā)現(xiàn)。數(shù)據(jù)驗(yàn)證通過(guò)后再引入實(shí)際業(yè)務(wù)邏輯。迭代時(shí)先保通道、再加業(yè)務(wù)這個(gè)順序能極大減少排障時(shí)間。4.4 仿真中常見(jiàn)錯(cuò)誤和解決方案速查我整理了一張自己在仿真中經(jīng)常遇到的錯(cuò)誤對(duì)照表基本覆蓋了Chip2Chip初始化階段的高頻問(wèn)題現(xiàn)象可能原因解決辦法channel_up一直為低主從兩端線(xiàn)速率或位寬不一致檢查兩端IP配置是否完全一致lane_up不拉高GT參考時(shí)鐘沒(méi)起振或頻率不對(duì)查看仿真波形確認(rèn)參考時(shí)鐘頻率正確gt_txresetdone不拉高gt_reset釋放太早或channel_init_clk沒(méi)跑拉長(zhǎng)復(fù)位時(shí)間確保init_clk先運(yùn)行數(shù)據(jù)偶發(fā)錯(cuò)位用戶(hù)復(fù)位釋放時(shí)機(jī)錯(cuò)誤用channel_up同步釋放axi_resetn仿真波形出現(xiàn)大量X態(tài)某些GT配置參數(shù)未初始化確認(rèn)是否直接用了Example Design的仿真設(shè)置上板后鏈路正常但仿真不過(guò)仿真模型與實(shí)際硬件復(fù)位時(shí)間不同仿真中適當(dāng)延長(zhǎng)等待時(shí)間還有一個(gè)容易被忽視的問(wèn)題仿真模型默認(rèn)情況下不會(huì)模擬出真實(shí)的QPLL鎖定失敗場(chǎng)景。也就是說(shuō)即使參考時(shí)鐘頻率不對(duì)行為仿真也可能看起來(lái)一切正常但上板后鏈路怎么都練不起來(lái)。所以仿真通過(guò)不等于硬件一定沒(méi)問(wèn)題這一點(diǎn)要特別留意。5. 上板調(diào)試時(shí)容易忽略的硬件細(xì)節(jié)5.1 參考時(shí)鐘、差分走線(xiàn)和接地Chip2Chip跑的是高速串行信號(hào)物理層對(duì)參考時(shí)鐘和差分走線(xiàn)非常敏感。參考時(shí)鐘請(qǐng)使用時(shí)鐘源專(zhuān)用引腳輸入不要拿普通IO模擬差分時(shí)鐘抖動(dòng)會(huì)直接影響GT的誤碼率。如果條件允許用獨(dú)立晶振或時(shí)鐘芯片給GT參考時(shí)鐘供給干凈時(shí)鐘源。差分走線(xiàn)要按100歐姆差分阻抗控制盡量短避免過(guò)孔。如果走線(xiàn)跨層記得在換層附近加回流地孔。兩塊FPGA板卡之間用連接器互連時(shí)連接器的信號(hào)完整性問(wèn)題也要考慮最好選經(jīng)過(guò)驗(yàn)證的高速連接器。還有一個(gè)容易被忽略的點(diǎn)兩塊板卡的GND必須可靠連通。如果地電位不一致GT的共模電壓會(huì)漂移輕則誤碼率高重則鏈路完全無(wú)法建立。調(diào)試時(shí)先用萬(wàn)用表確認(rèn)兩端地線(xiàn)連接正常再上業(yè)務(wù)。5.2 上板后如何快速定位鏈路狀態(tài)上板后如果鏈路不通不要急著改代碼先看信號(hào)。我一般按這個(gè)順序排查用邏輯分析儀或ILA觀察gt_txresetdone和gt_rxresetdone是否拉高確認(rèn)GT復(fù)位完成。觀察lane_up狀態(tài)確認(rèn)字節(jié)對(duì)齊是否完成。觀察channel_up狀態(tài)確認(rèn)兩端握手是否成功。如果都能拉高再跑數(shù)據(jù)回環(huán)抓取接收端錯(cuò)誤標(biāo)志。FPGA內(nèi)部這些信號(hào)都很容易引出到ILA。如果工程里不好加探針可以直接在頂層模塊里把幾個(gè)關(guān)鍵信號(hào)引出來(lái)連到空閑LED上用示波器或肉眼觀察狀態(tài)。LED雖然土但真到了現(xiàn)場(chǎng)調(diào)試往往比打開(kāi)Vivado抓波形還快。上板調(diào)試另一個(gè)常見(jiàn)問(wèn)題是誤碼率不穩(wěn)。排除接線(xiàn)問(wèn)題后優(yōu)先嘗試降低GT線(xiàn)速率比如從5G降到2.5G如果誤碼消失說(shuō)明信號(hào)完整性問(wèn)題比較大需要檢查PCB走線(xiàn)和連接器。這個(gè)診斷方法簡(jiǎn)單有效能快速把問(wèn)題范圍縮小到信號(hào)完整性還是協(xié)議配置上。最后再說(shuō)兩句Chip2Chip這個(gè)IP核表面上看起來(lái)只是一個(gè)“串口加強(qiáng)版”用熟了以后才會(huì)發(fā)現(xiàn)它內(nèi)部的Aurora PHY初始化其實(shí)藏著不少細(xì)節(jié)。它最友好的地方在于Xilinx用標(biāo)準(zhǔn)化封裝把底層協(xié)議打包了讓用戶(hù)把精力放到數(shù)據(jù)通路和業(yè)務(wù)邏輯上。但我個(gè)人的體會(huì)是越是這樣封裝的核越要在仿真階段把初始化時(shí)序吃透否則上板出了問(wèn)題反而更不好排查。我后來(lái)的固定套路是新項(xiàng)目只要涉及Chip2Chip第一步一定是拿Example Design跑雙端仿真看到channel_up穩(wěn)定拉高后再改成自己的業(yè)務(wù)邏輯。這一步省掉了我不知道多少的回頭調(diào)試時(shí)間。希望這篇實(shí)戰(zhàn)經(jīng)驗(yàn)?zāi)軒湍闵僮邚澛贰?