112,Verilog-2005标准篇:Command line input(命令行输入)

开发人员除了通过读取文件来获取仿真的信息外,还可以通过调用仿真器的命令来指定信息,这些信息是以可选参数的形式提供给仿真器的。这些参数以加号 ( + ) 字符开头,与其他仿真器参数有明显区别,这些参数在下文中称为plusargs。

实现命令行输入功能的函数有两个:

- $test$plusargs

该系统函数会在plusargs列表中搜索用户指定的plusarg字符串。该字符串在系统函数的参数中指定为字符串或可解释为字符串的非实数变量。该字符串不得包含命令行参数的前导加号。命令行中的 plusargs 将按照提供的顺序进行搜索。如果所提供的某个plusargs的前缀与所提供字符串中的所有字符匹配,函数将返回一个非零整数。如果命令行中没有任何plusarg与所提供的字符串匹配,函数返回的整数值为零。

例如:使用命令“+HELLO”运行仿真器时,如果有如下的verilog代码:

则仿真器会产生如下输出:

- $value$plusargs

$value$plusarg系统函数会在plusargs列表(类似于 $test$plusargs 系统函数)中搜索用户指定的plusarg字符串。该字符串在系统函数的第一个参数中指定为一个字符串或一个可解释为字符串的非实数变量,该字符串不应包括命令行参数的前导加号。命令行中的 plusargs 将按照提供的顺序进行搜索。如果提供的某个plusargs的前缀与提供的字符串中的所有字符匹配,函数将返回一个非零整数,字符串的剩余部分将转换为user_string中指定的类型,并将结果值存储到提供的变量中。如果没有找到匹配的字符串,函数将返回一个非零整数,并且不修改所提供的变量。函数返回0时不会产生警告。

在提供给仿真器的plusarg列表中,与指定的user_string的plusarg_string部分相匹配的第一个字符串,就是可供转换的plusarg字符串。匹配的plusarg的剩余字符串(剩余字符串是plusarg字符串中与用户plusarg_string匹配部分之后的部分)应从字符串转换为格式字符串所指示的格式,并存储在所提供的变量中。如果没有剩余的字符串,存储到变量中的值应为 0 或空字符串值。

点赞加关注博主(ID:FPGA小飞)的博文,咱们一起系统学习verilog最终标准IEEE Std 1364-2005吧!

" 信号声明对齐脚本 ver 1.0 function! AlignVerilogSignals()range let s:max_type = 0 let s:max_reg = 0 let s:max_bits = 0 let s:max_name = 0 let s:port_list = [] let signal_lines = getline(a:firstline, a:lastline) " 第二阶段:解析内容 for raw_line in signal_lines let line = substitute(raw_line, '\s*$', '', '') " 清理行尾空格 " 处理独立注释行 if line =~ '^\s*//' call add(s:port_list, {'type': 'comment', 'content': line}) continue " 空白行处理(仅记录类型) elseif line =~ '^\s*$' call add(s:port_list, {'type': 'blank'}) continue endif " 处理端口声明 let clean_line = substitute(line, '\s*//.*$', '', '') " 移除行尾注释 let clean_line = substitute(clean_line, '^\s*,', '', '') " 移除行首逗号 " 改进后的正则表达式(支持无空格紧接位宽) let parts = matchlist(clean_line, \ '^\s*\(reg\|wire\)\?\s*\(\[.*\]\)\?\s*\(\w\+\)') if !empty(parts) " 提取端口元素(处理bits字段中的Tab) let regwire = !empty(parts[1]) ? parts[1] : '' let bits = !empty(parts[2]) ? substitute(parts[2], '\t', ' ', 'g') : '' let name = parts[3] let comment = matchstr(line, '//.*$') " 保留原始注释 " 更新对齐参数 let s:max_reg = max([s:max_reg, len(regwire)+1]) let s:max_bits = max([s:max_bits, len(bits)]) let s:max_name = max([s:max_name, len(name)]) " 存储端口信息 call add(s:port_list, { \ 'type': 'port', \ 'regwire': regwire, \ 'bits': bits, \ 'name': name, \ 'comment': comment}) endif endfor " 第三阶段:生成对齐内容 let formatted = [] let cnt = 0 let s:last_blank = 0 " 空白行状态标记 for item in s:port_list if item.type == 'comment' call add(formatted, item.content) let s:last_blank = 0 " 空白行压缩逻辑 elseif item.type == 'blank' if !s:last_blank call add(formatted, '') let s:last_blank = 1 endif else let port = item let prefix = (cnt == 0) ? ' ' : ' ,' " 各字段对齐处理(强制使用空格) let reg_str = printf('%-'.s:max_reg.'s', port.regwire) let bit_str = printf('%-'.s:max_bits.'s', port.bits) let name_str = printf('%-'.s:max_name.'s', port.name) " 计算前缀总长度并补足30字符 let prefix_part = prefix . reg_str . bit_str . ' ' let prefix_length = strlen(prefix_part) let padding = repeat(' ', max([30 - prefix_length, 0])) " 组合完整行并清理Tab let line = prefix_part . padding . name_str if !empty(port.comment) let line .= repeat(' ', 2) . port.comment " 注释固定2空格间隔 endif let line = substitute(line, '\t', ' ', 'g') " 全局替换Tab为空格 call add(formatted, substitute(line, '\s\+$', '', '')) let cnt += 1 let s:last_blank = 0 endif endfor " 第四阶段:替换原始内容 execute a:firstline.','.a:lastline.'d' call append(a:firstline-1, formatted) endfunction command! -range AlignSignals <line1>,<line2>call AlignVerilogSignals() 检查以上脚本,并输出
04-01
"========================================================================== "对齐选中的信号声明 function! AlignVerilogSignals() range let s:max_type = 0 let s:max_reg = 0 let s:max_bits = 0 let s:max_name = 0 let s:port_list = [] let signal_lines = getline(a:firstline, a:lastline) " 解析阶段新增未匹配行保留逻辑 for raw_line in signal_lines let line = substitute(raw_line, '\s*$', '', '') if line =~ '^\s*//' call add(s:port_list, {'type': 'comment', 'content': line}) continue elseif line =~ '^\s*$' call add(s:port_list, {'type': 'blank'}) continue endif let clean_line = substitute(line, '\s*//.*$', '', '') let clean_line = substitute(clean_line, '^\s*,', '', '') " 增强正则表达式精度(单词边界匹配) let parts = matchlist(clean_line, \ '^\s*\(\<logic\>\|\<bit\>\|\<reg\>\|\<wire\>\)\?\s*\(\[.\{-\}\]\)\?\s*\(\w\+\)\s*\([,;]\|$\)') if !empty(parts) let name = substitute(parts[3], '\s*[;,].*', '', '') let regwire = !empty(parts[1]) ? parts[1] : '' let bits = !empty(parts[2]) ? substitute(parts[2], '\t', ' ', 'g') : '' let comment = matchstr(line, '//.*$') let s:max_reg = max([s:max_reg, len(regwire)+1]) let s:max_bits = max([s:max_bits, len(bits)]) let s:max_name = max([s:max_name, len(name)]) call add(s:port_list, { \ 'type': 'port', \ 'regwire': regwire, \ 'bits': bits, \ 'name': name, \ 'comment': comment}) else " 保留未匹配行的原始内容 call add(s:port_list, {'type': 'raw', 'content': raw_line}) endif endfor " 生成阶段新增原始行保留逻辑 let formatted = [] let s:last_blank = 0 for item in s:port_list if item.type == 'comment' call add(formatted, item.content) let s:last_blank = 0 elseif item.type == 'blank' if !s:last_blank call add(formatted, '') let s:last_blank = 1 endif elseif item.type == 'raw' call add(formatted, item.content) let s:last_blank = 0 else let port = item let reg_str = printf('%-'.s:max_reg.'s', port.regwire) let pad_after_reg = repeat(' ', max([12 - s:max_reg, 0])) let bit_str = printf('%-'.s:max_bits.'s', port.bits) let name_str = printf('%-'.s:max_name.'s', port.name) let prefix_part = reg_str . pad_after_reg . bit_str . ' ' let prefix_length = strlen(prefix_part) let padding = repeat(' ', max([32 - prefix_length, 0])) " 构建基础行内容 let base_line = prefix_part . padding . name_str let base_length = strlen(base_line) " 根据长度动态调整分号位置 if base_length < 57 let line = base_line . repeat(' ', 57 - base_length - 1) . ';' else let line = base_line . ' ;' endif " 添加注释 if !empty(port.comment) let line .= repeat(' ', 3) . port.comment endif let line = substitute(line, '\t', ' ', 'g') let line = substitute(line, '\s\+$', '', '') call add(formatted, line) let s:last_blank = 0 endif endfor execute a:firstline.','.a:lastline.'d' call append(a:firstline-1, formatted) endfunction command! -range AlignSignals <line1>,<line2>call AlignVerilogSignals() vnoremap <silent> <leader>as :AlignSignals<CR> nnoremap <silent> <leader>as :AlignSignals<CR>
最新发布
04-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值