一、DFF的類型介紹
寄存器默認值,也叫復位值,是當reset或者set有效時寄存器輸出的值。對于一個DFF來說,如下圖,當reset為0時,Q輸出0;當set為0時,Q輸出為1(外部使用時保證reset與set不同時為0)。
(圖一)
也就是說,當需要復位值為1時,把set拉低;當需要復位值為0時,把reset拉低,如下圖。一般來說寄存器的默認值不是1就是0,所以接死掉的reset和set pin就可以省掉。
(圖二)
因此,stdcell庫里的dff可以分成以下幾種:
- DFFSR,同時帶set和reset pin
- DFFR,只帶reset pin
- DFFS,只帶set pin
另外,QN是Q的取反,很多時候只需要用到其中的一個,所以QN也不一定有??偨Y成下表:
帶QN | 不帶QN |
---|---|
DFFSRN | DFFSR |
DFFRN | DFFR |
DFFSN | DFFS |
(表一)
二、修改默認值的方法
方法一:如果DFF同時帶RN和SN,交換RN和SN的連線
這種方法最簡單,premask和postmask eco都適用。但一般自動綜合工具是不會同時用同時帶RN和SN的DFF的,因為這樣面積不是最優。所以需要在綜合階段人為強制讓綜合工具只用同時帶RN和SN的DFF,如果面積不是瓶頸的情況下。
方法二:如果只帶RN或者SN,換DFF類型(Premask ECO)
在Premask ECO時,我們完全可以像重新綜合的網表一樣直接換DFF類型。這種方法對于premask eco非常友好,不需要增加邏輯單元,也不會惡化時序。
方法三:如果只帶RN或者SN,互換DFF(Postmask ECO)
在Postmask ECO時,我們沒辦法隨意替換DFF類型。因為DFF的個數和類型是固定的,這時只能修改金屬層。
如果修改默認值的兩個dff,一個需要“0變1”,另一個需要“1變0”,且這兩個dff物理位置很近,那么可以互換這兩個dff的連線。如果是同一個時鐘域、復位域,那么就只需要交換D、RN(SN)、Q/QN這三組pin。
這個方法除了上面提到的限制,還有如果“0變1”和“1變0”的dff個數不相等,那么就無法完全交換成功。
方法四:如果只帶RN或者SN,D和Q端插inverter(Postmask ECO)
這是一種普遍適用的方法,只需要在D和Q端各插一個inverter。如果帶QN,又可以省一個inverter。如下圖,通過反相器可以等價變換只帶RN或SN的DFF。
(圖三)
(圖四)
這種替換方法操作簡單,易實現,不會帶來連線擁擠,利于DRC收斂。因為不需要修改時鐘pin,不會動到時鐘樹,只需要數據通路插入一個inverter,所以對時序影響也非常小。
但這個方法也會帶來一個問題,就是在做LEC(邏輯等價性檢查)時,需要讓工具開啟phase inversion的檢測,不然會報很多虛假non equal。
三、使用GOF來自動修改寄存器的默認值
方法二:換DFF類型(Premask ECO)
set_top("digital_top");
run_lec;
fix_design();
run_lec();
report_eco;
GOF默認就是用換DFF類型的方法,所以自動ECO腳本比較簡潔,讀進library和design后,先run_lec確認待eco的點是否正確,接下來做ECO,做完后再運行一次run_lec確認是否eco成功。
方法四:D和Q端插inverter(Postmask ECO)
set_top("digital_top");
set_flop_default_eco(1);
run_lec;
fix_design();
set_top("digital_top");
set_mapping_method("-phase");
run_lec();
report_eco;
與方法二相比,需要設置修改寄存器的方式后,再做ECO。做完ECO后需要設置phase inversion,讓工具自動檢測phase inversion的keypoint,以防虛假的non equal。
近期文章:
-
寄存器
+關注
關注
31文章
5325瀏覽量
120052 -
SET
+關注
關注
0文章
17瀏覽量
7937 -
dff
+關注
關注
0文章
26瀏覽量
3400
發布評論請先 登錄
相關推薦
評論