寫在前面
本文記錄總結之前在FPGA分享會中學到的關于賽靈思系列的復位功能操作的設計以及建議,進行分析總結。
學習FPGA入門,有一說一我的領路人大部分都是用的intel的芯片下板驗證,當時也不理解為啥子要這樣復位,寫抄就完了甚至感覺還挺有道理哈哈哈哈。
但是現在隨著學習的深入我漸漸得發現復位還真是門學問。話不多說正文見。
總述
對于Altera的FPGA而言,因為里面的flip-flop只支持低有效的異步復位,所以推薦使用低有效的異步復位。
對于xilinx 7系列的FPGA而言,flip-flop支持高有效的異步復/置位和同步復位/置位。對普通邏輯設計,同步復位和異步復位沒有區別,當然由于器件內部信號均為高有效,因此推薦使用高有效的控制信號,最好使用高有效的同步復位。輸入復位信號的低有效在頂層放置反相器可以被吸收到IOB中。
為什么復位?
使用全局復位有利于我們仿真,所有的寄存器都是有初始值的,也可以在任意時刻讓你的寄存器恢復初值,所以驗證工程師很喜歡這樣的設計,但是Xilinx建議的是盡量避免使用全局復位。 復位的基本目的是使器件強制進入到可以穩定工作的確定狀態。 這避免了器件在上電后進入到隨機狀態導致進入到無法判斷的狀態(也就是死機了)。在實際設計過程中,設計者必須選擇最適合于設計本身的復位方式。
xilinx為什么不推薦異步復位?
在這里插入圖片描述
- 異步重置將不會被添加到數據路徑。所以數據路徑對于時序分析來說是干凈的。
- 電路可以復位與或沒有時鐘的情況下復位電路。
- 不需要綜合指令
導致亞穩態
異步復位比預期的要復雜得多,異步復位與寄存器工作時鐘域沒有一定的相位關系,很難確保所有寄存器同時從狀態中釋放出來。 因為內部復位信號的偏差,寄存器A將在當前時鐘周期內從復位中釋放,C將在下一個時鐘周期釋放,B難以定義,甚至可能導致亞穩態。 簡而言之,==亞穩態亞穩態亞穩態!!!==
浪費布線資源
異步復位信號會占用大量的布線資源是高速設計的必要條件,但我們不能看到它在源代碼 -占用太多布線資源將減少其他連接的自由。 -可能降低系統性能潛在地需要一個更高的設備速度等級。 -增加布線時間。
浪費Slice資源
-有和沒有異步復位的寄存器不能被包裝在一個Slice -不同異步復位的寄存器不能被包裝在一個Slice
降低DSP和BRAM性能
如圖,在XILINX內部 的dsp和bram中,只有同步復位,異步復位是不會包含復位到BRAM/DSP的
解決方案
- 不復位
- 同步復位
同步復位的好處
同步復位為工具提供了更多的靈活性
異步復位確實會出現高扇出的情況。Fan-out即扇出,模塊直接調用的下級模塊的個數,如果這個數值過大的話,在FPGA直接表現為net delay較大,不利于時序收斂。因此,在寫代碼時應盡量避免高扇出的情況。
在這里插入圖片描述
- 合成可以選擇將控制信號的==低扇出==同步復位移到數據通路,以釋放更多的寄存器。
- 這可以允許將這個寄存器打包到以前不可能的一個slice中
- 可以改善時序以及寄存器密度
同步復位讓我們的設計穩定
從上圖我們可以看出,在我們的復位發送故障時,我們的同步復位只能在時鐘的邊沿觸發,這樣進而保證了我們系統的穩定性,在復位故障時盡量相對保證系統穩定。
復位建議
- 避免復位
- 高復位
- 同步復位
- 不要混合復位
- 可以在寄存器初始化時候直接賦值
reg [7:0] code = 8'hff;
內部寄存器其實很多情況不需要過分復位,大不了之前的垃圾數據我們不用就行了。重置重置是設計中需要考慮和限制的更常見和重要的控制信號之一。重置可以顯著影響設計的性能、面積和功率。
模塊化復位
模塊復位可以降低扇出,保證電路的穩定進行。
使用指令確保模塊復位信號不被綜合掉
example:
(* keep="true" *) reg my_modular_reset1;
(* keep="true" *) reg my_modular_reset2;
(* keep=“true” *) reg my_modular_reset3;
always @(posedge clkA) begin
my_modular_reset1 <= synchronized_reset;
my_modular_reset2 <= synchronized_reset;
my_modular_reset3 <= synchronized_reset;
end
DSP片采用同步復位
DSP芯片比大多數實現的芯片更通用 -它可以用于乘數,增加/sub, MACC,計數器(與可編程終端計數),比較器,移位,多路復用器,模式匹配,和許多其他邏輯功能。 每個DSP片有效地具有> 310寄存器 -沒有異步復位 使用同步全局重置可以使合成工具更容易地使用DSP切片 -異步復位方法將防止工具使用的存儲資源在DSP片。
塊RAM使用同步重置
RAM只有同步復位,塊ram通過使用輸出寄存器獲得最小時鐘輸出時間。
非復位不可嗎?
流水線的操作在幾個周期內就會把垃圾數據給移走,所以在這里的設計進行復位是多余的。
但是有一些情況下,復位的釋放后是很重要的。
比如獨熱碼狀態機。如果表示獨熱碼狀態的第一個觸發器比第二個觸發器早釋放了一個時鐘周期,那狀態機的狀態機會跳轉到一個無效的狀態。如果所有的表示獨熱碼的寄存器無法在同一個周期內被釋放,那狀態機肯定會跳轉到一個無效的狀態。
其實當Xilinx FPGA配置或重新配置時,所有的單元都會被初始化。稱為master reset,因為這可比你復位一些D觸發器要強得多,它甚至初始化了片內RAM。
Xilinx的器件也有嵌入處理的系列,軟核或硬核。在程序執行第一條指令前,程序和數據區域已經定義好了。有了上電復位,還用專門消耗邏輯資源去復位觸發器是沒有意義的。
通常可以將設計分為兩部分,控制路徑和數據路徑
==-至于數據路徑,初始值并不重要。重置是不必要的。==
==-只在設計中需要獲得有效幀信號或設計回到已知良好狀態的部分使用外部復位==
不復位是最好的!
總之就是能不用復位就盡量不用。
demo分享
demo1
優化前資源使用:
優化后: 資源節約的不是一點點阿....
全局復位和模塊復位對比
高扇出
優化后你就說帶不帶勁哈哈哈哈。
復位總結
- 復位前考慮是否需要復位
- 盡量不用復位
- 使用初始化代碼寄存器進行復位
- 使用異步復位時候要注意
使用異步復位,同步釋放的方法。用內部定義復位信號的方法來復位觸發器,而不是全都直接使用全局復位信號。當進行復位操作時,所有的觸發器被預設為1。如上圖,移位寄存器的最后一個觸發器去操作模塊內部定義的復位網絡。當復位信號釋放時,移位寄存器經過移位,當最后一個觸發器由高電平變為低電平時,對本地的復位網絡進行復位操作。也就是異步復位,同步釋放。
異步復位,就是復位信號可以直接不受時鐘信號影響,在任意時刻只要是低電平就能復位(假如約定低電平復位),也就是說,復位信號不需要和時鐘同步。而同步釋放就很有意思了,它的意思是讓復位信號取消的時候,必須跟時鐘信號同步,也就是說正好跟時鐘同沿。
module Reset_test(
input clk,
input rst_nin,
output reg rst_nout
);
reg rst_mid;
always@(posedge clk or negedge rst_nin)
begin
if(!rst_nin)
begin
rst_mid <= 0;
rst_nout <= 0;
end
else
begin
rst_mid <= 1;
rst_nout <= rst_mid;
end
end
endmodule
Reference
- xilinx FPGA復位淺析
- 你真的會Xilinx FPGA的復位嗎?