|
做IC设计的人大部分都工作在linux平台下面,也有极个别的数字前端工程师一直奋战在windos下面,算是稀有动物了,估计跟这年月还在用vhdl的人差不多一样吧。不是说要说脚本语言吗,为啥从vim说起呢,其实大家最早接触linux的时候,最先碰到的无非是cd,pwd,cp 之类的命令,而前端工程师接触最多的估计就是vim和emacs这样的文本编辑器了。有人说emacs是操作系统中的操作系统,是个万能的东东,对于天资欠佳的我辈实在是太复杂了,到如今除了会用它的verilog-model外其他的一概的不会。呵呵,还是说说我们既简单又强大的vim吧。
1. vim
相信大部分人都接触过vim,而一直以来vim都是我最喜欢的编辑器,也绝不是单单用来写写代码. vim有很多功能,其实我们最关系的只是那些最最常用的东西,那种只需要掌握10%的技能就能解决工作中90%问题的技巧,其他的高深的,复杂的技巧都不是我们关心的,因为毕竟我们只是IC工程师,而VI只是个工具而已,只要快速的找到解决问题而不是找到解决问题的最快速的方法就可以了。
那么什么才是vim中最常用到的东西呢?
用过vi的都知道它有3种工作模式,用其他编辑器的人肯定以为用vi的人疯了,做个编辑器还整这么多工作模式,不是脑子有毛病吗?可是对于常常使用vim的人来说甚至都感觉不到在这3种工作模式间切换有任何的突兀的地方。
1. vim中的 “hjkl” 真的是个伟大的发明,每次看到有人在用vi还在用方向键,就觉得他们简直的暴殄天物。
2. vim中每个命令都是可以带数字的,让它执行几回就执行几回。
3. "." 可以重复上一个命令
4. “:%g/^$/d 可以删除空行,当然了%s,n1,n2s 都是做行内替换的,%g却是以行为单位操作的。
5. ”gf“ 如果当前字符串是一个文件的路径的话,就可以直接在当前窗口打开该文件了,怎么返回呢? ”ctrl+o” 就可以了,回不去? 多按几次就行了 哈哈。
6. 有时候会处理到一些涉及多行的匹配,而正则表达式又不好写,但是处理的内容规律性特别的明显,这个时候就是宏定义派上用场的时候了,vim中的宏很好设置, q+任意一个字母 就进入record 模式了,这个时候输入的所有命令都会录入到宏中,结束的时候再按q。 然后执行 “n@a” 其中n是宏执行的次数,a为宏的名字,就是刚才q后面加的那个字母了。
7. 在替换的时候有一种情况是仍然需要匹配到的内容,这样就希望能将匹配到的内容存在一个变量中,vim当然提供这样的功能了,比如说需要将model 都替换成model_my ,那么执行:%s/\(model\)/\1_my/g 就可以了。 如果有多个匹配就多放几个\(\),然后用\1\2\3.....来引用他们就ok了。
8. 最后说下自编函数吧,网上能下到实现emacs verilog-model的vim脚本,用到了很多函数,其实用起来还是没有emacs 的verilog-model顺手。有兴趣的可以自己编一点小函数,符合自己习惯的那种,用起来要比用别人写的现成的顺手的多,或者也可以把别人的改一改,以便适应自己的习惯。
放一个自动生成case的函数,用来描述rom文件的,或者简单的地址译码器,抛砖引玉。见笑哈。
function Addcase(num,num1,sig_name,case_name)
let curr_line = line(".")
let line_num = a:num
let line_2_num = a:num1
let sig_names = a:sig_name
let case_names = a:case_name
"let l:format = printf(" %d 'd %d : %s = ;",&line_2_num,&line_index,&sig_names)
"let l:format = printf(" %d %d : %d = ;",&line_2_num,&line_index,&sig_names)
call append(curr_line, "always @(*) begin ")
call append(curr_line+1, " case(".case_names.") ")
while line_index <= line_num
if line_index == line_num
call append(curr_line+line_index+2, " default : ".sig_names." = ; ")
else
call append(curr_line+line_index+2, " ".line_2_num."'d".line_index." : ".sig_names." = ; ")
endif
"call append(curr_line+line_index+2, l:format)
let line_index = line_index+1
endwhile
if line_index == line_num+1
call append(curr_line+line_index+2, " endcase ")
call append(curr_line+line_index+3, "end ")
endif
endfunction
vim 就到这来了,哦对了,还有一个匹配相关的,那就是完全匹配 \<\> 了,呵呵。
perl :
vim能够进行一下简单的文本处理,稍微复杂一点用vim的脚本就感觉有点吃力了,但是也是从vim中才知道了什么叫正则表达式,什么叫匹配替换。。 真巧以前公司的老大是个全才,啥都会,啥都能带我入门,说做ic工程师,perl,tcl ,makefile 还是要会一点的,也是那时候开始学perl。