本文如果有錯,歡迎留言更正;此外,轉載請標明出處 http://www.cnblogs.com/IClearner/ ,作者:IC_learner
1、邏輯綜合的概述
synthesis = translation + logic optimization + gate mapping .
DC工作流程主要分為這三步
Translation : 翻譯,主要把描述RTL級的HDL語言,在約束下轉換成DC內部的統一用門級描述的電路(Generic Boolean Gates)(DC自己的庫表現),以GTECH或者沒有映射的ddc形式展現。
Logic optimization :邏輯優化, 就是把統一用門級描述的電路進行優化,就是把路徑調整一下,門給改一下等等。
Gate mapping :門級映射,把優化了的統一門級描述,DC用別的廠商的工藝庫把電路給映射出來,得到一個.ddc文件。這個.ddc文件可以包含許多豐富的信息,比如映射的門電路信息與網表、.v格式的網表、延時信息(sdf)、工作約束(sdc)等信息。(.ddc不能用文本編輯器打開)。.ddc這個包含的網表文件是實際意義的網表文件,而.v這個形式的網表問價是用來做后仿真的文件。
延時信息的得出:線負載模型、拓撲結構模型(現在)。
2、DC的啟動方式
啟動DC的方式有三種:
·GUI:DC的圖形化界面格式。用圖形化界面跑一下DC。(大規模設計不可能用這種方式)。
啟動方式是:$design_vision
我們可以通過 man design_vision或者design_vision -help來查看DC的啟動選項:
例如,可以使用$ design_vision -topographical_mode啟動design compiler,意思是:-topographical是啟動DC的拓撲模式,-topo是簡寫。關於什么是拓撲模式,為什么要啟動拓撲模式,后面會有相關的敘述。
此外,還有下面的啟動方式:
·dc_shell: DC以命令行的格式啟動:$dc_shell
我們可以通過 man dc_shell或者dc_shell -help來查看DC的啟動選項,不過我們可以發現,這些選項是一致的,是告訴我們如何啟動DC,啟動DC的時候可以加載哪些選項。
·Batch mode:批處理模式,也就是,前面那兩種方式只是把DC啟動起來,還沒有真正地工作(即編譯工程),前面兩個方式需要通過source命令把腳本寫進去以后,DC讀取才真正工作。而這種批處理模式是,在啟動的同時,告訴DC執行哪些腳本,例如:
$dc_shell -topo -f run.tcl | tee -i run.log
意思是:使用拓撲模式啟動DC,啟動的同時執行run.tcl腳本文件,並且把啟動過程中顯示在終端的信息記錄到run.log中。| tee -i就是寫進信息的管道命令,講dc_shell -topo -f run.tcl 執行后顯示的信息(輸出結果),流入到run.log文件中。這樣子是為了在DC啟動失敗的時候,通過查看啟動信息,進而排除錯誤。
本教程這三種方式在后面都有流程介紹,本教程以命令行和批處理為主,其中dc_shell主要用來介紹DC的相關命令,此外命令行和批處理模式是現在設計的主要操作方式。
3、DC-Tcl語言的基本結構
下面介紹常見的tcl語言語法,這些語法在進行編寫tcl腳本的時候比較常見。
Tcl的語法比較簡單,依葫蘆畫瓢就可以知道寫的是什么了。
我們在dc_shell的環境下,介紹tcl的一些簡單語法(即啟動DC,在dc_shell里面運行tcl文件):
通過編寫example.tcl中的內容,來記錄一下tcl的語法:
·設置變量
example.tcl的內容為:
意思是:設置name這個變量,這個變量的值為ICer;
設置num這個變量,這個值為 0;
echo是打印的意思,$表示引用,分別是打印name中的值,打印num中的值.
我們可以檢查一下是否有語法錯誤,使用dcprocheck命令:
運行一下,打印出了name和num這兩個變量的值:
·if-else語句:
與C語言、Verilog語言不一樣,這里的條件是用大括號{}來進行包括的,然后要執行的內容也是通過{}來表示的。特別注意,{}的使用都有空格間隔開
檢查沒有錯誤,進行執行:
·switch 結構
puts也是顯示/打印的命令,執行后的結果如下:
還可以添加默認的選項:
執行后,顯示:
·while循環
執行的結果如下:
·for循環
運行的結果如下所示:
for循環的格式跟C語言一樣,也有三個選項,初始條件,停止循環條件,變量遞增選項。
Continue跟C語言一樣,不執行本次循環。
·數組(列表)與數組(列表)的遍歷
首先,39行那里創建了一個名字為names的數組(列表),數組(列表)的內容有5項。
Foreach則是逐個遍歷,查看數組的內容。首先把names這個列表的內容一次放進num_list這個變量里面,然后一次查看
附注:foreach_incollection對物集(collection)遍歷。關於物集這個概念在后面會有說到,這里先提及一下,有一個初步印象。
執行結果如下:
·子程序的定義和調用:
調用要在dc_shell中調用:
·最后是文件的處理:文件的讀寫
寫:
執行的結果如下所示:
Data.txt里面就有hello tcl
讀:
注意gets的用法,執行后的結果如下:
Tcl的基本語法結構差不多就是這樣了,Tcl的使用需要結合Tcl自帶的一些命令,比如說自己的函數、錯誤處理、正則表達式等,此外還要結合DC的命令,總之就是具體問題具體分析。