2008年3月14日 星期五

FPGA測試不穩定的狀況

狀況:

測試約在1-20個round內會fail,先是Packet Engine(PE)停了,不再處理packet,(過了幾個round)然後可能PCI interrupt會一直asert清不掉(Linux會因為處理interrupt沒有反應)。最後Linux會整個hang住(即使把FPGA端電源關掉也不會有任何反應)。

另外在測試的整個過程中,爾而會觀察到INT_EN或PE_PDR_BASE/PE_RDR_BASE等等register會讀到不正常的值。更甚者連reserved的欄位都會出現值。

有時候PE停掉是因為PDR中的entry值不正常,看起來是被overwrite過。有時候則是因為PE_PDR_BASE被overwrite導致PE去錯誤的addr抓資料。

處理:

其次,利用AxD在可以讀到PCI Memory或I/O位址確定軟體讀的值是正確的。

利用Logic Analyzer(LA)攔截PCI bus的訊號,確定不是軟體(host)端寫入的。另外,出問題時PCI端有時會對host端很奇怪的位置作寫入或讀取。

結果:
問題確認是因為EIP94原來的設計會使用PCI configuration register中的BAR0,1,2,但是PCI bridge只會request BAR0,因此BAR1和BAR2值都會是0x0,PCI loopback (bridge?)會decode addr當看到BAR1/BAR2(?)的addr就會作(loopback),因此會overwrite PCI or host memory上的register/memory值(?)
因為NonOS的驗證用的Memory都是在0x20xxxxxx,所以不會遇到這個問題

反省:

其實我這邊的驗證是應該要能驗出來的,只是礙於alloc memory的位置不知道要怎麼去固定它
1. 如何在Linux裡alloc固定位置的memory
2. PCI 的運作方式?

沒有留言: