0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于TCL的基礎(chǔ)知識淺析

電子工程師 ? 來源:CSDN技術(shù)社區(qū) ? 作者:空白MAX ? 2021-04-15 14:15 ? 次閱讀

什么是TCL?

TCL,Tool Command Language,是一種腳本語言,主流的EDA工具都支持TCL進(jìn)行操作。TCL經(jīng)常被用于 快速原型開發(fā),腳本編程, GUI和測試等方面。

TCL學(xué)習(xí)

接下來以一個實(shí)際的tcl腳本為例,簡單介紹TCL的使用。這個腳本是用于modelsim/qusetasim仿真的腳本,mentor將tcl進(jìn)行拓展,稱之為do文件,實(shí)際語法還是TCL。腳本來自鏈接:

# testbench name without .v , .vt , .vhd , .vht

set testbench_name conv

# simulation time ; ns/us/ms/min

set sim_time 1us

# auto add files when $auto_add_file==1; add file list when $auto_add_file==0

quietly set auto_add_file 1

# project path

set prj_path E:/conv_sim

# backup path

set bkp_path E:/conv_sim/backup

# monitor resolution ratio , for example : 1920 x 1080

quietly set m_width 1920

quietly set m_height 1080

if 0 {

my first program in Tcl program

Its very simple

}

首先,第一行,TCL采用#進(jìn)行單行注釋,多行注釋使用判斷句注釋,就像末尾的if那樣。TCL是一種弱語言類型,不需要聲明類型,直接通過set聲明變量并進(jìn)行賦值。字符串變量直接輸入即可,不需要額外的聲明。這里直接set的變量是全局變量。

proc new_prj {new_prj_name} {

global prj_path

set new_prj_path E:/conv_sim/$new_prj_name/

quit -sim

project close

if { [file exists $new_prj_path]==0 } {

file mkdir $new_prj_path

}

project new $new_prj_path $new_prj_name work

if { [file exists $new_prj_path/src]==0 } {

file mkdir $new_prj_path/src

}

file copy -force -- $prj_path/sim.do $new_prj_path

puts “create new project successfully!”

puts “current project path : ”

pwd

}

這里定義了一個用于創(chuàng)建工程的命令new_prj。

proc為procedure的縮寫,TCL使用proc聲明過程,用proc聲明后,過程就會成為腳本的一個命令,直接使用。對于在過程中定義的變量,因?yàn)樗鼈冎荒茉谶^程中被訪問,并且當(dāng)過程退出時會被自動刪除,所以稱為局部變量;在所有過程之外定義的變量我們稱之為全局變量。TCL 中,局部變量和全局變量可以同名,兩者的作用域的交集為空:局部變量的作用域是它所在的過程的內(nèi)部;全局變量的作用域則不包括所有過程的內(nèi)部。如果我們想在過程內(nèi)部引用一個全局變量的值,可以使用 global 命令。這樣在new_prj中就能訪問到全局變量prj_path。

變量的引用通過$進(jìn)行引用,會直接將表達(dá)式進(jìn)行替換。

quit是qusetasim的命令,用于退出軟件,加上選項(xiàng)-sim將只退出仿真而不會關(guān)閉軟件。project close也是qusetasim的命令,用于關(guān)閉工程。

file exists path,判斷是否存在指定文件夾。file mkdir path,創(chuàng)建文件夾。file copy -force — source targetDir 復(fù)制文件到指定目錄,這個命令把 source 中指明的文件或目錄遞歸的拷貝到目的地址 targetDir,只有當(dāng)存在-force選項(xiàng)時,已經(jīng)存在的文件才會被覆蓋。試圖覆蓋一個非空的目錄或以一個文件覆蓋一個目錄或以一個目錄覆蓋一個文件都會導(dǎo)致錯誤。

注意,-表示開關(guān)/選項(xiàng),--表示這后面再沒有開關(guān)(switchs)了,即后面以’-‘開頭的參數(shù)將不作為 switch。

puts用于打印,和sv中的$display一個作用。

proc encrypt_src {} {

global prj_path

set encrypt_path $prj_path/encrypt_src/

file mkdir $encrypt_path

set paths {}

set paths [glob -nocomplain -directory $paths */]

lappend paths $prj_path

foreach one_path $paths {

set vfiles [glob -nocomplain -directory $one_path *.v *.vt *.sv]

foreach one_file $vfiles {

set one_file_path $prj_path

vencrypt [append one_file_path $one_file] -d $encrypt_path

}

}

puts “encrypt HDL design file(s) successfully!”

}

這里利用questasim的vencrypt將工程內(nèi)的文件全部進(jìn)行加密。

set paths {}創(chuàng)建一個列表,列表是TCL中的一個數(shù)據(jù)類型。

glob和file是TCL提供的兩個進(jìn)行文件名操作的命令,用來操作文件或獲取文件信息。glob 命令采用一種或多種模式作參數(shù),并返回匹配這個(些)模式的所有文件的列表,其語法為:glob switches pattern pattern 。-nocomplain是一個開關(guān),使用這個開關(guān)允許glob返回空列表,不開啟的話,如果結(jié)果是空,則會返回錯誤。-directory,用于指定目錄,讓glob在這個目錄下進(jìn)行匹配。pattern代表正則匹配的模式,匹配成功的文件名將添加進(jìn)返回的列表。

lappend在一個列表后添加一個元素。

foreach遍歷整個列表的元素,中間變量為one_path。

vencrypt是questasim的命令,用于將文件進(jìn)行加密,加密后的文件可以被questasim識別編譯,但是無法閱讀。比如下面的代碼的后半段就是前半段進(jìn)行加密后的內(nèi)容。-d用于指定加密后的文件生成加密文件的存放位置。

module relu_core (

input clk, //clk

input rst_n, //reset

input [255:0] pooling_in,

input relu_bypass,

output [255:0] relu_out //output of pooling

);

wire [255:0] relu_result;

genvar i;

generate

for(i=0; i《32; i=i+1) begin

assign relu_result[i*8+7:8*i] = pooling_in[i*8+7] ? 8‘h00 : pooling_in[i*8+:8];

end

endgenerate

assign relu_out = relu_bypass ? pooling_in : relu_result;

endmodule

`pragma protect begin_protected

`pragma protect version = 1

`pragma protect encrypt_agent = “QuestaSim” , encrypt_agent_info = “10.6c”

`pragma protect key_keyowner = “Mentor Graphics Corporation” , key_keyname = “MGC-VERIF-SIM-RSA-2”

`pragma protect key_method = “rsa”

`pragma protect encoding = ( enctype = “base64” , line_length = 64 , bytes = 256 )

`pragma protect key_block

NROTnsk8pETOxl4QiAgkLU/279V7O329exd+zzLCVEaVhofiC+ppJtC4dQapAZkK

4CZaxp/gcINr0jlEzm2pBtmqhJ5Kd71mtMNPuUCpphC+J/VJ0JNsOVsVnG6dGztB

+2p8OzoWDWF4F+yAF7L6O7Vksq5afDXEwJDlkIfxzxg3PfwWjDbssR5lq731UMSE

a9cfMZZxe8OO7itVsCz/zAK+WKSZvpAlArpT2mHg76CMXN5ybxCzwXtjeAZf0piM

61waCYBncD+dloA+5uhHJxOj10CAE7jsF8rgi3bfMG/XqmneMRzL8ODqaLtolytR

h2xcuR63Zyi3tgTOeUvXSg==

`pragma protect data_method = “aes128-cbc”

`pragma protect encoding = ( enctype = “base64” , line_length = 64 , bytes = 528 )

`pragma protect data_block

8v6OffgbV/rkWBfwQvGwkfKmdYvvLkohFDLb+Qy+qVnoZgIFOFAFomkEaZ5b32l7

Qmw1d80d+hxDgn4XFA3qbNpn80H3EDx8+HhZL8GeoZw1Wkp4dlFpUcQLEJ3tNh4d

j314qMHeKj8Uu/4928YoJVMzojlFbn+vWh0ZTyzs5jLJa+EspgVZCSIvlPY9WYOQ

1HmF3kaj/0rJ35hmJXvy+ZMshKS031slUm/7jSxVj0kzdrNLGNYdgKIOvKTTu9vT

lYCjfkZSbLEGAXKWFlWSGCfqgb4sGc6uB0j+oKpE2yVOrMJaQ4rqHg0ykJiwn1fM

MwByU4SVRJK024OPjQXEL4aSQHgi0gvw30Ihxvcr4Do15HVZCBn43R6SVNvQNa0s

Nj6PLcT3jYPk9HZs0ZiykRR+LMLLlfFD9NFaN1s1PNZugAywB9TmYh8Vq1CY5w0Y

GxucPCAqYDn+jet1wFh3Rk/ybjj8ageR/4W+U0eKXF+Uu7YWfUApRkGH75Ru3yE/

f9JiC/xdmH6As5aWGzvNZk2g2BLzamLp7d4tmCQbizQSby38hKW8VOJmOzEQPWHg

UxKcN/VZzW6yPVrJxPRHRIb/qarIrx75IdFRZjYrCI9FFchJ3TASPSviufKyAWOj

jWIkYe8Z9yQ5fTMZwe7NhT27PfRe46HR9YuMP9lCCGcYplKVbG5xFwX6bRdqAqwK

`pragma protect end_protected

proc create_file_list {} {

global prj_path

set prj_files [project filenames]

set paths {}

set paths [glob -nocomplain -directory $paths */]

lappend paths $prj_path

set fd [open $prj_path/hdl_design_file_list.tcl w+]

foreach one_path $paths {

set vfiles [glob -nocomplain -directory $one_path *.v *.vt *.vhd *.vht]

foreach one_file $vfiles {

set exists_num 0

set one_file_path {}

append one_file_path $prj_path

append one_file_path $one_file

foreach one_prj_file $prj_files {

if {$one_file_path == $one_prj_file} {

incr exists_num

}

}

if {$exists_num == 0} {

puts -nonewline $fd “# ”

}

puts $fd $one_file_path

}

}

close $fd

puts “create file list successfully!”

}

這里定義了一個創(chuàng)建文件列表的過程。

set fd [open $prj_path/hdl_design_file_list.tcl w+],open命令以特定模式打開文件,返回一個文件標(biāo)識符。這與c語言類似,w+ 讀寫方式打開文件,如文件存在則清空文件內(nèi)容,否則創(chuàng)建新的空文件。puts -nonewline $fd ”# “,向fd中寫入內(nèi)容,不開啟-nonewline則會在末尾添加換行符。close關(guān)閉文件。

proc add_file {} {

global prj_path auto_add_file

set add_count 0

set del_count 0

set prj_files [project filenames]

if {$auto_add_file == 1} {

set paths [glob -nocomplain -directory $prj_path */]

lappend paths $prj_path

foreach one_path $paths {

set vfiles [glob -nocomplain -directory $one_path *.v *.vt *.vhd *.vht]

foreach one_file $vfiles {

set exists_num 0

foreach one_prj_file $prj_files {

if {$one_file == $one_prj_file} {

incr exists_num

}

}

if {$exists_num == 0} {

project addfile $one_file

incr add_count

}

}

}

} elseif {$auto_add_file == 0} {

if {[file exists $prj_path/hdl_design_file_list.tcl] == 0 ||

[file size $prj_path/hdl_design_file_list.tcl] 《= 1} {

create_file_list

}

set fd [open $prj_path/hdl_design_file_list.tcl r]

set old_content [read -nonewline $fd]

close $fd

regsub -all “ ” $old_content {} new_content

regsub -all + $new_content {} new_content

foreach one_file [split $new_content

] {

if {[regexp ^# $one_file] == 0 && $one_file != “

”} {

set exists_num 0

foreach one_prj_file $prj_files {

if {$one_file == $one_prj_file} {

incr exists_num

}

}

if {$exists_num == 0} {

project addfile $one_file

incr add_count

}

} elseif {[regexp ^# $one_file] == 1 && $one_file != “

”} {

set one_file [string trim $one_file “#”]

foreach one_prj_file $prj_files {

if { $one_file == $one_prj_file} {

project removefile $one_file

incr del_count

}

}

}

}

}

puts -nonewline “add ”

puts -nonewline $add_count

puts “ file(s) successfully!”

puts -nonewline “remove ”

puts -nonewline $del_count

puts “ file(s) successfully!”

}

創(chuàng)建了添加源文件的過程。

project filenames是questasim的命令,返回當(dāng)前工程的文件列表。

regsub -all “ “ $old_content {} new_content,-all 沒有這個開關(guān)時,regsub只替換第一個匹配,有了這個開關(guān),regsub將把所有匹配的地方全部替換。第二項(xiàng)為正則匹配表達(dá)式,第三項(xiàng)為目標(biāo)字符串,第四項(xiàng)為替換內(nèi)容。regsub通過第二項(xiàng)進(jìn)行匹配,將第三項(xiàng)中匹配的目標(biāo),替換為第四項(xiàng),存到第五項(xiàng)中。

proc wave_style_set {} {

global testbench_name default_color

foreach sig [find signals $testbench_name/*] {

switch -regexp -nocase -- $sig {

/*/*rst+ {add wave -radix binary -color [lindex $default_color 0] $sig}

/*/*clk+ {add wave -radix binary -color [lindex $default_color 1] $sig}

/*/*en+ {add wave -radix binary -color [lindex $default_color 2] $sig}

/*/*cnt+ {add wave -radix decimal -color [lindex $default_color 3] $sig}

/*/*data+ {add wave -radix hex -color [lindex $default_color 4] $sig}

/*/*flag+ {add wave -radix binary -color [lindex $default_color 5] $sig}

default {add wave -radix hex -color [lindex $default_color 6] $sig}

}

}

}

創(chuàng)建了一個修改波形格式的過程。

switch -regexp -nocase — $sig ,和c語言的switch一樣。TCL 支持三種匹配方式:-exact 方式, -glob方式, -regexp 方式,缺省情況表示-glob 方式。-exact 方式表示的是精確匹配, -glob 方式的匹配方式和 string match命令的匹配方式相同, -regexp 方式是正則表達(dá)式的匹配方式。-nocase是regexp的匹配選項(xiàng),是大寫字母也被當(dāng)作小寫來處理,相當(dāng)于不區(qū)分大小寫字符。最后一個變量就是被用來作測試的值 。每行的開頭,比如/*/*rst+ ,用這個正則匹配進(jìn)行選擇。

lindex $default_color 0引用列表default_color 的第0項(xiàng)。

alias ne “new_prj”

alias es “encrypt_src”

alias af “add_file”

alias br “backup_prj”

alias cf “create_file_list”

alias cc “compile_changed”

alias cr “.main clear”

alias rr “run”

alias ra “run_all”

alias sw “save_wave”

alias aw “l(fā)oad_wave”

alias wr “write_report”

alias df “display_info”

alias dh “do_help”

為過程創(chuàng)建別名。通過別名也能夠調(diào)用過程

8311e0a8-9dac-11eb-8b86-12bb97331649.gif

編輯:lyn

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • TCL
    TCL
    +關(guān)注

    關(guān)注

    10

    文章

    1699

    瀏覽量

    88277

原文標(biāo)題:TCL簡單教程

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C++語言基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?6次下載

    FPGA基礎(chǔ)知識介紹

    電子發(fā)燒友網(wǎng)站提供《FPGA基礎(chǔ)知識介紹.pdf》資料免費(fèi)下載
    發(fā)表于 02-23 09:45 ?24次下載

    鴻蒙開發(fā)【設(shè)備開發(fā)基礎(chǔ)知識

    鴻蒙開發(fā)基礎(chǔ)知識講解
    的頭像 發(fā)表于 01-29 18:44 ?772次閱讀
    鴻蒙開發(fā)【設(shè)備開發(fā)<b class='flag-5'>基礎(chǔ)知識</b>】

    射頻與微波基礎(chǔ)知識

    射頻與微波基礎(chǔ)知識
    的頭像 發(fā)表于 01-16 10:05 ?676次閱讀
    射頻與微波<b class='flag-5'>基礎(chǔ)知識</b>

    電氣技術(shù)基礎(chǔ)知識

    電氣技術(shù)基礎(chǔ)知識
    的頭像 發(fā)表于 12-14 09:11 ?1347次閱讀
    電氣技術(shù)<b class='flag-5'>基礎(chǔ)知識</b>

    電子元器件的基礎(chǔ)知識

    電子元器件的基礎(chǔ)知識
    的頭像 發(fā)表于 12-04 10:42 ?4563次閱讀
    電子元器件的<b class='flag-5'>基礎(chǔ)知識</b>

    端接電阻基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《端接電阻基礎(chǔ)知識.doc》資料免費(fèi)下載
    發(fā)表于 11-21 09:31 ?0次下載
    端接電阻<b class='flag-5'>基礎(chǔ)知識</b>

    SPI協(xié)議基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《SPI協(xié)議基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 11-16 10:32 ?1次下載
    SPI協(xié)議<b class='flag-5'>基礎(chǔ)知識</b>

    電池的基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《電池的基礎(chǔ)知識.doc》資料免費(fèi)下載
    發(fā)表于 11-15 11:29 ?1次下載
    電池的<b class='flag-5'>基礎(chǔ)知識</b>

    紅外熱成像基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《紅外熱成像基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 11-01 09:44 ?5次下載
    紅外熱成像<b class='flag-5'>基礎(chǔ)知識</b>

    開關(guān)電源基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《開關(guān)電源基礎(chǔ)知識.ppt》資料免費(fèi)下載
    發(fā)表于 10-27 14:15 ?50次下載
    開關(guān)電源<b class='flag-5'>基礎(chǔ)知識</b>

    TTL與BJT的基礎(chǔ)知識

    教科書上面在講述TTL工作原理時候,運(yùn)用到了BJT雙極性三極管的基礎(chǔ)知識,比如:倒置,鉗位,深飽和,飽和壓降。這些基礎(chǔ)知識在教材上并沒有特別明晰的說明。這里對此做了一些自己的思考和整理,歡迎指正。
    的頭像 發(fā)表于 10-21 11:01 ?3154次閱讀
    TTL與BJT的<b class='flag-5'>基礎(chǔ)知識</b>

    電子元器件基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《電子元器件基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 10-20 14:58 ?30次下載
    電子元器件<b class='flag-5'>基礎(chǔ)知識</b>

    汽車電子基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《汽車電子基礎(chǔ)知識.doc》資料免費(fèi)下載
    發(fā)表于 10-10 09:48 ?4次下載
    汽車電子<b class='flag-5'>基礎(chǔ)知識</b>

    單片機(jī)基礎(chǔ)知識分享

    電子發(fā)燒友網(wǎng)站提供《單片機(jī)基礎(chǔ)知識分享.pdf》資料免費(fèi)下載
    發(fā)表于 10-07 11:06 ?2次下載