2.1 約束一個(gè)設(shè)計(jì)分為幾個(gè)方面? 總的分為,面積約束和時(shí)序約束。 2.2 面積約束的命令是什么? set_max_area 2.3 如何對時(shí)鐘進(jìn)行約束? 對時(shí)鐘進(jìn)行約束是對時(shí)鐘的周期,波形進(jìn)行描述。 使用create_clock 建立時(shí)鐘約束 2.4 如何對pll進(jìn)行約束? 如果存在PLL,那么首先對輸入的初始時(shí)鐘用create_clock進(jìn)行約束。 再用create_propagated_clock 對PLL輸出時(shí)鐘在基于輸入時(shí)鐘進(jìn)行約束。 2.5 什么叫虛擬時(shí)鐘約束? 虛擬時(shí)鐘是指在當(dāng)前要綜合的模塊中不存在的物理時(shí)鐘。比如,設(shè)計(jì)外的DFF的時(shí)鐘。 建立這樣的時(shí)鐘有益于描述異步電路間的約束關(guān)系。 2.6 DC可以對時(shí)鐘的哪些特性進(jìn)行約束? DC支持對時(shí)鐘的周期,波形,jitter,skew,latency 描述 2.7 如何約束時(shí)鐘的jitter? 使用set_clock_uncertainty -setup(-hold) 約束時(shí)鐘的jitter 2.8 如何約束時(shí)鐘的skew? 使用set_clock_uncertainty 約束時(shí)鐘網(wǎng)絡(luò)的skew 2.9 如何約束時(shí)鐘的latency? 使用 set_clock_latency -option ,option is source or network,the default is network。 2.10 如何對當(dāng)前設(shè)計(jì)的端口外部條件進(jìn)行約束? 端口的外部條件包括輸入驅(qū)動(dòng)大小,輸出負(fù)載的大小,扇出大小。 2.11 輸入端口被多大的驅(qū)動(dòng)所驅(qū)動(dòng)? 可以使用set_dirive 和set_driving_cell 2.12 輸出端口要驅(qū)動(dòng)多大的負(fù)載? 使用set_load 對輸出電容值進(jìn)行約束,單位根據(jù)工藝庫的define所定。 2.13 DC是基于path的綜合,那么在約束時(shí)如何體現(xiàn)? 我們知道,基于path會(huì)有四種路徑形式,DC中提供 create_clock 定義寄存器和寄存器之間的路徑; set_input_delay 定義輸入與寄存器之間的路徑; set_output_delay 定義寄存器與輸出之間的路徑; set_max_delay和 set_min_delay定義輸入和輸出的組合路徑; 2.14 set_input_delay 的目的是什么? 定義輸入延時(shí),來約束設(shè)計(jì)中輸入邏輯的時(shí)序 2.15 set_output_delay 的目的是什么? 定義輸出延時(shí),來約束設(shè)計(jì)中的輸出邏輯的時(shí)序 2.16 如何對組合電路進(jìn)行約束? 組合電路有set_max_delay 和set_min_delay進(jìn)行約束 2.17 如何對電路的速度進(jìn)行約束? 采用對電路時(shí)鐘周期的約束的方式來約束電路的速度,使用create_clock 2.18 當(dāng)一個(gè)組合電路超過了時(shí)鐘周期約束,那么該如何處理? 如果必須要滿足時(shí)鐘周期約束,那必須修改設(shè)計(jì),如果不必要嚴(yán)格要求,那么可以set_false_path可以躲過path check。 2.19 當(dāng)出現(xiàn)環(huán)路電路時(shí),如何約束電路? 對某一路徑使用set_false_path 2.20 如何加強(qiáng)設(shè)計(jì)規(guī)則的約束? DRC是電路必須滿足的設(shè)計(jì)規(guī)則,使用 set_max_capcitance set_max_fanout set_max_tansition 2.21 在添加了4種路徑約束后,如何為某些路徑移除約束呢? 使用set_flase_path使得某些路徑不進(jìn)行timing check 2.22 對于某些路徑需要在固定的幾個(gè)周期內(nèi)完成,如何對這些路徑進(jìn)行約束? 使用set_multicycle_path 對路徑進(jìn)行約束 2.23 在添加這些特殊的路徑約束,如何恢復(fù)原來通用的時(shí)序約束? 使用reset_path 2.24 如何對三態(tài)門進(jìn)行約束? 由于綜合時(shí),默認(rèn)三態(tài)門是enable的,所以對某些路徑要設(shè)置set_false_path 2.25 如何對門控時(shí)鐘進(jìn)行約束,以保證功能正常? 對門控時(shí)鐘電路進(jìn)行setup和hold檢查,使用set_gating_clock_check 2.26 設(shè)置對某些網(wǎng)絡(luò)比如時(shí)鐘或者復(fù)位不進(jìn)行添加buffer等操作,應(yīng)該怎么約束? 使用set_dont_touch_network 2.27 如何修正hold 時(shí)間沖突? 加入set_fix_hold約束 /************ Part 3 Compile stategy ******************/3.1 綜合時(shí),有多少選擇綜合策略呢? 可以使用top-down 和bottom-top。 3.2 top-down 方式有何優(yōu)點(diǎn)? 僅需提供單一TOP的script 將設(shè)計(jì)作為一個(gè)整體,可得到較好的結(jié)果 3.3 bottom-up方式有什么優(yōu)點(diǎn)? 對多時(shí)鐘的綜合更為適合 每個(gè)子模塊都有自己的script,便于管理 當(dāng)一個(gè)模塊改變時(shí),不用重新綜合所有設(shè)計(jì) 3.4 如何進(jìn)行time-budge? 使用characteristic 3.5 top-down 方式有何缺點(diǎn)? 編譯時(shí)間長 子模塊改變則整個(gè)設(shè)計(jì)都要重新綜合 對多時(shí)鐘設(shè)計(jì)綜合效果不好 3.6 bottom-up方式有什么缺點(diǎn)? 需要維護(hù)多個(gè)script 3.7 編譯時(shí)的 -incremental 是什么意思? 設(shè)計(jì)映射為門之后,時(shí)序和面積約束可以再定義,incremental確保維持以前的電路結(jié)構(gòu),只作改善時(shí)序和性能,不添加不必要的邏輯。 3.8 ... /******* Part 4 Analyze the report ******************/
4.1 如何看面積報(bào)告? report_area 4.2 如何看時(shí)序報(bào)告? report_timing 4.3 想對單獨(dú)的單元看面積報(bào)告, 用什么命令? report_cell 但是缺省的report_cell只能看current_design下面的一級的cell的面積.因此就有兩種方法解決這個(gè)問題: 1. 用report_cell [get_cells -hier *]可以看所有的cells面積 2. 用list_design列出所有的design, 然后改變current_design到你所想要看的那一級的cell, 然后直接用report_cell. 4.4 如何看設(shè)計(jì)環(huán)境和線載模型? report_design 4.5 若設(shè)計(jì)規(guī)則和時(shí)序違反約束,如何查看? 使用report_constraint -all_violators 4.6 如何查看連線的扇入,扇出,負(fù)載,電容和跳變時(shí)間? 使用report_net 4.6 如何看整個(gè)綜合后的網(wǎng)表中使用多少種類型的電路門? 使用report_hierarchy 4.7 如何查看timing exception的時(shí)序約束? 使用report_timing_requirements /****************** Part 5 Output the result ***********/ Design Compiler基礎(chǔ)概念 太基礎(chǔ)的概念我就不介紹了,大家可以參考相關(guān)文檔或是資料。這里我就說一些我覺得比較好的命令和概念。可能有點(diǎn)亂,我盡量說的條理些。 好習(xí)慣: 1、current_design確保當(dāng)前設(shè)計(jì)是自己需要的,不要讓DC根據(jù)一些潛在規(guī)則去判斷,顯式地聲明,保證你的約束都加到自己希望的設(shè)計(jì)上; 2、link確保link_library和search_path沒有問題,同上,DC執(zhí)行的時(shí)候也會(huì)隱式地檢查鏈接,但是只會(huì)報(bào)出警告,不會(huì)中斷下面的操作,這樣可能造成做無用功; 3、check_design檢查設(shè)計(jì)的端口連接,例化情況,保證下一步操作是在一個(gè)完整的設(shè)計(jì)上進(jìn)行的,同樣可以依靠命令返回值做到腳本自動(dòng)化,有問題就停下來,少做無用功; 4、write -f db -hier -out unmapd/TOP.db在讀入設(shè)計(jì)并檢查鏈接庫后保存,這對于大型設(shè)計(jì)有好處,可以節(jié)約讀入時(shí)間,下次操作不必重新讀入,浪費(fèi)時(shí)間; 5、約束單獨(dú)寫到一個(gè)文件中,這樣方便管理,調(diào)用時(shí)可以直接使用source命令(TCL模式),約束是加到當(dāng)前設(shè)計(jì)中,后面寫的同屬性的約束會(huì)覆蓋前面寫的; 6、加完約束后check_timing,確認(rèn)約束是否加的合適、完全。
在設(shè)計(jì)代碼中,引導(dǎo)語句“// synopsys translate_off”后直到“// synopsys translate_on”之間的語句被DC忽略
module( ) /*synthesis syn_black_box*/;
module( ); //synthesis black_box
|