網絡課程《數字集成電路靜態時序分析基礎》的筆記
地址:https://www.iccollege.cn/portal/courseDetail/193.mooc
TCL的應用Synopsys Tcl例如,統計時鐘數量,人數顯然不合理,可以用腳本語言統計,但是可以更加簡單,直接用Synopsys Tcl的拓展命令更加便捷
參考資料
TCL在EDA工具中的拓展與應用通過對Design Object的分析,了解和學習DC獲取電路並進行解析的方法
常見指令get_ports指令功能:返回design中對應的port object
如何查看deign當中有沒有一個叫做CLK的port?
get_ports CLK
{CLK}
如何查看deign當中有沒有一個port叫做SPI?get—_ports SPI
No object Found!
查看design當中所有的port(*可以統配任何字符)get_port *
{A B C D CLK OUT[0] OUT[1]}
假設port名字交{CLKA CLKB OUTA OUT B INA INB},如何得到所有C開頭的port?get_ports C*
{CLKA CLKB}
get_cells指令功能:返回design中對應的cell的instance name objectget_cells U4
{U4}get_cells *
{U1 U2 U3 U4}get_cells *3
{U3}
get_netsget_nets INV*
{INV0 INV1}get_nets *
{A B C D CLK BUS0 BUS1 INV0 INV1 OUT[0 OUT[1]]}llength [get_object_name [get_nets *]]
11
sizeof_collection [get_nets *]
11
get_pinsget_pins */Z
{INV0/Z INV1/Z}get_pins */Q*
{ENCODER/Q0 ENCODER/Q1 REGFILE/Q[1] REGFILE/Q[0]}
數據類型數據類型:」object(對象)「及其「屬性」
說明:
任何一個屬性都可以用get_attribute得到list_attribute -class *可以得到object的屬性Cell object
屬性ref_name:用來保存器map到reference cell名稱get_attribute[get_cell -h U3] ref_name
{INV}Pin object
屬性owner_net:用來保存與之相連的net的名稱get_attribute [get_pins U2/A] owner_net
{BUS0}Port object
get_attribute [get_ports A] direction
{in}
get_attribute [get_ports OUT[1]] direction
{out}Net object
get_attribute [gets_nets INV0]
{INV0}
get_object_name [get_nets INV0]
{INV0}
get_attribute INV0 full_name
Error:No attribute found理解屬性以後,就可以完成更多的任務:
get_* -f:-f這個option可以用來過濾屬性,以得到我們想要的objectget_ports * -f "direction==in"
{A B C D CLK}get_pins * -f "direction==out"
{U1/Q0 U1/Q1 U2/Z U3/Z REGFILE/Q[0] REGFIEL/Q[1]}get_cells * -f "ref_name==INV"
{U2 U3}
如何的得到電路中所有的inverter,那麼應該輸入什麼樣的腳本?1.直接使用Synopsys TCL指令
get_buffers -inverter
2.人工拓展TCL指令
get_inverters
使用TCL語言控制設計EDA工具講述一個簡單的、入門級的Synopsys DesignComplier自動化方案,供初學者參考,感興趣的同學可以對該方案進行優化升級
特點
自動化電路綜合平臺只需要用戶將待綜合的設計與庫文件放入一個文件加,修改與帶綜合設計對象有關的環境變量參數,在命令窗喚醒DC的指令,即自動化地完成綜合過程,並得到綜合後的網表文件和所需報告
運行流程:
#!/bin/csh -f
# 清除之前的文檔
\rm -rf *.log *svf alib* reports log work
# 新建文件夾
mkdir reports work
# 啟動DC並運行top.tcl
dc_shell-xg-t -32bit -f ./top.tcl
建立reports與work兩個文件夾。reports文件夾存放報告,work存放文檔和腳本top.tcl按先後順序啟動子腳本,最總生成script.tclDC讀取script.tcl中的約束,最總完成綜合,並將所有報告寫入reports文件夾中top.tcl腳本運行機制:
set_library.tcl:生成設定庫文件中的search path的約束read_design.tcl:生成讀入設計文件的約束create_clock.tcl:生成時鐘源相關的約束set_cons.tcl:生成保存門級網表、各種reports文件的約束注意:
庫文件、代碼、時鐘、復位、輸入輸出等均根據代碼自動進行匹配,並生成相應的約束最終所有約束都被寫入到script.tcl中,供DC讀取,完成最終的邏輯綜合過程代碼讀入約束生成工作流程:
設計文件通常使用verilog文件,所以拓展名通常為v,所以先將變量extension設為v調用filelist.tcl腳本,將所有拓展名為v的文件的文件路徑輸出到一個名為v_list的文檔打開v_list文檔,根據文件的內容讀入設計文件的指令輸出道道script.tcl腳本set extension v
代碼filelist生成模塊filelist.tcl
source[file join $::script_path test/filelist.tcl]
#調用filelist.tcl腳本
set des[open[file join $::script_path test/work/v—list]r]
set design [gets $des] #打開vlist文檔
for{}{$design!=""}{set design [gets $des]}{
puts $script [format "read_file -format verilog %s"$deslgn]
#輸出讀入設計文件指令
}
puts $scnpt[format "current_design %s" $top]
#輸出設置頂層設計指令功能:便利目標文件下所有文件,並將拓展名(.v)符合要求的文件完成路徑輸出到指定的文檔,最終形成DC讀取verilog代碼的約束,寫入script.tcl中
工作流程:
判斷當前目錄下的文件拓展名是否與設置的變量extension一直,如果一致,就將該文件路徑輸出到指定的文件proc FindFile{myDirresult}{
時鐘約束生成子模塊
if([catch {cd $WDir} err]}{
puts $result $err
return}
foreach myfile [glob-nocomplam *]{
cd $myDir #切換到對應路徑
if{[string equal $myfile ""]}{
return} #如果是空文件夾就返回
set fullfile [file join $myDir $myfile]
if{[file isdirectory $myfile]}{
FindFile $fullfile $result #如果有下一級路徑則遞歸調用本函數
}elseif{[string equal [file extension $fullfile] [format ".%s" $::extension]]){#判斷擴展名是否與要求一致
puts $result $fullfile}}}功能和流程:
首先調用parameter.tcl腳本,讀取其中用戶對時鐘源指定的參數,如時鐘周期 等;調用find_clk.tcl腳本,該腳本會將搜索頂層設計中的所有的clk埠,並將所有搜索結果輸出到一個名為clk_list的文檔;打開clk_list檔,將對時鐘埠施加約束的指令輸出到script.tcl腳本。source [file join $::script_path test/findclk.tcl]
匹配時鐘埠子模塊
#調用find_clk.tcl腳本
set a [open [file join $::script_path test/work/clk_list] r]
#打開v_list文檔
set b [gets $a]
set result [open[file join $::script_path test/work/script.tcl]
#DC時鐘約束
for {} {$b!=""}{set b [gets $a]}{
puts $result [format "create_clock -name \"clock\" -period %u -waveform {0 %d}{ %s }" $::clk_source[expr $::clk_source/2]$b]
#將生成時鐘源的指令輸出到scnpt.tcl腳本
puts $result [format "set_dont_touch_network \[get_ports%s\]"$b]
#對時鐘網絡設置don't touch
puts $result [format "set_drive 0 \[get_ports%s\]"$b]
#設置時鐘埠驅動為無窮大
puts $result [format "set_ideal_network \[get_ports%s\]"$b]
#設置時鐘端為理想網線
}
close $result功能:搜索代碼中所有的時鐘埠,將結果輸出到work文件夾下的clk_list文檔
工作流程
打開v-list文檔,在其中找到頂層設計的路徑,並打開設計文件;並將匹配到的時鐘埠的埠名輸出到work文件夾下的clk_list文檔for {} {[eof $designfile]==0}{set fdesign [gets $designfile]}{
最終,所有的約束都被寫入了script.tcl中。script.tcl腳本完全由自動化電路綜合平臺生成,並非人工編寫;在自動化電路綜合平臺運行後,由頂層腳本調用各子模塊腳本生成該腳本。生成該腳本後,由頂層腳本調用該腳本,由此實現對設計的綜合。子模塊腳本生成該腳本。生成該腳本後,由頂層腳本調用該腳本,由此實現對設計的綜合。
if{[regexp{input.*} $fdesign a]}{
#利用正則表達式匹配到聲明輸入埠那一行
if{[regexp {[^,( ]*clk[^,;]*}$a rport]}{
#利用正則表達式在那一行匹配後綴為clk的埠
puts $fport $rport
#將匹配到的端囗名輸出到clk_list文檔
}
}
}路科驗證V2課程大升級啦,升級後的V2pro,不僅保留了原本V2的所有內容,還添加了關於vim、linux、DVT的操作教程,以及寄存器模型自動化,更有定製的個性項目,為你的簡歷添磚加瓦。如果想要學習SV和UVM,想要入門或者轉行驗證,路科驗證V2pro不容錯過!如果對課程有興趣可以後臺聯繫我,或者掃描下面二維碼報名,都可以獲得優惠!