危險的未分配引腳(FPGA)

2021-06-21 21:10:56 字數 2469 閱讀 5441

一波三折——危險的「未分配」引腳 

第一折。半個月前,美國的同事對當前的乙個工程進行了編譯,並提交二進位制檔案(

fpga

配置檔案)給

軟體工程師

進行整合。結果該二進位制檔案導致了整個

系統的崩潰:fpga二進位制檔案剛

完畢,整個系統就不工作了。這一事件導致了美國fpga工程師一整天的停工和系統恢復。kevin給出的分析結果是,fpga給出的中斷

訊號有問題,該訊號經過cpld**到cpu後導致cpu反覆跳入中斷,造成系統崩潰。後來,因為經過重新編譯的二進位制檔案沒有引發類似現象,該問題就被當作是乙個偶然事件被忽略了。 riple 

第二折。上週的某一天,在我們這邊,類似的現象「終於」也發生了。由於時差的關係,我們沒能得到美國軟體工程師的及時支援。眼瞅著手上僅有的兩個系統陷入癱瘓,工作不能繼續,沒辦法,只能自己硬著頭皮除錯一下看看。系統崩潰後,

嵌入式linux作業系統的響應異常緩慢,通過

網路登陸無法進行除錯和控制。幸好還有

串列埠除錯臺,通過串列埠可以看到系統反覆列印出對

匯流排上特定位址範圍的

資料接下來,我試圖找出fpga引發系統崩潰的原因。中斷訊號引發系統崩潰的說法首先被排除了,原因是fpga的中斷產生邏輯

電路相當標準,不可能產生隨機的錯誤行為。問題縮小到fpga連線到cpu的雙向資料匯流排上,這裡是除中斷外唯一乙個由fpga

驅動到cpu的邏輯電路。我的推論是,由於該fpga工程沒有對cpu相關的輸入輸出引腳進行時序約束,兩次編譯會導致雙向資料匯流排的輸出使能訊號的響應差異,這一差異進一步影響了fpga驅動雙向資料匯流排的速度差異,在某些情況下,fpga或早或晚地驅動了匯流排,引發了匯流排驅動衝突,導致cpu對匯流排上其它

裝置的訪問失敗。經過對所有cpu相關的訊號進行時序約束後,編譯的二進位制檔案沒有引發系統崩潰。 riple 

第三折。問題並沒有這樣得到解決。兩天後,在又一次對該工程進行編譯後,一模一樣的問題又出現了。去除我先前給工程施加的時序約束後,問題反而沒有了。不加約束會錯,加了約束也會錯,看來約束並沒有作用到問題的本質上。唯一可以得到確認的結論是:兩次fpga編譯的結果是有差異的,特定電路的編譯結果並沒有得到時序約束的有效控制;問題隨機出現,但是表現一致。 riple 

這一次,為了定位導致問題的具體邏輯電路,我必須對出問題的編譯結果進行分析和實驗。二進位制檔案是最終的編譯結果,時序分析報告也是編譯結果,但是這兩個結果要麼不可分析,要麼包含了太多的資訊而無法分析。我唯一可以進行分析和實驗的物件就是布局佈線(p&r)之後的底層網表資料。 riple 

到了這一步,我找遍了「路燈下所有能找的地方」,只能向其他方向「胡亂」摸索了。我嘗試了給來自cpu的控制輸入訊號,包括所有的位址線,增加上拉

電阻的方法,也沒有成功。 riple 

經過了類似的一系列摸索,最終我在pin planner檢視中發現了蹊蹺:在該工程中竟然存在沒有分配布局位置的輸出引腳,而這些輸出引腳在該專案中並沒有被實際的輸入邏輯驅動,這些引腳被analysis & synthesis工具預設地連線到了邏輯「0」上。通過比較成功和失敗兩次編譯結果中給出的最終引腳分配報告,我發現,這些沒有得到位置約束的引腳竟然可能隨機出現在任意的空閒引腳上。 riple 

通過進一步分析,在導致系統崩潰的編譯結果中我最終找到了答案:乙個沒有邏輯驅動,也忘了分配布局位置的輸出引腳被fitter工具隨機分配到了fpga沒有用到(也沒有位置約束)的一根cpu位址輸入線上,這根位址線就被短路到了「0」電平上,進而導致cpu外部匯流排上特定位址範圍不能被cpu訪問到,最終引發了系統崩潰。 riple 

通過這一問題的解決,我獲得了以下幾點認識: riple 

1. 沒有約束位置的引腳是很危險的,尤其是輸出引腳。隨機分配的結果很可能是災難性的。所以,

pcb原理

圖上的所有引腳,即使在fpga內部沒有被用到,也最好如實地加以約束。 riple 

2. quartus ii提供的eco工具,即「增量式布局佈線後網表修改功能」非常好用。既保留了上一次的全編譯結果,還縮短了編譯時間。用來做快速實驗(quick and dirty)最合適不過了。 riple 

3. resource property editor中對輸出使能訊號的控制方法。(乍看起來,邏輯上的連線與示意圖上的連線正好相反,其實不然。需要注意。) riple 

4. 為什麼會存在未分配的輸出和輸入引腳?這是因為該工程還存在尚未實現的後期功能。這些引腳就是給以後

開發留下的,由於我們太專注於眼前要實現的功能而被忽視了。 riple 

5. 為什麼會存在未用到,卻實際連線了的位址線?這是pcb

設計上的「冗餘設計」。這樣的冗餘設計在該專案中還有很多,有一些還真在

關鍵時刻給了我們fpga開發上的便利。 riple 

6. 既然上述兩個問題都有合理的解釋,為什麼還會出現這麼不合理的錯誤?原因之一是在pcb和fpga設計上缺乏完善的設計文件,pcb設計者的意圖沒有有效傳達給fpga設計者,而fpga設計者之間也沒能充分交流。原因之二是fpga開發流程上缺乏被稱之為「peer review」的設計評審和設計質量保證措施,乙個顯而易見的錯誤就被這樣忽略並遺留了下來。 riple

fpga分配引腳

1 voltage 電壓,按要求選擇 2 unused pin as input tri stated 3 遇到過這種錯誤 error 176310 can t place multiple pins assigned to pin location pin 101 iopad x34 y18 n2...

fpga的特殊引腳 說明

使用者i o 通用輸入輸出引腳。配置管腳 msel 1 0 用於選擇配置模式,比如as ps等。data0 fpga序列資料輸入,連線到配置器件的序列資料輸出管腳。dclk fpga序列時鐘輸出,為配置器件提供序列時鐘。ncso i o fpg 選訊號輸出,連線到配置器件的ncs管腳。asdo i ...

Elasticsearch集群未分配的shard

elasticsearch的主master節點管理shard在資料節點間的分配,如果有足夠多的資料節點,它自動分配shard primary和replica 到相應的資料節點上。但某些特殊的情況下,也會有未分配shard。如果未分配的是 replica shard,則整個集群處於yellow狀態。在...