Tcl與Design Compiler (十二)——綜合后處理


 本文如果有錯,歡迎留言更正;此外,轉載請標明出處 http://www.cnblogs.com/IClearner/  ,作者:IC_learner

概述

  前面也講了一些綜合后的需要進行的一些工作,這里就集中講一下DC完成綜合了,產生了一些文件,我們就要查看它生成的網表和信息,下面就來介紹DC綜合完成之后要進行哪些工作:

                   

也就是說,DC一般完成綜合后,主要生成.ddc、.def、.v和.sdc格式的文件(當然還有各種報告和log)

.sdc文件:標准延時約束文件:

                   

里面都是一些約束,用來給后端的布局布線提供參考。

 

Scan_def.def文件:DFT、形式驗證可能用到

               

里面包含的是一些掃描鏈的布局信息,需要注意的是,必須在生成ddc網表文件之前生成.def(也就先生成.def文件),以便將def文件包含在ddc文件中。

 

.sdf、.v文件

標准延時格式和網表格式文件,用於后仿真。

 

下面是輸出(生成)文件的一些命令:

                

 

1.綜合網表處理與生成

(1)綜合網表的處理:

  完成綜合並通過時序等的分析后,我們需要把設計和約束以某種格式存儲好,作為后端工具的輸入。

  把設計以VHDL或Verilog格式存檔時,需要去掉或避免文件中有assign指令,因為該指令會使非Synopsys公司的工具在讀入文件時產生問題。該指令也可能會在反標( back-annotation)流程中產生問題。此外,要保證網表中沒有特別的字符。例如,寫出網表時,有時網表中會有反斜線符號“\”,對於這個符號,不同的工具有不一樣的理解。

·assign:

多端口連線(multiple port nets)會在網表中用assign指令表示,如下圖所示:

           

上面的設計中有冗余的端口(包括內部端口,又稱層次引腳)。如果我們將設計展開(flatten), DC可能把它們優化掉,即去掉這些端口。但是如果我們不展開設計,將得到下面的結果:

    Output   Reset_AluRegs,Latch_Instr,....

    assign   Reset_AluRegs=Latch_Instr;

多端口連線,即一條連線連接多個端口,三種類型:直通連線(Feedthroughs),即從輸入端直接到輸出端;連線驅動多個端口(也就是上面的那個情況);常數連線驅動多個端口。

  在默認的情況下,如遇到上述的情況,DC寫出網表時,會在網表產生assign指令。如果設計中有多端口連線,應該在編譯過程中將它們去掉。去掉多端口連線使用下面的命令:

  set_fix_multiple_port_nets  -all  -buffer_constants  [get_designs  *]

 

·特殊符號:  

  特別字符是指除數字,字母或下划線以外的任何字符。當DC寫出網表時,如果遇到信號Bus[31],它會插入反斜線符號“\”,將其變為\BUS[31]。但是總線Bus[31:0」中的一個信號還用Bus[31],沒有用反斜線符號,也就是說設計里面可能會遇到即使用到了Bus[31]又用到Bus[31:0]這種情況(比如一組總線網A方向走,而同時又有這組總線的最高位充當某個控制信號)。這時方括弧不是名字的一部分,它們是位分隔符。這時候,同一個信號用了兩種符號串表示(也就是Bus[31]和Bus[31:0]中的第31位是同一個信號,但是卻有不同的字符串表示,這是不好的,一些工具可能解讀出錯)。最好的辦法是把設計中的反斜線符號去掉,用有效的字符代替非有效(特別)的字符。

  用change_names命令可將設計中的特別字符去掉。change_names命令的其中一選項是“-rules",后面可跟用自定義的命名規則或Verilog命名規則。在DC中用define_name_rules命令來規定自定義的命名規則。例如我們可以用該命令來指定可以使用哪些字符,禁止使用哪些字符,名字的長度等。一般來說,Verilog命名規則可以處理幾乎所有的特殊字符。

  執行change_names命令后,它會把不允許使用的字符用允許使用的字符來代替。VHDL語言中,多維數組(multi-dimensionalarrays)使用方括弧作為字下標的分隔符(word subscript delimiters)。為了避免使用反斜線符號,先使用change_names命令把字下標的分隔符轉換為下划線。如下所示:

                  

                       

 

(2)相關文件的生成

  經過處理之后的網表就可以生成了,除了了網表之外,我們還可以生成時序、面積報告等,相關命令如下所示:

                 

一個是生成.ddc文件,里面包含了很多信息。一個是生成.v的門級網表。一個是生成標准約束文件,以供后面進行布局布線提供參考。

  最后,進行網表處理和生成文件的綜合命令如下所示:

                

 

 

                    

 

                

 

 

2.時序檢查與報告的生成

  最后,我們要講檢查設計報告、連接設計報告、DC綜合過程中的信息報告、時序檢查報告、面積檢查報告等進行生成,方便我們進行檢查:

    # Get report file

    redirect   -tee   -file   ${REPORT_PATH}/check_design.txt      {check_design                    };

    redirect   -tee   -file   ${REPORT_PATH}/check_timing.txt      {check_timing                    };

    redirect   -tee   -file   ${REPORT_PATH}/report_constraint.txt {report_constraint -all_violators};

    redirect   -tee   -file   ${REPORT_PATH}/check_setup.txt       {report_timing -delay_type  max  };

    redirect   -tee   -file   ${REPORT_PATH}/check_hold.txt        {report_timing -delay_type  min  };

    redirect   -tee   -file   ${REPORT_PATH}/report_area.txt       {report_area                     };

 這里使用的重定位的命令redirect,意思是將后面{}中命令的執行結果保存到文件中(命令的具體用法前面有講到,也可以通過man redirect進行查看)

 

(1)時序報告的查看:

  下面主要介紹時序報告的檢測,畢竟timing is everything。關於時序報告的查看,前面也講得很清楚了,這里再來具體講述一下。  

  Design Compiler中,常用report_timing命令來報告設計的時序是否滿足目標(Check_timing:檢查約束是不是完整的,在綜合之前查看,要注意不要與這個混淆)。

時間報告有四個主要部分:

·第一部分是路徑信息部分,如下所示:

                    

主要報告了工作條件,使用的工藝庫,時序路徑的起點和終點,路徑所屬的時鍾組,報告的信息是作建立或保持的檢查,以及所用的線負載模型。

 

·第二部分是路徑延遲部分                  

  這個路徑延遲部分是DC計算得到的實際延遲信息;命令執行后,對於下圖中的路徑,得到的一些路徑信息,有了單元名稱(point通過該單元的延時Incr),經過這個單元后路徑的總延時等信息:

                 

上圖的解釋:

  路徑的起點是上一級D觸發器的的時鍾端。

  input external delay:(由於上一級D觸發器的翻轉(路徑的起點也就這里)、芯片外部組合邏輯而經歷的)輸入延時約束(set_input_delay),也就是數據到達芯片的數據輸入管腳的延時建模,這個延時是1ns;r表示上升延時,f表示下降延時

  clock network delay(idle):時鍾信號從芯片的端口到內部第一個寄存器的延時是0.5ns;

  Data1(in):芯片輸入端口到芯片內部真正數據輸入端之間的線延時,是0.04ns。(可以認為是管腳的延時)

  U2/y : 這里,前面0.12表示u2這個器件的翻轉/傳輸延時,意思是從這個器件的數據輸入端(包括連線),到輸出端y的延時是0.12ns。后面的1.66的意思是從路徑起點到u2的y輸出的延時是1.66ns.

  ...

  最后u4/D這里就是終點了,D觸發器的數據輸入端;當然終點也可能是芯片的輸出端口。

  報告中,小數點后默認的位數是二,如果要增加有效數(字),在用report_timing命令時,加上命令選項“-significant_digits"。報告中,Inc:是連線延遲和其后面的單元延遲相加的結果。如要分別報告連線延遲和單元延遲,在使用report_timing命令時,加上命令選項"-input_pins"。

 

·第三部分是路徑要求部分,如下圖所示:

                 

這個路徑要求部分是我們約束所要求的部分;值-0. 06從庫中查出,其絕對值是寄存器的建立時間。值2.17為時間周期加上延時減去時鍾偏斜值再減寄存器的建立時間(假設本例中的時鍾周期是2 ns)。

 

·第四部分是時間總結部分,如下圖所示:

                 

DC得到實際數據到達的時間和我們要求的時間后,進行比較。數據要求2.17ns前到達(也就是數據延時要求不得大於2.17ns),DC經過計算得到實際到達時間是2.15ns,因此時序滿足要求,也就是met,而不是時序違規(violation)。時間冗余(Timing margin),又稱slack,如果為正數或‘0',表示滿足時間目標。如果為負數,表示沒有滿足時間目標。這時,設計違反了約束(constraint violation)。

 

(2)timing_report的選項與debug

  在進行靜態時序分析時,report_timing是常用的一個命令,該命令有很多選項,如下所示(具體可以通過man進行查看):

                 

 

  我們可用report_timing的結果來查看設計的時序是否收斂,即設計能否滿足時序的要求。我們也可以用其結果來診斷設計中的時序問題,對於下面的報告,

           

外部的輸入延遲為22 ns,對於時鍾周期為30 ns的設計,顯然是太大了。設計中,關鍵路徑通過6個緩沖器,需要考慮這些緩沖器是否真的需要;OR單元的延遲為10. 72ns,似乎有問題。關鍵路徑通過四個層次划分模塊,從模塊u_proc,經模塊u_proc/u_dcl,經模塊u_proc/u_ctl,到模塊u_int。前面我們說過,DC在對整個電路做綜合時,必須保留每個模塊的端口。因此,邏輯綜合不能穿越模塊邊界,相鄰模塊的組合邏輯並不能合並。這4個層次划分模塊使得DC不能充分使用組合電路的優化算法對電路進行時序優化,是否考慮需要進行模塊的重新划分。

 

(3)設計違規檢查

               

當然有時候並不是真正的設計違規,有可能是約束設計過緊,有可能是設計的輸入延時太緊導致violation,比如前面那個實戰中,綜合得到的結果是可以滿足要求的,但是由於約束不當而導致DC爆出違規。

 

(4)查看分組優化結果:

  主要是查看路徑分組之后,路徑的時序情況是什么樣的,如下所示:

               

 

本節的基本內容就是這樣了,本節就沒有什么實戰之類了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM