對於提高電路時鍾頻率的方法,最有效的無非是自己設計電路的時候盡量不要在關鍵路徑上的一個時鍾周期內做太多組合邏輯的運算,很費時的,能夠幾個時鍾周期平攤的就平攤下;另外,寫代碼的時候,風格也很重要,盡量不要在關鍵路徑上寫三重門運算的,時鍾速度很受影響的。
做到以上兩點的,如果使用FPGA實現的話,以下推薦幾種提高時鍾頻率的方法。用於Altera公司的QuartusII9.1.當然其他版本的工具亦可借鑒。
2.3.1 TimeQuest時序分析器
2.3.1.1 優勢
使用 TimeQuest 時序分析器的優勢包括:
- 使用方便的 GUI —— TimeQuest 時序分析器提供使用方便的 GUI 以及交互式報告,進行時序分析。
- 對業界標准 SDC 格式的自然支持—— 您可以利用功能強大的業界標准時序約束格式,使用並反復使用 SDC 格式和工具命令語言 (Tcl) 腳本,進一步提高效率。
- 支持復雜的時鍾方案—— SDC 格式提供更簡單但是功能更強大的時序格式,對高級設計組成 (DDR 以及其他源同步協議、復用時鍾等 ) 進行快速直接的描述和分析。
- 進一步提高性能—— 與標准時序分析器相比, TimeQuest 時序分析器能夠建立更精確的時序行為模型 ( 例如,上升/下降時序模型 ) 。 Hardcopy II 和 65nm 器件系列的性能可以提高 3-5 %。
- 更簡單的 ASIC 原型開發—— TimeQuest 時序分析器輕松實現了 ASIC 和 HardCopy 設計的 SDC 約束移植,加速了 ASIC 原型開發。
2.3.1.2 軟件及器件支持
Quartus II從6.0版本開始就支持TimeQuest時序分析器。
TimeQuest支持MAXII、Cyclone系列、Stratix系列和HardCopyII器件。
在QII中選擇以上器件時,可以選擇使用經典時序分析器或TimeQuest分析器。
第三代65nm器件和Arria GX器件僅支持TimeQuest分析器。
Altera建議在90nm 和 65nm 工藝節點上所有新設計都使用TimingQuest。
2.3.1.3 軟件應用
通過Settings->Timing Analysis Settings可以選擇全編譯過程中最后使用經典時序分析器還是TimeQuest分析器。
圖2.27
通過Tools->TimeQuest Timing Analyzer,或點擊按鈕 進入TimeQuest如圖3.2。
操作步驟如下:
1) 生成時序網表(post-map或post-fit):通過Netlists菜單或者任務窗下Create Timing Netlist命令。
2)讀取SDC文件(可選):通過Constraints菜單或者任務窗下Read SDC File命令,若工程還沒有指定SDC文件則需要新建一個。
3)約束設計:使用Constraints菜單或者控制窗輸入tcl命令添加時序約束。
4)更新時序網表:通過Netlists菜單或者任務窗下Update Timing Netlist命令,從而在當前網表中應用新加入的約束。
5)生成時序報告:通過Report菜單或者雙擊任務窗下對應項(如圖3.5),生成所需報告,如圖3.2。
6)保存時序約束:通過Constraints菜單或者任務窗下Write SDC File命令,保存時序約束,打開SDC文件可以看到加的所有約束對應的命令。
7)應用SDC文件進行編譯:在Settings->TimeQuest Timing Analyzer頁面添加生成的SDC文件,然后進行全編譯,即得到符合用戶時序約束要求的編譯結果。
2.3.2寫腳本添加時序約束
Quartus自從9.0版本之后就不支持Classic Timing Analyer了,采用synopsis公司的綜合工具Design Compiler中綜合時編寫腳本的方式來添加時序約束。
想必大家對於DC中寫腳本已經很熟悉了,Quartus中只用加時鍾約束部分,沒有DC中那么復雜。(舉例說明)
set PERIOD_CLK 20.000 create_clock \ -period $PERIOD_CLK \ -name clk \ [get_ports {clk}] derive_pll_clocks create_clock \ -name clk_virtual \ -period $PERIOD_CLK set_clock_latency -source \ -early 0.100 \ [get_clocks clk_virtual] set_clock_latency -source \ -late 0.110 \ [get_clocks clk_virtual] set_clock_latency -source \ -early 0.100 \ [get_clocks clk] set_clock_latency -source \ -late 0.110 \ [get_clocks clk] derive_clock_uncertainty set_input_delay \ -clock [get_clocks {clk_virtual}] \ -max 1.0 \ [all_inputs] set_input_delay \ -clock [get_clocks {clk_virtual}] \ -min 0.8 \ [all_inputs] set_output_delay \ -clock [get_clocks {clk_virtual}] \ -max 1.0 \ [all_outputs] set_output_delay \ -clock [get_clocks {clk_virtual}] \ -min 0.8 \ [all_outputs]
2.3.3配置內部信號上全局時鍾樹
提高時鍾速率的方法,除了在TimeQuest中對時鍾信號添加約束之外,可以通過將一些非全局高扇出信號拉到全局時鍾線或局部時鍾線上,即掛到全局時鍾樹或局部時鍾樹上。
那么怎么知道那些信號是非全局高扇出信號呢?
在自己建立的工程綜合之后的目錄下面會看到綜合報告,其中*.fit.rpt是布局布線報告,打開之后,查詢Non-Global High Fan-out Signal,會看到一些非全局的高扇出信號,你會開始意識到,有些信號是需要拉到全局時鍾線的,比如使能信號,接地,局部復位等等,高扇出的信號最好拉到全局時鍾線,速度會提高。(有例為證)
將內部信號拉到全局時鍾線的方法如下:
(1)打開Assignments中的Assignment Editor
圖2.43
(2)可以看到三個工作框,上面那個顯示可以設置的目錄,中間框右鍵可以看到Node Finder…,打開可以看到內部信號查詢窗口
圖2.45
(4)如圖將復位信號添加過來,然后確定
圖2.46
(5)在配置名稱下拉菜單中選取Global Signal(Accepts wildcards/groups)
圖2.47
(6)配置Value——>on
(7)保存配置