MultiBoot 是 FPGA 遠(yuǎn)程更新配置文件時(shí)一種非常普遍的應(yīng)用--為了確保安全,我們通常需要安排一個(gè) Golden Image,升級失敗后 FPGA 能回跳 (Fallback) 到此配置,從而使 FPGA 始終處于可被檢測的工作狀態(tài)。
很多客戶有同樣的問題:我在升級 Update Image 一半時(shí)突然掉電了,為什么回跳機(jī)制不起作用了呢?FPGA 怎么掛死了呢?其實(shí)這個(gè)現(xiàn)象是"符合預(yù)期"的,回跳機(jī)制不能應(yīng)付這種異常。如果配置文件寫到一半突然中斷,嵌在配置數(shù)據(jù)流里面的指令序列同樣也沒有了,并且有可能中斷在任意位置。FPGA 的控制邏輯此時(shí)就失去了工作方向,不知道下一步該做什么。
Xapp1247, Appendix A提供了一個(gè)很好的解決方案。利用兩個(gè) timer 或者稱之為 barrier 的小image,嵌在 Golden 和 Update 之間或附在 Update 之后,通過合理的給兩個(gè) timer 賦值,可以解決 Update Image 刷新時(shí)同步字丟失或者半程掉電的情況。
但是同時(shí)又有客戶提出了問題:我的應(yīng)用對回跳時(shí)間要求很高,Xapp1247,Appendix A的方案對于半程掉電的場景,只有搜索完整個(gè) Update Image 區(qū)域,看到 Timer#2 的設(shè)置才能完成回跳。有沒有辦法縮短這段時(shí)間呢?
MultiBoot 的跳轉(zhuǎn)實(shí)際上是非常靈活的,我們這里就嘗試提供一種思路:
1. 去掉 Timer#2,只保留 Timer#1 作為 Golden 和 Update Image 之間的 barrier Image。
2. Update Image采取從后往前倒著燒錄的辦法。(在實(shí)際應(yīng)用中,燒寫 flash 都是用CPU/MCU/FPGA 控制或者第三方編程器實(shí)現(xiàn)的,所以這一點(diǎn)也很容易實(shí)現(xiàn))。
3. 精確設(shè)定 Timer#1的值,使其看到Update中的TIMER指令及賦值但不需更多。
Timer 寄存器的值只有在 Power-Cycle 或者 PROG_B 過程中才能被清除,或者被新的 Timer值覆蓋,或者在整個(gè)配置數(shù)據(jù)加載完畢后自動(dòng)失效。
我們通過精確設(shè)定 Timer#1的值,使 FPGA 控制邏輯有足夠時(shí)間看到 Update Image 中新的Timer 值。TIMER 指令位于 Image 的頭部。因?yàn)?Update Image 是倒著寫入的,能看到新的Timer 值,說明 Update Image 基本已經(jīng)更新好了。由于新的 timer 值是足夠控制邏輯加載完整的配置數(shù)據(jù)的,Timer 寄存器被新值更新后,Timer#1 相當(dāng)于失效了。FPGA 有充足時(shí)間可以順利讀入完整配置數(shù)據(jù),開啟正常工作。
如果由于斷電等原因,Update 更新到一半就停止了,此時(shí)會(huì)缺失 Update 的同步字,TIMER指令等等位于頭部的信息。Timer#1 在一個(gè)有限的時(shí)間內(nèi)搜索 Update Timer 但是沒有看到,timeout 之后就會(huì)直接觸發(fā)回跳。因此不用等待搜索整個(gè) Update 存儲(chǔ)空間完畢,依靠尾部的Timer#2 才能觸發(fā)回跳了。
整個(gè)解決方案的重點(diǎn)就在于設(shè)定 Timer#1 的值。
這個(gè)其實(shí)很簡單,根據(jù)你自己生成的 Timer#1和Update的MCS文件 (方法參考Xapp1247),計(jì)算一下 Timer#1 的指令到 Update 的 TIMER 之間的字節(jié)數(shù)即可。
以 KU040 的 bit 為例,觀察 Update Image 頭部的命令/數(shù)據(jù)序列,可以看到有 3002 2001,這就是設(shè)置 Timer 寄存器的命令TIMER。我們想Timer#1的時(shí)間足夠看到 Update 中的3002 2001命令以及賦值,其他不需要了,隨意添加幾個(gè) cycle 或者幾個(gè)字的裕量即可。
比如我們設(shè)到3000 8001,多3個(gè)字的余量。
Timer的格式如下:
Barrier/Timer#1 里從 TIMER 及賦值開始,后面有兩個(gè) NOOP 字,加上后續(xù) Update 里從FFFFFFFF 開始直到 3000 8001 有28個(gè)字,一共30個(gè)字,那么就是30*32=960 bit。SPIx1 串行配置中,一個(gè) CCLK 讀取一個(gè) bit,所以
Timer#1 的值設(shè)置為 h‘3C0.
如上圖,30 03 E0 01是把 bus width 從默認(rèn)的 x1 切到 x4 的命令。如果在讀入 Timer#1 之前中執(zhí)行了該命令(比如 Golden 里面),那么 Timer#1 的值需要按照一個(gè) CCLK cycle,讀取4個(gè) bit 來計(jì)算。和 Timer 命令類似,在 FPGA 控制邏輯讀取數(shù)據(jù)的過程中,如果沒有碰到新的30 03 E0 01設(shè)定新的數(shù)據(jù)寬度,那么將一直按照之前設(shè)定的 bus width 來讀入數(shù)據(jù)或者指令。
假設(shè) Timer#1 以及 Update 都是以x4讀取的,那么 Timer#1 需設(shè)為 h’F0.
綜上,通過合理設(shè)定 barrier#1 中的 Timer#1 數(shù)值,我們可以極大地縮短升級掉電這種MultiBoot 失效場景的回跳時(shí)間。
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
603013 -
amd
+關(guān)注
關(guān)注
25文章
5466瀏覽量
134098 -
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120232
原文標(biāo)題:開發(fā)者分享|縮短MultiBoot流程中的回跳 (Fallback) 時(shí)間
文章出處:【微信號:gh_2d1c7e2d540e,微信公眾號:XILINX開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論