脚本推荐-verilog自动对齐

发布时间 2023-04-11 01:20:59作者: 绿叶落秋风

verilog自动对齐脚本

简介

  • vscode中的verilog-utils可以自动例化
  • 但是没有保留注释
  • 导致注释丢失比较严重
    • 这个为后期的维护带来了巨大的工作量
  • 基于此,使用TCL脚本完成同样的工作

bat脚本启动

  • 文件 verilog_utils_expand.bat
rem get script path
set pns_own=%0
set p_own=%~dp0%
set pns_own_tcl="%p_own%verilog_utils_expand.tcl"
cd  %p_own%


rem call tcl
call %SF_P_WISH% %pns_own_tcl% 
pause
  • 其中SF_P_WISH时tcl wish的安装路径下的exe

TCL/TK脚本例化

# get script own path
variable v_own [file normalize [info script]]
set pns_own [file nativename $v_own]
set p_own [file dirname $pns_own]
set n_own [file tail [file rootname $pns_own]]
set s_own [file extension $pns_own]

# get param
# set pns_param "$p_own/param.ini"
# set f_path [open $pns_param r]
# set v_param [read $f_path]
# close $f_path
set v_param [clipboard get]
puts $v_param

# regsub module
set v_param2 ""
set l_module_name [regexp -all -inline {[\n]*[\s]*module[\s]*([\w]+)[\s]*\#[\s]*\(} $v_param]
if {[llength $l_module_name] == 0} {
    puts {no parameter like module xx #() }
    set l_module_name [regexp -all -inline {[\n]*[\s]*module[\s]*([\w]+)[\s]*\(} $v_param]
    if {[llength $l_module_name] == 0} {
        puts {no parameter like module xx( }
    } else {
        set m_module [lindex $l_module_name 1]
        regsub {[\n]*[\s]*module[\s]+} $v_param "" v_param1
        regsub {[\s]*\([\s]*} $v_param1 "u_$m_module\(\n    " v_param2
    }
} else {
    set m_module [lindex $l_module_name 1]
    regsub {[\n]*[\s]*module[\s]+} $v_param "" v_param1
    regsub {[\n]*[\s]*\)\([\s]*} $v_param1 "\n\)u_$m_module\(\n    " v_param2
    
}
# regsub param
regsub -all -line {[\n]*[\s]*parameter[\s]*} $v_param2 "\n    \." v_param3
regsub -all -line {[\s]*=[\s]*} $v_param3 "\(" v_param4
regsub -all -line {[\n]*[\s]*\)[\s]*} $v_param4 "\)\n)" v_param5
regsub -all -line {[\s]*\,[ ]*\/\/} $v_param5 "\)\,\/\/" v_param6
regsub -all -line {[\s]*\,[ ]*\n} $v_param6 "\)\,\n" v_param6
regsub -all -line {[\n]*[\s]*input[\s]*} $v_param6 "\n    \.\(" v_param7
regsub -all -line {[\n]*[\s]*output[\s]*} $v_param7 "\n    \.\(" v_param8
regsub -all -line {[\s]*\[[\w\+\-\*\/]+:[\w\+\-\*\/]+\][\s]*} $v_param8 "" v_param9
regsub -all -line {[\s]*\[[\w\+\-\*\/]+:[\w\+\-\*\/]+\][\s]*} $v_param8 "" v_param9
regsub -all -line {[ ]*\.\(([\w]+)[ ]*} $v_param9 "    \.\\1\(\\1" v_param10


puts $v_param10


# clip clear and write text
eval clipboard clear
clipboard append $v_param10

destroy .


小结

  • 可以完成verilog的例化
  • 可以保留注释
  • 使用时使用vscode调用bat脚本即可
  • 能满足需求