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