!干貨! 為設計指定輸入驅動強度 set_driving_cell set_drive set_input_transition


推文主要內容:
-
為設計指定輸入端口驅動強度;
-
set_driving_cell命令;
-
set_drive命令;
-
set_input_transition命令;
-
這三個命令之間的關系與區別。
相信大家在做邏輯綜合或者寫sdc約束的時侯總糾結上面三條命令該怎么用,那么它們之間有什么關系呢,且聽我慢慢道來。
為設計指定輸入驅動強度
我們知道,一個Cell的延遲與兩個內容有關,一個是Input Transition,另一個是Output Load,如下圖所示:
因此,對於整個設計的輸入端口(Input Port)而言,要想讓邏輯綜合工具(如DC)、布局布線工具(如ICC)、STA工具(如PT)精確計算輸入端口后邊驅動的單元的延遲,必須讓工具知道輸入端口的Transition時間。
如下圖所示,Transition時間越短(即越快Fast),Cell的延遲越小(從A端口到FF2的D端口延遲越小);反之,Transition越慢,從A端口到FF2的D端口的電路的延遲越大。因此我們需要為設計的輸入端口定義驅動能力。
一般的EDA工具(如DC等)默認所有輸入端口的Transition時間都是0,這顯然過於理想,因此,要想精確獲得輸入端口處電路的時序,為所有輸入端口設置合理的驅動能力或者Transition時間非常重要。
定義輸入端口的驅動能力可以是標准單元庫中的一個緩沖器或反相器(buffer/inverter)單元(用set_driving_cell命令設置),也可以是指定的電阻值(用set_drive命令設置),還可以是set_input_transition,那么它們有什么區別呢?該如何選取?
對輸入端口指定驅動強度,方法好多哦,到底選哪種?
用set_driving_cell、set_drive還是set_input_transition呢?
set_driving_cell命令用法
應用場景:Block level
EDA工具(如DC)默認輸入端口信號的Transition時間是0;
我們通過set_driving_cell命令來設置某個輸入端口前面是什么驅動單元驅動它的,EDA工具會從指定的庫中查找得出更加真實的Transition時間來代替零Transition。
set_driving_cell命令的語法:
set_driving_cell
[-lib_cell lib_cell_name]
[-library lib]
[-rise] [-fall]
[-min] [-max]
[-pin pin_name]
[-from_pin from_pin_name]
[-dont_scale]
[-no_design_rule]
[-none]
[-input_transition_rise rtran]
[-input_transition_fall ftran]
[-multiply_by factor]
port_list
舉例:
例1:將ddfs的所有輸入端的驅動單元設置為DFF1的管腳Q,並忽略該管腳上的設計規則
current_design ddfs
set_driving_cell -lib_cell DFF1 -pin Q -no_design_rule [all_inputs]
例2:為MY_DESIGN的輸入端口A設置驅動單元為OR3B或者FD1的Qn輸出Pin。
set_drive命令用法
應用場景:Chip level
set_drive命令通過為輸入端口指定電阻值的方法來為其定義外部驅動強度。在邏輯綜合工具進行優化期間,工具根據設置的驅動強度來計算由該輸入端口驅動的邏輯電路的延遲。
對於芯片級的設計(即頂層設計)而言,它的輸入端口的驅動能力很難用工藝庫中的某個具體單元去量化,因此我們一般不能用set_driving_cell來為其指定驅動強度。我們一般在頂層通過set_drive命令定義輸人電阻的大小,由於在頂層,要驅動的是負載較大的IO單元,故需要的驅動能力較強,典型的值是0.05,單位取工藝庫中電阻的單位,一般為kΩ;
set_drive命令的語法:
set_drive
resistance
[-rise] [-fall]
[-min] [-max]
port_list
· 阻抗resistance:非負的驅動阻抗,該值越小表示驅動能力越大。(一個MOS管的開關模型是一個電阻串聯一個開關,驅動一個MOS管柵極的是上一級MOS管的漏端,它總是通過該電阻連接到電源或者地,這里設置的是MOS管等效電阻的大小);
· 端口名列表port_list:設置為哪些輸入端口設置驅動電阻。
由於通常情況下,設計的時鍾和復位端都由驅動能力很大的單元或樹形緩沖來驅動,所以可以用set_drive命令將這兩個端口的驅動電阻設置為0,也就是驅動強度為無窮大(該命令對當前設計有效)。
舉例:
例1:給設計的輸入端口A、B和C指定2.0 kΩ(單位一般是kΩ,跟庫中定義有關)的電阻,可以用該命令:
> set_drive 2.0 {A B C}
例2:為設計中的所有輸入端口指定12.3 kΩ的電阻,可以用該命令:
> set_drive 12.3 [all_inputs]
例3:將ddfs的時鍾和復位端的驅動設為無窮大,即驅動阻抗設為零:
current_design ddfs
set_drive 0 {clk, reset}
set_input_transition命令用法
應用場景:Chip level
我們可以用set_input_transition命令為輸入端口指定一個固定的transition時間,工具會用該transition時間來計算它驅動的邏輯電路的延遲。
對於頂層設計(Chip level的設計)而言,除了用set_drive命令之外,我們也可以使用set_input_transition命令來為其設置固定的transition時間,因為芯片外邊一般存在驅動能力比較強的器件和大電容。在這種情況下,transition時間相對獨立於當前設計中的電容。
Input Transition分為上升和下降的Transition時間。
set_input_transition命令的語法:
set_input_transition
transition
[-rise] [-fall]
[-min] [-max]
port_list
舉例:
例1:MY_DESIGN是Chip level的design,為其輸入端口A指定0.12ns的input rise和fall transition:
Summary總結
set_driving_cell與set_drive和set_input_transition的區別
我們也可以用set_driving_cell或set_drive或set_input_transition命令來指定輸入端口的驅動,那么它們有什么區別呢?
set_driving_cell命令通常是首選方法,因為它是最真實的模型。當我們的設計是模塊級(Block level)的design時,我們的設計前面一般還有其他的設計。那么前面模塊的輸出便是我們模塊的輸入,如下圖所示,我們可以根據外圍電路的輸出Cell來給自己的模塊指定驅動強度:
當我們的設計是芯片級(Chip level)的頂層設計時,芯片外圍電路要驅動的是負載較大的IO單元,故需要的驅動能力較強,一般無法用庫里面已有的單元來指定驅動強度,因此一般用set_drive命令。
對於頂層設計(Chip level的設計)而言,除了用set_drive命令之外,我們也可以使用set_input_transition命令來為其設置固定的transition時間,因為芯片外邊一般存在驅動能力比較強的器件和大電容。在這種情況下,transition時間相對獨立於當前設計中的電容。
如果多種指定方式發生沖突,那么在工具中,最近使用的命令會覆蓋先前的命令。
綜合應用舉例
對於內部的一個模塊sub_design2,由於是Block level的design,因此我們根據已知的前級設計的輸出單元用set_driving_cell來為本模塊指定輸入端口的驅動強度。
對於Chip level的頂層設計top_level_design而言,芯片外部的電路需要驅動負載較大的PAD,因此需要使用set_drive命令來通過設置電阻值來指定輸入端口的驅動強度。
網易雲課堂視頻課程
鏈接:https://study.163.com/course/introduction/1005909004.htm《Calibre DRC教程-一鍵搞定DRC》
《Calibredrv教程-提高流程自動化》
《搭建IC設計的EDA虛擬機/服務器》