1. Xilinx 時鐘資源
xilinx 時鐘資源分為兩種:全局時鐘和第二全局時鐘。
1. 全局時鐘資源
Xilinx 全局時鐘采用全銅工藝實現,并設計了專用時鐘緩沖與驅動結構,可以到達芯片內部任何一個邏輯單元,包括CLB、I/O引腳、內嵌RAM、硬核乘法器等,而且時延和抖動都很小。對FPGA設計而言,全局時鐘是最簡單最可預測的時鐘,最好的時鐘方案是:由專用的全局時鐘輸入引腳驅動單個全局時鐘,并用后者去控制設計中的每個觸發器。全局時鐘資源是專用布線資源,存在與全銅布線層上,使用全局時鐘資源不影響芯片的其他布線資源,因此在可以使用全局時鐘的時候盡可能使用。
目前,主流芯片都集成了專用時鐘資源、時鐘管理模塊(DCM)。以Virtex 5 為例,含有6個CMTs(Clock Management Tiles),每個CMTs包含2個DCM和一個PLL,1個DCM內包含2個DLL和一個PLL。
全局時鐘資源需要通過原語(Primitives)調用,常見的時鐘原語有:
IBUFG: Single-ended Input Global Clock Buffer
IBUFGDS: Differential Input Global Clock Buffer
BUFG: Global Clock Buffer
BUFGCE: Global Clock Buffer w/ Enable
DCM: DCM_ADV DCM_BASE
這些原語的使用在Language Templates都有示例,在user guide(v5對應為UG190)里也有詳細說明。常用組合:
IBUFG / IBUFGDS + BUFG
最基本的時鐘使用方法。當信號從全局時鐘引腳輸入時,無論是否為時鐘信號,都必須使用IBUFG/IBUFGDS;反之,如果使用了IBUFG/IBUFGDS,則信號必須從全局時鐘引腳輸入,否則布局布線會報錯。IBUFG/IBUFGDS的輸入只與芯片的專用全局時鐘輸入引腳有物理連接,與普通的I/O和其他內部CLB沒有物理連接,所以后面要加BUFG。
LOGIC + BUFG
BUFG不僅可以驅動IBUFG的輸出,還可以驅動普通信號(非時鐘信號)的輸出。當某個信號(時鐘、使能、快速路徑)的扇出非常大,要求抖動延遲最小時,可以使用BUFG驅動該信號,使該信號利用全局時鐘資源。注意:普通I/O信號或片內信號進入BUFG到從BUFG輸出,有大約10ns的固定時延,但是BUFG到片內所有單元的延時可以忽略為0ns。
IBUFG / IBUFGDS + DCM + BUFG
更加靈活的控制時鐘信號。通過DCM可以對時鐘進行同步、移相、分頻和倍頻,而且可以使全局時鐘的輸出沒有抖動延遲。
使用全局時鐘資源可以直接用原語例化,也可以使用IP核。仔細觀察了一下IP核產生的源文件,發現 IP核生成的就是這3個原語的組合:
module DCM_100M(CLKIN_IN,
RST_IN,
CLKIN_IBUFG_OUT,
CLK0_OUT,
CLK2X_OUT,
LOCKED_OUT);
input CLKIN_IN;
input RST_IN;
output CLKIN_IBUFG_OUT;
output CLK0_OUT;
output CLK2X_OUT;
output LOCKED_OUT;
wire CLKFB_IN;
wire CLKIN_IBUFG;
wire CLK0_BUF;
wire CLK2X_BUF;
wire GND_BIT;
wire [6:0] GND_BUS_7;
wire [15:0] GND_BUS_16;
assign GND_BIT = 0;
assign GND_BUS_7 = 7'b0000000;
assign GND_BUS_16 = 16'b0000000000000000;
assign CLKIN_IBUFG_OUT = CLKIN_IBUFG;
assign CLK0_OUT = CLKFB_IN;
IBUFG CLKIN_IBUFG_INST (.I(CLKIN_IN),
.O(CLKIN_IBUFG));
BUFG CLK0_BUFG_INST (.I(CLK0_BUF),
.O(CLKFB_IN));
BUFG CLK2X_BUFG_INST (.I(CLK2X_BUF),
.O(CLK2X_OUT));
DCM_ADV #( .CLK_FEEDBACK("1X"), .CLKDV_DIVIDE(2.0), .CLKFX_DIVIDE(1),
.CLKFX_MULTIPLY(4), .CLKIN_DIVIDE_BY_2("FALSE"),
.CLKIN_PERIOD(10.000), .CLKOUT_PHASE_SHIFT("NONE"),
.DCM_AUTOCALIBRATION("TRUE"), .DCM_PERFORMANCE_MODE("MAX_SPEED"),
.DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"), .DFS_FREQUENCY_MODE("LOW"),
.DLL_FREQUENCY_MODE("LOW"), .DUTY_CYCLE_CORRECTION("TRUE"),
.FACTORY_JF(16'hF0F0), .PHASE_SHIFT(0), .STARTUP_WAIT("FALSE"),
.SIM_DEVICE("VIRTEX5") ) DCM_ADV_INST (.CLKFB(CLKFB_IN),
.CLKIN(CLKIN_IBUFG),
.DADDR(GND_BUS_7[6:0]),
.DCLK(GND_BIT),
.DEN(GND_BIT),
.DI(GND_BUS_16[15:0]),
.DWE(GND_BIT),
.PSCLK(GND_BIT),
.PSEN(GND_BIT),
.PSINCDEC(GND_BIT),
.RST(RST_IN),
.CLKDV(),
.CLKFX(),
.CLKFX180(),
.CLK0(CLK0_BUF),
.CLK2X(CLK2X_BUF),
.CLK2X180(),
.CLK90(),
.CLK180(),
.CLK270(),
.DO(),
.DRDY(),
.LOCKED(LOCKED_OUT),
.PSDONE());
endmodule
時鐘從CLKIN_IN輸入,經過IBUFG,輸出為CLKIN_IBUFG,然后輸入到DCM_ADV,輸出為CLK0_BUF和CLK2X_BUF,CLK0_BUF經過BUFG得到CLKFB_IN,一方面反饋到DCM的,另一方面也從CLK0_OUT輸出;CLK2X_BUF則經過BUFG后直接輸出為CLK2X_OUT。
LOGIC + DCM + BUFG
和前一種的區別在于DCM的輸入是從內部輸入還是外部輸入。從外部輸入則用IBUFG,保證時鐘信號由芯片引腳輸入;從內部輸入則可以選擇內部邏輯的任意信號,在FPGA內部是沒有差分信號的,所有內部時鐘信號都是單端信號。
Google到一篇不錯的博客:如何正確使用FPGA的時鐘資源
2. 第二全局時鐘資源
第二全局時鐘資源屬于長線資源,長度和驅動能力僅次于全局時鐘資源,也可以驅動芯片內部的任何一個邏輯,抖動和延時僅次于全局時鐘。在設計中,一般將高頻率、高扇出的時鐘使能信號以及高速路徑上的關鍵信號指定為全局第二時鐘信號。使用全局時鐘資源并不占用邏輯資源,也不影響其他布線資源;第二時鐘資源占用的是芯片內部的資源,占用部分邏輯資源,各個部分的布線會相互影響,所以建議在設計中邏輯占用資源不超過70%時使用。
使用第二時鐘資源:可以在約束編輯器中的專用約束Misc選項中,指定所選信號使用低抖動延遲資源“Low Skew”來指定,也可以在ucf文件中添加“USELOWSKEWLINES"約束命令。比如:
NET "s1" USELOWSKEWLINES;
2. ISE時序分析器
單擊Design Summary中的Static Timing就可以啟動時序分析器(Timing Analyzer)。在綜合、布局布線階段ISE就會估算時延,給出大概的時延和所能達到的最大時鐘頻率,經過PAR后,在Static Timing中給出的是準確的時延,給出的時序報告可以幫助我們找到關鍵路徑,然后針對其進行優化,提高系統的時鐘頻率。
造成時序性能差的原因很多,主要分為3種:
1. 布局太差
一般和代碼本身沒有關系。解決方案:只能從軟件自身的布局算法考慮(調整布局的努力程度)或者使用高端芯片
2. 邏輯級數太多
邏輯級數越多,資源的利用率越高,但是對工作頻率的影響也越大。解決方案:1.使用流水線技術;2.如果是多周期路徑,添加多周期約束;3.良好的編碼習慣,不要過多嵌套if-else,盡量使用case代替if語句。
3. 信號扇出過高
高扇出會造成信號傳輸路徑過長,從而降低時序性能。解決方案:1.邏輯復制;2.區域約束,想過邏輯放置在一起。
4. 不要同時使用雙邊沿觸發
FPGA的底層工藝都是單向的同步電路,所以本身不支持統一信號的爽邊沿觸發,ISE在實際處理的時候,會自動將該信號2倍頻,然后利用第一個沿處理上升沿,第二個沿處理下降沿。這樣在分析時序時,自動把約束升級為ucf文件中的兩倍。
5. Xilinx最優時序解決方案
I/O約束
根據Xilinx器件的特點,控制信號置于器件的頂部或底部,且垂直布置;數據總線的I/O置于器件的左右兩側,且水平布置,這樣可以最大程度的利用芯片底層結構。
ISE實現工具
ISE中的工具具備不同的努力程度,直接使用最高級別的可以提高時序性能,但是會耗費很多時間,所以應該逐步調整努力程度。第一遍使用默認的參數選項,如果不滿足再調整綜合、映射、布局布線的參數。
參考資料:
1. 《Xilinx FPGA開發使用教程》 田耘 徐文波
2. 如何正確使用FPGA的時鐘資源
3. FPGA IP核和硬件原語的關系!
評論
查看更多