數字邏輯綜合工具-DC-04 ——怎樣增加時序約束(Timing Constraints)

數字邏輯綜合工具-DC-04

——怎樣增加時序約束(Timing Constraints)

邏輯綜合的過程爲:轉化 優化 映射

另外還有環境約束和麪積約束

時序有三個大的方面
input logic paths
internal paths
output paths

一個項目需要有一個spec即設計說明書
裏面有項目的一些要求【文字性的描述】
(功能要求 性能要求)
邏輯綜合需要添加滿足這些要求的約束

在寫rtl代碼的時候最好是單個時鐘,單沿觸發,不然會生成一些很奇怪的FF

默認情況下,不告訴dc,默認爲同步時鐘
異步時鐘需要手動設置

做時序分析需要路徑
何爲路徑:
起點->終點
起點:Input port
Clock pin of FF or register
終點:Output port
input pin of a sequential device, except clock pin

【dc_shell 的一些Tcl命令】
create_clock -period 2 [get_ports clk]
【創建時鐘】【2ns】
【默認單位是ns】
【從工藝庫裏通過 report_lib 命令查看】

Tmax=Tc2q+Tcomb+Tsu

創建時鐘的時候可以指定佔空比 -waveform(注意,單位是時間),也可以指定一個名字-name

dc認爲時鐘是ideal的,dc不會處理時鐘網絡,因爲直接放置clk會有大扇出,dc算的不準!這部分的工作是後端去做的!!後端的CTS(時鐘樹綜合)

實際的時鐘會有sker和jitter,可以用一個參數對這些特性進行模仿:
set_clock_uncertainty -setup Tu [get_clocks clk]
一般來講,對setup建立一個模型
比如

會在原來setup time的基礎上增加不確定度

設置時鐘的上升時間、下降時間(即斜坡)
set_clock_transition Tt [gets_clocks clk]

這些值是猜測出來的,版圖畫好了之後,就不需要這些猜測的值了(CTS之後的STA)

在路徑涉及到外部端口的時候,如輸入端,需要人爲地告訴DC,之前的延時是多少


上一條:輸入延遲,(要指定clock,(-clock CLK))輸入端口要去除掉CLK,提取出端口進行約束
下一條:輸出延遲(clock不是輸出端口,不需要remove_from_collection)
【注意:一定要指定 clock】


如果設置了多次,後面的會把前面的覆蓋掉
這很有用,比如如果跟着input ports一起設置了CLK的input_delay, 可以通過remove_input_delay排除掉

【從input到output的組合路徑】

它處在兩個寄存器的中間
1、 創建一個時鐘
2、 clock uncertainty
3、 input_delay output_delay

【純組合電路】

從輸入直接到輸出,沒有時鐘,那麼就需要創建一個虛擬時鐘(沒有跟任何端口相連接)
這裏的時鐘是一個純虛擬的,因爲要跟其它電路相對於同一個參考源
create_clock -name VCLK -period 2

註釋:
1、 設置虛擬時鐘
2、 設置clock_uncertainty
3、 設置input_delay, output_delay
4、 根據純組合設計約束

估算:不知道怎麼設置input_delay 和output_delay的時候,採用組合電路40%+40%,剩下的20%留給clock_to_q和setup

【寄存器輸出】

所有的組合路徑都集中在D觸發器的輸入端口
只要告訴dc clock2q的時間是多少就可以了
【注意output_delay 的寫法 [expr 10-$clk_to_q_min]】(contamination delay)

【實操環節】
list_designs
【查看當前dc讀了的文件】

remove_design -hierarchy

analyze -format verilog [list top.v conter.v fsm_moore.v]
elaborate -architecture verilog top
【這兩個指令會實現link,elaborate會自動指定top,也可以手動敲link】
但是用current_design 命令更好讀

設計讀進來了,需要檢查一下語法命令
比如在例化的時候有沒有出現遞歸
check_design
如果返回0,就有問題

【在top腳本里,一般要做一些查錯,如果有錯,直接退出】

比如link_library沒有設,或者library找不到
然後check_design,如果發生了module之間的嵌套,這裏會查出來

在添加約束之前,建議執行reset_design
把以前的約束全部抹掉

【一部分在dc_shell下的實例操作:】

【創建時鐘】

注意,如果設計裏面涉及到了DDR器件,必須要指定佔空比,不然差別很大

【input_delay】
外面留60%


(需要把clk剔除掉)

【檢查時序問題check_timing】
檢查有沒有沒有約束到的

【compile】
compile -map_effort high -area_effort high -boundary_optimization
(盡最大努力做優化)
DC到這裏會去做綜合

【做完綜合之後,看看有沒有約束違規的】
report_constraint -all_violators
工作環境,線負載模型、設計規則都沒有約束,輸入的驅動單元沒有約束,輸出的負載沒有約束
還有一些別的命令:
report_timing -delay_type max【把最差的路徑報出來】(後面會講)

/*******************************
如何寫一個DC的約束腳本
********************************/



【第一步】:把設計讀進來,做一個link(也就是elaborate)
設置current_design
檢查link和check_design,如果做失敗了,就直接exit退出,因爲綜合是沒有意義的


【第二步】:把以前的約束給撤銷掉


【第三步】:暫不解釋


【第四(一)步】
【時鐘約束】
1、 指定一些常用的名字,設置一些常用的變量
時鐘的名字、週期、skew、transition time、latency、source latency
2、 創建時鐘,指定週期和端口名
3、 set_ideal_network 這句話其實不用加,但是可以幫助理解
4、 don’t touch也是一句廢話,對於ideal network,dc是不會管它的
5、 set_drive 0表示:驅動該端口的驅動能力無窮大
6、 set_clock_uncertainty模仿時鐘樹的skew
7、 set_clock_transition模仿時鐘的transition
8、 source latency 模仿pcb板上的晶振到芯片引腳上的latency
9、 network latency 芯片的引腳到ff的clk端口的latency


【第四(二)步】
【復位約束】
1、 指定復位的名字
2、 指定爲理想網絡
3、 指定爲don’t touch
4、 驅動能力無窮大


【第五步】
【input_delay】
1、 set_input_delay 指定時長,指定clk,指定除了clk以外的其它輸入端口
2、 指定驅動cell


【第六步】
【outputdelay】
具體過程與大概同上


【第七步】
【組合邏輯最大延時】
………………………………………………

//這裏很重要!!
【腳本寫好了,怎麼去檢查語法錯誤?】
在dc_shell下運行命令:
dc_shell> dcprocheck <腳本名>

【寫完之後,確認腳本沒有錯誤,在dc_shell下啓動腳本】
dc_shell> source …/script/top.tcl
(在top裏面放了一個重定向的命令,把約束文件讀進來)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章