99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

電子工程師 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:空白MAX ? 2021-04-15 14:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

什么是TCL?

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

TCL學(xué)習(xí)

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

# 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是一種弱語(yǔ)言類型,不需要聲明類型,直接通過(guò)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

}

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

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

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

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

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

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

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

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)建一個(gè)列表,列表是TCL中的一個(gè)數(shù)據(jù)類型。

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

lappend在一個(gè)列表后添加一個(gè)元素。

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

vencrypt是questasim的命令,用于將文件進(jìn)行加密,加密后的文件可以被questasim識(shí)別編譯,但是無(wú)法閱讀。比如下面的代碼的后半段就是前半段進(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!”

}

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

set fd [open $prj_path/hdl_design_file_list.tcl w+],open命令以特定模式打開文件,返回一個(gè)文件標(biāo)識(shí)符。這與c語(yǔ)言類似,w+ 讀寫方式打開文件,如文件存在則清空文件內(nèi)容,否則創(chuàng)建新的空文件。puts -nonewline $fd ”# “,向fd中寫入內(nèi)容,不開啟-nonewline則會(huì)在末尾添加換行符。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)建了添加源文件的過(guò)程。

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

regsub -all “ “ $old_content {} new_content,-all 沒(méi)有這個(gè)開關(guān)時(shí),regsub只替換第一個(gè)匹配,有了這個(gè)開關(guān),regsub將把所有匹配的地方全部替換。第二項(xiàng)為正則匹配表達(dá)式,第三項(xiàng)為目標(biāo)字符串,第四項(xiàng)為替換內(nèi)容。regsub通過(guò)第二項(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)建了一個(gè)修改波形格式的過(guò)程。

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

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

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

編輯:lyn

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

    關(guān)注

    11

    文章

    1783

    瀏覽量

    89942

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    效果器的基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《效果器的基礎(chǔ)知識(shí).doc》資料免費(fèi)下載
    發(fā)表于 03-26 14:30 ?4次下載

    功率器件熱設(shè)計(jì)基礎(chǔ)知識(shí)

    功率器件熱設(shè)計(jì)是實(shí)現(xiàn)IGBT、碳化硅SiC等高功率密度器件可靠運(yùn)行的基礎(chǔ)。掌握功率半導(dǎo)體的熱設(shè)計(jì)基礎(chǔ)知識(shí),不僅有助于提高功率器件的利用率和系統(tǒng)可靠性,還能有效降低系統(tǒng)成本。本文將從熱設(shè)計(jì)的基本概念、散熱形式、熱阻與導(dǎo)熱系數(shù)、功率模塊的結(jié)構(gòu)和熱阻分析等方面,對(duì)功率器件熱設(shè)計(jì)基礎(chǔ)知識(shí)
    的頭像 發(fā)表于 02-03 14:17 ?746次閱讀

    PCB繪制基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《PCB繪制基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 01-21 15:20 ?6次下載
    PCB繪制<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    EMC基礎(chǔ)知識(shí)-華為

    EMC基礎(chǔ)知識(shí)-華為
    發(fā)表于 01-06 14:09 ?4次下載

    萬(wàn)字長(zhǎng)文,看懂激光基礎(chǔ)知識(shí)!

    深入介紹激光基礎(chǔ)知識(shí),幫助您輕松理解激光領(lǐng)域的關(guān)鍵概念和原理。
    的頭像 發(fā)表于 12-20 09:49 ?1071次閱讀
    萬(wàn)字長(zhǎng)文,看懂激光<b class='flag-5'>基礎(chǔ)知識(shí)</b>!

    FPGA基礎(chǔ)知識(shí)及設(shè)計(jì)和執(zhí)行FPGA應(yīng)用所需的工具

    本文將首先介紹FPGA的基礎(chǔ)知識(shí),包括FPGA的工作原理以及為什么要使用FPGA等,然后討論設(shè)計(jì)和執(zhí)行FPGA應(yīng)用所需的工具。
    的頭像 發(fā)表于 11-11 11:29 ?1813次閱讀
    FPGA<b class='flag-5'>基礎(chǔ)知識(shí)</b>及設(shè)計(jì)和執(zhí)行FPGA應(yīng)用所需的工具

    品質(zhì)管理基礎(chǔ)知識(shí)

    品質(zhì)管理基礎(chǔ)知識(shí)
    的頭像 發(fā)表于 11-01 11:08 ?664次閱讀
    品質(zhì)管理<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    TWL6030氣體監(jiān)測(cè)基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《TWL6030氣體監(jiān)測(cè)基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 10-29 10:02 ?0次下載
    TWL6030氣體監(jiān)測(cè)<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    Verilog HDL的基礎(chǔ)知識(shí)

    本文繼續(xù)介紹Verilog HDL基礎(chǔ)知識(shí),重點(diǎn)介紹賦值語(yǔ)句、阻塞與非阻塞、循環(huán)語(yǔ)句、同步與異步、函數(shù)與任務(wù)語(yǔ)法知識(shí)
    的頭像 發(fā)表于 10-24 15:00 ?1195次閱讀
    Verilog HDL的<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    TI電池監(jiān)控器IC的HDQ通信基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《TI電池監(jiān)控器IC的HDQ通信基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 10-12 10:01 ?1次下載
    TI電池監(jiān)控器IC的HDQ通信<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    在TI SoC上集成AUTOSAR:基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《在TI SoC上集成AUTOSAR:基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 10-11 11:50 ?0次下載
    在TI SoC上集成AUTOSAR:<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    負(fù)載開關(guān)基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《負(fù)載開關(guān)基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 10-08 09:56 ?2次下載
    負(fù)載開關(guān)<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    全新的半導(dǎo)體基礎(chǔ)知識(shí)

    《全新的半導(dǎo)體基礎(chǔ)知識(shí)》首先對(duì)流行于電子書刊上數(shù)十年之久的經(jīng)典半導(dǎo)體基礎(chǔ)知識(shí)中存在的謬誤進(jìn)行了全方位的討論,然后以半導(dǎo)體內(nèi)部結(jié)構(gòu)為抓手,以G型半導(dǎo)體(客供電子型半導(dǎo)體)、H型半導(dǎo)體(主供電子型半導(dǎo)體
    的頭像 發(fā)表于 09-20 11:30 ?2032次閱讀
    全新的半導(dǎo)體<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    超聲波傳感基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《超聲波傳感基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 09-04 10:21 ?0次下載
    超聲波傳感<b class='flag-5'>基礎(chǔ)知識(shí)</b>

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

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