gvim快捷键声明wire和reg

发布时间:2026/10/22 17:17:19
gvim快捷键声明wire和reg 摘要在verilog的编写中可能存在很多的wire和reg需要去声明。gvim中的verilog-mode插件对于写的组合或者时序逻辑这部分的支持貌似并不好。可以使用gvim的快捷键做辅助对这部分进行快捷声明。步骤1在.vimrc中复制如下代码并source Verilog declare: append aligned jump Assumption: one signal per line(wire/reg/input/output xxx;) Keys: leaderdw : declare wire under /*AUTOWIRE*/ leaderdr : declare reg under/*AUTOREG*/ leaderdi : declare input under /*autoinput*/ leaderdo: declare output under/*autooutput*/if!exists(g:verilog_decl_name_col)let g:verilog_decl_name_col 13 Signal name start column (1-based) endif if !exists(g:verilog_decl_indent) let g:verilog_decl_indent indent string: or\tendiffunction!s:FindMarker(marker)abortreturnsearch(\c\/\*\s*.a:marker.\s*\*\/,nw)endfunctionfunction!s:AlreadyDeclared(name)abort 全局上下搜索支持 wire/reg/input/output let pat ^\s*\%(wire\|reg\|input\|output\)\\s*\%(\[[^]]\\]\s*\)\?\ . escape(a:name, \) . \\s*; return search(pat, n) 0 || search(pat, bn) 0 endfunction function! s:PadToNameCol(keyword) abort let name_col get(g:, verilog_decl_name_col, 13) let prefix g:verilog_decl_indent . a:keyword . let spaces name_col - strlen(prefix) return repeat( , spaces 1 ? 1 : spaces) endfunction function! s:IsOnePerLineDecl(kind, line) abort return a:line ~# ^\s* . a:kind . \\s*\%(\[[^]]\\]\s*\)\?\h\w*\s*;\s*$ endfunction function! s:FindInsertAfterDeclBlock(anchor, kind) abort let lnum a:anchor 1 let last a:anchor while lnum line($) let txt getline(lnum) if SIDIsOnePerLineDecl(a:kind, txt) let last lnum let lnum 1 continue endif break endwhile return last endfunction function! s:Declare(marker, kind) abort let name expand(cword) if empty(name) echoerr No identifier under cursor return endif if SIDAlreadyDeclared(name) echom Already declared: . name return endif let anchor SIDFindMarker(a:marker) if anchor 0 echoerr Marker not found:/* . a:marker . */(case-insensitive) return endif let prefix g:verilog_decl_indent . a:kind let newline prefix . SIDPadToNameCol(a:kind) . name . ; let insert_after SIDFindInsertAfterDeclBlock(anchor, a:kind) call append(insert_after, newline) 光标跳到新行定位到信号名 let target_lnum insert_after1 call cursor(target_lnum,1)let name_start strlen(prefix.SIDPadToNameCol(a:kind))1 call cursor(target_lnum,name_start)endfunction nnoremap leaderdw :call SIDDeclare(autowire,wire)CR nnoremap leaderdr :call SIDDeclare(autoreg,reg)CR nnoremap leaderdi :call SIDDeclare(autoinput,input)CR nnoremap leaderdo:call SIDDeclare(autooutput,output)CR 可选一键插入标记映射 nnoremap leadermw :call append(line(.)1,/*AUTOWIRE*/)CR nnoremap leadermr :call append(line(.)1,/*AUTOREG*/)CR nnoremap leadermi:call append(line(.)1,/*autoinput*/)CR nnoremap leadermo :call append(line(.)1,/*autooutput*/)CR需要在verilog的.v文件中存在/*autowire*/和/*autoreg*/。module top ( input clk, input rst_n, input a, input b ); /*autowire*/ /*autoreg*/ always (*) begin comb_sum a ^ b; end always (posedge clk or negedge rst_n) begin if (!rst_n) q 1b0; else q comb_sum; end endmodule在要声明的wire信号光标出按下\dw,在要声明的reg信号光标处按下\dr。/*autowire*/ wire comb_sum; /*autoreg*/ reg q;效果如上。缺点在产生的声明中不会有位宽的识别每次产生声明后光标会自动跳转到声明行可以手动补齐位宽。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询