脚本推荐-verilog自动对齐

Posted on 2023-04-11 01:10  绿叶落秋风  阅读(602)  评论(0编辑  收藏  举报

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% 
rem pause
  • 其中SF_P_WISH时tcl wish的安装路径下的exe
    TCL/TK下载

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]*[ ]*module[ ]+} $v_param "" v_param1
    regsub {[\n]*[ ]*\)[\s]*\([ ]*} $v_param1 "\n\)u_$m_module\(   " v_param2
    
}
# regsub param
regsub -all -line {[ ]*parameter[ ]*([\w]+)[ ]*\=[ ]*[\w\']+[ ]*\,} $v_param2 "    \.\\1\(\\1\)," v_param2
regsub -all -line {[ ]*parameter[ ]*([\w]+)[ ]*\=[ ]*[\w\']+[ ]*} $v_param2  "    \.\\1\(\\1\)" v_param2
regsub -all -line {[ ]*\[[\w\+\-\*\/]+:[\w\+\-\*\/]+\][ ]*} $v_param2 " "  v_param3
regsub -all -line {[ ]*input[ ]*([\w]+)[ ]*} $v_param3  "    \.\\1\(\\1\)" v_param3
regsub -all -line {[ ]*output[ ]*([\w]+)[ ]*} $v_param3 "    \.\\1\(\\1\)" v_param3
regsub -all -line {[ ]*inout[ ]*([\w]+)[ ]*} $v_param3  "    \.\\1\(\\1\)" v_param3


puts $v_param3
# clip clear and write text
eval clipboard clear
clipboard append $v_param3

# destroy win
set i_id [after 10 {destroy .}]



vscode联动

  • 添加快捷键(注意快捷键不要冲突)
    img
    {
        "key": "alt+m",
        "command": "workbench.action.tasks.runTask",
        "args": "verilog_utils"
    },
  • 添加任务(注意路径)
"tasks": [
        {
            "label": "verilog_utils",
            "type": "shell",
            "command": "D:/f1_library2/b0_script_app/c2_vscode_plug/verilog_utils_expand.bat",
            "args": [],
            "presentation": {
                "echo": false,
                "reveal": "never",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": false,
                "clear": false
            },
            "problemMatcher": []
        }
    ]

  • 检查效果
    • ctrl + C 复制module
    • alt + m 转化为例化端口
    • ctrl + v 粘贴到制定的位置
    • 理论上后两步可以合并,但是没有找到方法

小结

  • 可以完成verilog的例化

  • 可以保留注释

  • 使用时使用vscode调用bat脚本即可

  • 能满足需求

  • 缺陷:会把注释的端口释放,暂未找到解决方法