前言

veirlog模块例化的时候,辣么多的信号端子,手动例化又慢又容易出错,葵花妈妈开课啦,孩子手残老犯错怎么办?

当然是脚本一劳永逸,妈妈再也不担心手残党。

流程

(1)在vscode中安装如下插件。

(2)在电脑中安装python3以上的环境。

下载地址:https://www.python.org/downloads/release/python-373/

安装记得一定要勾选添加路径,记得管理员安装。重启你的电脑。

在cmd窗口输入python即可验证是否安装成功!

(3)安装chardet。为确保插件可用,这个需要安装。

参考链接:https://blog.csdn.net/sinat_28631741/article/details/80483064

方式一   源码按照:

第一步:下载压缩文件,例如: 'chardet-3.0.4.tar.gz';

第二步:解压文件到python安装位置下的‘site-packages’目录下,例如:‘D:\python2.7\Lib\site-packages’;

第三步:打开终端命令窗口,进入解压的‘chardet’目录下,执行命令:python setup.py install  
(4)修改插件的原始py文件,觉得开发者的py有瑕疵,让帅气的同事重新整了个,把以下代码替换进原始py文件即可。

在打开v文件的vscode下按ctrl+p,输入instance可出现下述界面。

替换此py文件的代码即可。

#! /usr/bin/env python

'''
vTbgenerator.py -- generate verilog module Testbench
generated bench file like this: fifo_sc #(
.DATA_WIDTH ( 8 ),
.ADDR_WIDTH ( 8 )
)
u_fifo_sc (
.CLK ( CLK ),
.RST_N ( RST_N ),
.RD_EN ( RD_EN ),
.WR_EN ( WR_EN ),
.DIN ( DIN [DATA_WIDTH-1 :0] ),
.DOUT ( DOUT [DATA_WIDTH-1 :0] ),
.EMPTY ( EMPTY ),
.FULL ( FULL )
); Usage:
python vTbgenerator.py ModuleFileName.v '''
import random
import re
import sys
from queue import Queue import chardet def delComment(Text):
""" removed comment """
single_line_comment = re.compile(r"//(.*)$", re.MULTILINE)
multi_line_comment = re.compile(r"/\*(.*?)\*/", re.DOTALL)
Text = multi_line_comment.sub('\n', Text)
Text = single_line_comment.sub('\n', Text)
return Text def delBlock(Text):
""" removed task and function block """
Text = re.sub(r'\Wtask\W[\W\w]*?\Wendtask\W', '\n', Text)
Text = re.sub(r'\Wfunction\W[\W\w]*?\Wendfunction\W', '\n', Text)
return Text def findName(inText):
""" find module name and port list"""
p = re.search(r'([a-zA-Z_][a-zA-Z_0-9]*)\s*', inText)
mo_Name = p.group(0).strip()
return mo_Name def paraDeclare(inText, portArr):
""" find parameter declare """
pat = r'\s' + portArr + r'\s[\w\W]*?[;,)]'
ParaList = re.findall(pat, inText) return ParaList def portDeclare(inText, portArr):
"""find port declare, Syntax:
input [ net_type ] [ signed ] [ range ] list_of_port_identifiers return list as : (port, [range])
"""
port_definition = re.compile(
r'\b' + portArr +
r''' (\s+(wire|reg)\s+)* (\s*signed\s+)* (\s*\[.*?:.*?\]\s*)*
(?P<port_list>.*?)
(?= \binput\b | \boutput\b | \binout\b | ; | \) )
''',
re.VERBOSE | re.MULTILINE | re.DOTALL
) pList = port_definition.findall(inText)
t = []
for ls in pList:
if len(ls) >= 2:
t = t + portDic(ls[-2:])
return t def portDic(port):
"""delet as : input a =c &d;
return list as : (port, [range])
"""
pRe = re.compile(r'(.*?)\s*=.*', re.DOTALL) pRange = port[0]
pList = port[1].split(',')
pList = [i.strip() for i in pList if i.strip() != '']
pList = [(pRe.sub(r'\1', p), pRange.strip()) for p in pList] return pList def formatPort(AllPortList, isPortRange=1):
PortList = AllPortList str = ''
if PortList != []:
l1 = max([len(i[0]) for i in PortList])+2
l3 = max(18, l1) strList = []
str = ',\n'.join([' ' * 4 + '.' + i[0].ljust(l3)
+ '(' + (i[0]) + ')' for i in AllPortList])
strList = strList + [str] str = ',\n\n'.join(strList) return str def formatDeclare(PortList, portArr, initial=""):
str = '' if PortList != []:
str = '\n'.join([portArr.ljust(4) + ' '+(i[1]+min(len(i[1]), 1)*' '
+ i[0]) + ';' for i in PortList])
return str def formatPara(ParaList):
paraDec = ''
paraDef = ''
if ParaList != []:
s = '\n'.join(ParaList)
pat = r'([a-zA-Z_][a-zA-Z_0-9]*)\s*=\s*([\w\W]*?)\s*[;,)]'
p = re.findall(pat, s) l1 = max([len(i[0]) for i in p])
l2 = max([len(i[1]) for i in p])
paraDec = '\n'.join(['parameter %s = %s;'
% (i[0].ljust(l1 + 1), i[1].ljust(l2))
for i in p])
paraDef = '#(\n' + ',\n'.join([' .' + i[0].ljust(l1 + 1)
+ '( ' + i[1].ljust(l2)+' )' for i in p]) + ')\n'
return paraDec, paraDef def portT(inText, ioPadAttr):
x = {}
count_list = []
order_list = []
for i in ioPadAttr:
p = port_index_list(inText, i)
for j in p:
count_list.append(j)
x[j] = i
count_list = quick_sort(count_list, 0, len(count_list)-1)
for c in count_list:
order_list.append(x.get(c))
return order_list def quick_sort(myList, start, end):
if start < end:
i, j = start, end
base = myList[i]
while i < j:
while (i < j) and (myList[j] >= base):
j = j - 1 myList[i] = myList[j] while (i < j) and (myList[i] <= base):
i = i + 1
myList[j] = myList[i]
myList[i] = base quick_sort(myList, start, i - 1)
quick_sort(myList, j + 1, end)
return myList def formatPort_order(padAttr, orderList): for p in padAttr:
q = Queue()
for i in padAttr.get(p):
q.put(i)
padAttr[p] = q
AllPortList = []
for o in orderList:
AllPortList.append(padAttr.get(o).get())
return AllPortList def port_index_list(intext, text):
l = []
t = intext
index = t.find(text)
while index > -1:
t = t.replace(text, random_str(len(text)), 1)
l.append(index)
index = t.find(text)
return l def random_str(size):
s = ''
for i in range(size):
s += str(random.randint(0, 9))
return s def getPortMap(AllPortList, ioPadAttr):
if len(AllPortList) != len(ioPadAttr):
return p_map = {}
for i in range(len(AllPortList)):
p_map[ioPadAttr[i]] = AllPortList[i]
return p_map def writeTestBench(input_file):
""" write testbench to file """
with open(input_file, 'rb') as f:
f_info = chardet.detect(f.read())
f_encoding = f_info['encoding']
with open(input_file, encoding=f_encoding) as inFile:
inText = inFile.read() # removed comment,task,function
inText = delComment(inText)
inText = delBlock(inText) # moduel ... endmodule #
moPos_begin = re.search(r'(\b|^)module\b', inText).end()
moPos_end = re.search(r'\bendmodule\b', inText).start()
inText = inText[moPos_begin:moPos_end] name = findName(inText)
paraList = paraDeclare(inText, 'parameter')
paraDec, paraDef = formatPara(paraList) ioPadAttr = ['input', 'output', 'inout']
orlder = portT(inText, ioPadAttr)
input = portDeclare(inText, ioPadAttr[0])
output = portDeclare(inText, ioPadAttr[1])
inout = portDeclare(inText, ioPadAttr[2]) portList = formatPort(formatPort_order(
getPortMap([input, output, inout], ioPadAttr), orlder)) input = formatDeclare(input, 'reg')
output = formatDeclare(output, 'wire')
inout = formatDeclare(inout, 'wire') # write Instance # module_parameter_port_list
if(paraDec != ''):
print("// %s Parameters\n%s\n" % (name, paraDec)) # list_of_port_declarations
#print("// %s Inputs\n%s\n" % (name, input))
#print("// %s Outputs\n%s\n" % (name, output))
#if(inout != ''):
# print("// %s Bidirs\n%s\n" % (name, inout))
print("\n")
# UUT
print("%s %s inst_%s (\n%s\n);" % (name, paraDef, name, portList)) if __name__ == '__main__':
writeTestBench(sys.argv[1])

(5)享受一下吧。

比如我们有如下代码:

crtl+p,输入instance,按回车即可。

复制粘贴大法好。

以上。

Vscode生成verilog例化的更多相关文章

  1. Xilinx Spartan6常用资源Verilog例化

    // DSP48A1 : In order to incorporate this function into the design, // Verilog : the following insta ...

  2. 利用python自动生成verilog模块例化模板

    一.前言 初入职场,一直忙着熟悉工作,就没什么时间更新博客.今天受“利奇马”的影响,只好宅在家中,写写技术文章.芯片设计规模日益庞大,编写脚本成了芯片开发人员必要的软技能.模块端口动不动就几十上百个, ...

  3. Verilog与VHDL的混合模块例化

    1,大小写与转义 对VHDL解释器而言,对于模块名和端口名, (1) 若有转义 a) 先不考虑转义,寻找与字符串完全相同的VHDL模块: 若找不到: b) 考虑转义,寻找对应的Verilog模块. ( ...

  4. Kotlin入门(28)Application单例化

    Application是Android的又一大组件,在App运行过程中,有且仅有一个Application对象贯穿应用的整个生命周期,所以适合在Application中保存应用运行时的全局变量.而开展 ...

  5. Xilinx 7系列例化MIG IP core DDR3读写

    昨晚找了一下,发现DDR3读写在工程上多是通过例化MIG,调用生成IPcore的HDL Functional Model.我说嘛,自己哪能写出那么繁琐的,不过DDR读写数据可以用到状态机,后期再添砖加 ...

  6. 62.在cdc文件上某些例化模块看不到的原因

    比如在顶层文件中,例化了几个模块,综合后打开cdc文件,会在structure/net中少几个例化模块,即看不到,但在顶层文件中还是存在的,只是ISE软件综合的问题而已,原因是在顶层或子模块中,有些应 ...

  7. Quartus中例化工程

    一般的例化工程,需要将要例化的对象的硬件语言放入到当前工程中,比如A要例化B,需要将B的编程文件加入当前工程进来. 还有一种方法不用这么麻烦,A工程用要例化B时,在library添加B的工程路径,就可 ...

  8. testbench中$display查看例化model里面信号方法以及$realtime用法

    前言 此为测试语法,不可综合: 流程: 1.在tb中可以这么写,检测clk_t_en的高电平,输出仿真时间位置,想查看的cnt_t是底层模块中的.这么会使得时间延迟一个周期: always @(pos ...

  9. 基于MATLAB2016b图形化设计自动生成Verilog语言的积分模块及其应用

    在电力电子变流器设备中,常常需要计算发电量,由于电力电子变流器设备一般是高频变流设备,所以发电量的计算几乎时实时功率的积分,此时就会用到一个积分模块.发电量计算的公式如下:Q=∫P. FPGA由于其并 ...

随机推荐

  1. 记一次按需加载和npm模块发布实践

    按需加载 在使用 lodash 的时候我们可以使用这样的代码 //一 import {omit} from "lodash"; //二 import l from "lo ...

  2. 【带着canvas去流浪(7)】绘制水球图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 四. 文字淹水效果的实现 五. 关于canvas抗锯齿 六. 小结 示例代码托管在:http://www.github.com/dashnowor ...

  3. 使用 pm2 守护你的 .NET Core 应用程序

    一.守护进程的前世今生 守护进程,英文名:"daemon",也有守护神的意思.守护进程是一个在后台运行并且不受任何终端控制的进程,不会随着会话结束而退出.诸如 mysql.apac ...

  4. ## 本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘

    本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘一,磁盘管理1.显示当前目录位置 pwd2.切换目录 cd ...

  5. 数据结构——Java实现顺序表

    一.分析 什么是顺序表?顺序表是指用一组地址连续的存储单元依次存储各个元素,使得在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中的线性表.一个标准的顺序表需要实现以下基本操作: 1.初始化顺序表 ...

  6. 纯手写springIOC

    大家好啊- 那么今天来带大家写一下spring的ioc. 其实也很简单,首先我们明白两点,java解析xml和java的反射机制,因为ioc就是主要是基于这两个来实现,今天只是简单的来大家实现下. 废 ...

  7. mac 卸载通过官网下载包安装的node

    sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}

  8. vue element-ui 文件上传

    <el-upload class="upload-demo" action="" :before-remove="beforeRemove&qu ...

  9. 正确启动从GitHub上下载的vue项目:vueAdmin-template

    先讲重点,后上相关资料: 遇到的问题:在启动从GitHub上下载的vue项目:vueAdmin-template 时报错:'webpack-dev-server' 不是内部或外部命令,也不是可运行的程 ...

  10. 彻底卸载注册表、流氓软件的工具Uninstall Tool

    Your Uninstaller 和Uninstall Tool都可以卸载Windows系统卸载不干净的软件和注册表驱动等 Uninstall Tool下载