用DC綜合異步電路zz

http://benjaminweber-space.spaces.live.com/Blog/cns!902D90E6B6C36ACF!1177.entry用DC綜合異步電路

一般來說是不能用同步電路的綜合工具來綜合異步電路。同步電路會自動插入緩衝器,而這些緩衝器可能毀壞QDI電路的時序特性。然而手動生成門級網表又如何保證DRC能滿足流片要求呢?在我看來,爲了滿足max transition和maxcapacitence要求,緩衝器仍然是不可避免的。使用綜合工具來綜合異步電路仍然有可取之處。

回到主題。在這個帖子裏,我會講一些用DC綜合異步電路的基本問題:

  1. 異步元件庫
    實際上這個並不是很重要。當然我們需要建一個基本的硬件元件庫。對於4-phase的異步電路來說,同步電路的元件庫就基本夠用。比如說一個C-element就可以用如下的語句描述:
    assign Z = (I1&I2) | (I1&Z) |(I2&Z);
    這種方式看 起來很好,但是在後面會遇到問題。更好的方式是使用目標元件庫來搭建一個C-element,比如:
    module c2 ( a0, a1, q );
    input a0;
    input a1;
    output q;
    AO222EHD U1 ( .A1(q), .A2(a0), .B1(q), .B2(a1), .C1(a0), .C2(a1),.O(q) );
    endmodule
    這樣做的好處有兩點:我們可以直接找到一個C-element的pin;在必要的時候可以使用dont_touch來保護C-element不被拆解。
  2. timing loop
    異 步電路有很多timing loop。無論是否設定延遲優化約束,這些timingloop都必須被打斷。否則DC很可能會產生錯誤的結果或者使用過多的內存而產生內部錯誤。
    打斷這些timingloop可以用set_disable_timing命令。以下給出瞭如何把所有C-element的反饋迴路打斷:
    foreach_in_collection celln  [get_references-hierarchical c2_*] {
    set_disable_timing [get_object_name $celln]/U1 -from A1 -to O
    set_disable_timing [get_object_name $celln]/U1 -from B1 -to O
    }
    這裏我們使用get_references來獲得所有的C-element。對於每一個C-element,從反饋pin到輸出的時間計算都被禁止,這樣一個C-element就不存在timing loop了。在這裏也可以看到直接用目標原件搭建異步元件庫的好處。
  3. 限制 buffer的使用
    元件庫往往提供了不同驅動能力的緩衝器,從很小到很大。而實際的綜合過程中,禁止使用驅動能力過小或過大的緩衝器往往能得到更好的時序並減少運行時間。驅動能力過小的緩衝器對時序沒有太大的幫助,可能增大走線的難度同時增加了門數量(placement時間變長)。過大的緩衝器有較大的輸入負載並有着較高的動態功耗。
  4. 限制max_transition和max_capacitence
    實際實驗發現,即使沒有設定任何延時約束,使用合適的DRC約束仍然能改變電路的速度性能。這裏給出的建議是使用適中的max_transition和max_capacitence會得到較好的速度結果。
  5. 使用set_max_delay來約束延時
    顯然在沒有時鐘的情況下我 們不能使用clock來約束電路。用virtualclock往往也是行不通的。異步電路的控制電路較爲複雜,直接使用virtual clock意味着使用input port到outputport的簡單約束。然而這種約束得到的關鍵路徑往往和實際的關鍵路徑相差甚遠。用set_max_delay來設定更爲細化的路徑約束有更好的結果。需要指出的是,DC默認set_max_delay的起點不能是其他時序路徑的中間點。也就是說,一旦一個pin被設爲一個path的起點,那麼它也被設上了disable_timing的屬性。所以,用set_max_delay來打斷timingloop也是一個有效的方法(在該約束的理解上,SoC encounter和ICC不同,所以最好使用ICC爲佈局佈線工具)。
  6. 合理的約束
    所有的路徑最好都有約束。這裏包括關鍵路徑和主要的反饋路徑。但是他們有區別。對於關鍵路徑我們需要它儘量得快,但是反饋路徑,只要足夠快就可以。所以在約束的時候,對於關鍵路徑可以過約束,但是對於反饋路徑,一定不能過約束。
  7. 使用不同的權重
    DC的slack計算是negtive_slack*weight。通過控制不同路徑的weight,我們就能夠告訴DC先解決那些路徑的時序問題(DC先解決slack最大的路徑)。設定不同路徑的權重可以使用group_path命令。
  8. min library
    同步電路往往使用min_max分析。用max library分析setup,同時用minlibrary分析hold。對於異步電路來說,我們不需要分析hold問題(max_delay屬於setup,min_delay屬於hold)。這樣我們就可以把min library換成typicallibrary。這樣有一個好處,就是DC生成的sdf文件中,min_delay實際上是typ_delay。如果需要得到在typical環境下的速度性能,仿真的時候使用sdf的min delay就可以了。
發佈了48 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章