先給出 Xilinx 復(fù)位準(zhǔn)則 :
(1)盡量少使用復(fù)位,特別是少用全局復(fù)位,能不用復(fù)位就不用,一定要用復(fù)位的使用局部復(fù)位;
(2)如果必須要復(fù)位,在同步和異步復(fù)位上,則盡量使用同步復(fù)位,一定要用異步復(fù)位的地方,采用“異步復(fù)位、同步釋放”;
(3)復(fù)位電平選擇高電平復(fù)位;
(這里說明,由于 Altera 和 Xilinx 器件內(nèi)部結(jié)構(gòu)的不同,Altera 的 FPGA 推薦低電平復(fù)位)
Global Reset Isn't Timing-Critical
全局復(fù)位的典型驅(qū)動:
(1)按鍵開關(guān):復(fù)位信號接一個按鍵,反應(yīng)非常慢(ms級別),并且非常不確定(按鍵抖動?);
(2)電源狀態(tài)輸出:上電后由電源芯片產(chǎn)生一個監(jiān)測信號復(fù)位系統(tǒng),可以長時間的保持,直到電源穩(wěn)定后進行正常工作;
(3)微處理器等控制芯片:控制芯片產(chǎn)生復(fù)位脈沖;
以上所有情況下,復(fù)位信號似乎是緩慢的,因此,我們也可以有把握地認(rèn)為,它對時序不會造成關(guān)鍵影響。當(dāng)為您的FPGA設(shè)計指定定時約束時,這個信號通常會被分配一個長周期(低頻)。
但是,全局復(fù)位不是時序關(guān)鍵的假設(shè)并不全對,隨著時鐘頻率的增加,全局復(fù)位對時序會帶來很大的影響。
雖然復(fù)位脈沖可以用比時鐘周期更長的持續(xù)時間,并保證所有觸發(fā)器都可以被成功復(fù)位,但是復(fù)位信號的釋放應(yīng)該被認(rèn)為是一個時間關(guān)鍵事件。
FPGA內(nèi)部的全局置位/復(fù)位(GSR)信號也是一個全局復(fù)位,這也是FPGA器件內(nèi)部的一個高扇出網(wǎng)絡(luò)(high fan-out)。在一個設(shè)計中,雖然啟動序列可以與“用戶時鐘”同步,但不能保證它不能與所有時鐘都同步。FPGA器件有多個DLL/DCM/PLL模塊,每個模塊都能夠產(chǎn)生多個不同頻率和相位的時鐘。
在圖1中,一個復(fù)位信號在兩個時鐘邊沿之間的某個時間被釋放。復(fù)位信號經(jīng)過一段時間傳播到各種觸發(fā)器,在每個觸發(fā)器中,復(fù)位信號都應(yīng)該在下一個有效的時鐘邊沿的“Set-up time”(建立時間)前就無效。很明顯,當(dāng)時鐘頻率上升時,可以用來分配給復(fù)位信號釋放的時間就會減少。考慮到復(fù)位信號是一個高扇出網(wǎng)絡(luò),所以復(fù)位釋放的時序不易收斂。
如果復(fù)位的釋放與時鐘異步(通常就是這種情況),那么就無法保證所有觸發(fā)器都能在同一個時鐘邊緣釋放(圖2)。
當(dāng)在A時刻釋放reset時,觸發(fā)器將在第一個時鐘邊沿檢測到有效的釋放信號;在C時刻釋放reset時,復(fù)位的釋放將直到下一個時鐘邊沿才被檢測到;B時刻時鐘上升沿時觸發(fā)器檢測到的reset狀態(tài)很難確定(可能高電平,也可能低電平),可能導(dǎo)致亞穩(wěn)態(tài)。
隨著時鐘頻率的提高和與大型器件潛在****的 分布傾斜,幾乎不可避免的是, 無法保證所有的觸發(fā)器的復(fù)位都能在同一個時鐘邊沿 被釋放 (圖3)。
Does It Really Matter?
好消息是,在99.99%的情況下,全局復(fù)位的異步釋放對系統(tǒng)沒什么影響,所以大多數(shù)電路都能正常工作。如果一個電路不工作,那可能恰好是遇到了另外的0.01%,不幸地在錯誤的時間釋放了復(fù)位。
在圖4所示的流水線場景中,復(fù)位釋放的時間并不重要。
當(dāng)數(shù)據(jù)通過流水線進程時,復(fù)位的釋放時間無關(guān)緊要。即使出現(xiàn)了錯誤,在經(jīng)過一定時鐘周期后整個系統(tǒng)就能恢復(fù)。這種情況下,復(fù)位是沒有意義的。當(dāng)有效的數(shù)據(jù)輸入時,初始狀態(tài)或者未知的狀態(tài)將從系統(tǒng)中清除。
但是,在圖5顯示了獨熱碼狀態(tài)機場景中復(fù)位釋放的時間非常重要。
在上面的獨熱碼狀態(tài)機中,有明顯的失敗可能性。如果第一個觸發(fā)器在第二個觸發(fā)器的前一個時鐘周期釋放,那么獨熱碼的熱狀態(tài)將丟失,狀態(tài)機將永遠變冷(狀態(tài)機無法恢復(fù))。將所有的觸發(fā)器盡可能的靠近布局能夠降低錯誤的發(fā)生概率(在局部重置網(wǎng)絡(luò)上的低傾斜)。然而,除非Set-up timie建立時間得到保證,否則這種錯誤情況仍有可能發(fā)生。如果所有觸發(fā)器沒有在同一個時鐘周期中釋放,編碼后的狀態(tài)機可能進入意外狀態(tài)或則會非法狀態(tài)。
最后,需要仔細考慮復(fù)位的是包含反饋路徑的電路。
沒有反饋的電路實際上根本不需要復(fù)位 。在數(shù)字信號處理應(yīng)用中,有限脈沖響應(yīng)濾波器(FIR)是沒有反饋的。在有效數(shù)據(jù)填充了所有的抽頭之前,輸出樣本實際上沒有有效的值,所以復(fù)位抽頭寄存器沒有任何效果。然而,無限脈沖響應(yīng)濾波器(IIR)包含反饋。如果因為不干凈的復(fù)位釋放而產(chǎn)生****了一些不符合預(yù)期的 輸出, 該輸出結(jié)果又會返回到輸入,那么會在很長一段時間內(nèi)無法獲取真實的****輸出 結(jié)果(反饋環(huán)路互相影響了) 。在最壞的情況下,由于不穩(wěn)定,濾波器可能會完全失效 。
Automatic Coverage of the 99.99% of Cases
當(dāng)配置或重配置Xilinx FPGA時,內(nèi)部所有的單元都被初始化(圖6)。這是master reset復(fù)位的結(jié)果,因為它涉及的遠不止簡單的觸發(fā)器。
上電配置與全局復(fù)位具有相同的寄存器復(fù)位效果,但除此之外,上電的配置還初始化了所有RAM單元。隨著FPGA器件上RAM資源的增加,這是一個非常有用的特性。所有RAM內(nèi)容的初始狀態(tài)都是已知的,這對于仿真和操作是非常理想的,并且消除了使用啟動序列來清除內(nèi)存的要求。
由于處理器也嵌入到Xilinx設(shè)備中(無論是硬核還是軟核),所有程序和數(shù)據(jù)區(qū)域的初始狀態(tài)在處理器執(zhí)行第一條指令之前就已經(jīng)定義了。在這樣的前提下,為了重置一些觸發(fā)器的初始狀態(tài)而消耗寶貴的可編程資源是沒有意義的。仿真器應(yīng)該能夠?qū)@個初始化(通常稱為上電復(fù)位)建模,這再次避免了在設(shè)計中對復(fù)位信號的任何要求。
Strategy for the 0.01% of Cases
最重要的是,有一種策略來處理設(shè)計中的復(fù)位。設(shè)計的關(guān)鍵部分在于必須在相關(guān)的時鐘域 同步釋放 ,可以插入一個局部的高性能復(fù)位網(wǎng)絡(luò)來控制那些需要局部復(fù)位的觸發(fā)器。
圖7中的電路是控制局部復(fù)位網(wǎng)絡(luò)的一種可能有用的機制,該電路的優(yōu)點是使用外部復(fù)位信號時的效果和使用器件上電配置產(chǎn)生的效果一樣( 異步復(fù)位、同步釋放,避免了釋放帶來的亞穩(wěn)態(tài) )。
在配置FPGA或異步復(fù)位信號期間,鏈中的所有觸發(fā)器都預(yù)設(shè)為1。鏈上的最后一個觸發(fā)器幾乎立即將一個有效的復(fù)位信號驅(qū)動到局部復(fù)位網(wǎng)絡(luò)。隨著全局置位/復(fù)位(GSR)或者異步復(fù)位的釋放,移位寄存器鏈開始在每個時鐘周期填滿0。
鏈中觸發(fā)器的數(shù)量決定了傳輸?shù)骄植繌?fù)位網(wǎng)絡(luò)的復(fù)位脈沖的最小持續(xù)時間。鏈路的最后一個觸發(fā)器進行一個從高電平到低電平的轉(zhuǎn)換, 局部復(fù)位與時鐘同步釋放 。復(fù)位的觸發(fā)器可以采用同步置位(FDS)或同步復(fù)位(FDR),從而實現(xiàn)完全同步設(shè)計,并易于時序規(guī)范和分析。
Reset Costs More Than You Think!
在實現(xiàn)設(shè)計時,大多忽略了HDL代碼中全局復(fù)位的代價,但是全局復(fù)位的代價可能是巨大的:
( 1)布線****資源
? 減少了其他連接的自由度;
? 可能會降低系統(tǒng)性能,由此需要更高速度等級的FPGA,增加了成本;
? 增加的布線時間;
( 2)邏輯****資源
? 觸發(fā)器專用復(fù)位的使用;
? 在D輸入或?qū)S脧?fù)位輸入之前需要有額外的邏輯門;
? 幾乎肯定會影響設(shè)計的尺寸;
? 額外的邏輯層次幾乎肯定會影響系統(tǒng)性能;
? 增加布局和布線的時間;
( 3)無法****使用高效率的特性,如SRL16E
? SRL16E可以在每個LUT中實現(xiàn)多達16個虛擬觸發(fā)器(Xilinx器件的高效應(yīng)用);
? 上述實現(xiàn)的虛擬觸發(fā)器不支持復(fù)位,當(dāng)HDL指定復(fù)位時,綜合工具就無法使用SRL16E來減少觸發(fā)器的使用;
? 高達16倍的尺寸和產(chǎn)品成本的增加;
? 額外的大小可能會降低系統(tǒng)性能;
? 增加布局和布線的時間;
關(guān)于復(fù)位信號如何影響資源利用率的討論,請參見WP275 Get your Priorities Right - Make your Design Up to 50% small。
Summary
在Xilinx FPGA中實現(xiàn)的設(shè)計不需要插入全局復(fù)位網(wǎng)絡(luò) 。對于絕大多數(shù)設(shè)計,所有觸發(fā)器和RAM的上電后的初始化狀態(tài)比任何的邏輯復(fù)位都要全面,不需要為了仿真而插入復(fù)位,因為沒有任何東西是未定義的。由于Xilinx FPGA已經(jīng)經(jīng)過了全面測試,因此在設(shè)計中不需要掃描邏輯和運行測試向量。因此,全局復(fù)位也不需要作為這個過程的一部分。
插入全局重置將影響開發(fā)時間和產(chǎn)品成本。隨著時鐘和完整系統(tǒng)在芯片上實現(xiàn)更高速度的趨勢,可靠性問題必須得到重視。必須確定系統(tǒng)中真正需要復(fù)位的關(guān)鍵部件,并且在啟動或運行過程中,必須像控制同步電路中的任何其他信號一樣小心地控制這些復(fù)位的釋放。
當(dāng)設(shè)計每個部分時,都要問一問:“這個部分需要復(fù)位嗎?”
評論