0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在VScode中自动生成Verilog仿真文件

FPGA之家 来源:AriesOpenFPGA 作者:AriesOpenFPGA 2021-06-23 17:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、实现功能

1、可以自动创建文件夹

2、根据Verilog文件自动生成测试文件模板(TB文件名字是)

3、自动打开生成的文件

4、自动调取modelsim仿真(后续添加)

二、基本介绍

使用语言:python

环境:win10/python3.7(需要chardet,代码中有注释)

运行软件:Vscode/IDLE (Python 3.7 64-bit)(目前这个脚本还没有封装成插件)

调试最方便的就是在VScode里面安装python的插件

三、python代码

3.1 提取Verilog文件关键字的代码

##------------------------------------------------------------------------------------------------##--##-- Coding: UTF-8##-- @File : vTbgenerator.py##-- @Version : 1.0##-- @Author : AriesOpenFPGA##-- @Email : 2577802337@qq.com##-- @License : (C)Copyright 2019-2021,AriesOpenFPGA##-- @Time : 2021/01/25 2118##-- Description:##--##------------------------------------------------------------------------------------------------

import reimport sysimport chardet #请大家尤其注意此处,调用这个是需要下载另外一个文件的 #如果找不到,可以找群主要(Python Universal Character Encoding Detector)import osimport time

def delComment( Text ): “”“ removed comment ”“” single_line_comment = re.compile(r“//(.*)$”, re.MULTILINE)# (.*) 代表匹配除换行符之外的所有字符re.MULTILINE变成每行开始和结束 multi_line_comment = re.compile(r“/*(.*?)*/”,re.DOTALL)# (.*?)后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符 Text = multi_line_comment.sub(‘

’,Text) # re.DOTALL表示多行匹配 Text = single_line_comment.sub(‘

’,Text) return Text

def delBlock( Text ) : “”“ removed task and function block ”“” Text = re.sub(r‘WtaskW[Ww]*?WendtaskW’,‘

’,Text) #re.sub表示替换‘s+’表示空格 Text = re.sub(r‘WfunctionW[Ww]*?WendfunctionW’,‘

’,Text) #pattern = re.compile(r‘([a-z]+) ([a-z]+)’, re.I) re.I表示忽略大小写 return Text #w匹配包括下划线的任何单词字符。等价于‘[A-Za-z0-9_]’ #W匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。

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()#去除group(0)的首尾空格 return mo_Name

def paraDeclare(inText ,portArr) : “”“ find parameter declare ”“” pat = r‘s’+ portArr + r‘s[wW]*?[;,)]’# s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f

v]。 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‘’ + portArr + r‘’‘ (s+(wire|reg)s+)* (s*signeds+)* (s*[.*?:.*?]s*)* (?P《port_list》.*?) (?= input | output | inout | ; | ) ) ’‘’, 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(‘,’)#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[0] + AllPortList[1] + AllPortList[2]

str =‘’ if PortList !=[] : l1 = max([len(i[0]) for i in PortList])+2 l2 = max([len(i[1]) for i in PortList]) l3 = max(24, l1)

strList = [] for pl in AllPortList : if pl != [] : str = ‘,

’.join( [‘ ’*4+‘。’+ i[0].ljust(l3) + ‘( ’+ (i[0].ljust(l1 )+i[1].ljust(l2)) + ‘ )’ for i in pl ] ) strList = strList + [ str ]

str = ‘,

’.join(strList)

return str

def formatDeclare(PortList,portArr, initial = “” ): str =‘’ if initial !=“” : initial = “ = ” + initial

if PortList!=[] : str = ‘

’.join( [ portArr.ljust(4) +‘ ’+(i[1]+min(len(i[1]),1)*‘ ’ +i[0]).ljust(36)+ initial + ‘ ;’ for i in PortList]) return str

def formatPara(ParaList) : paraDec = ‘’ paraDef = ‘’ if ParaList !=[]: s = ‘

’.join( ParaList) pat = r‘([a-zA-Z_][a-zA-Z_0-9]*)s*=s*([wW]*?)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 = ‘

’.join( [‘parameter %s = %s;’ %(i[0].ljust(l1 +1),i[1].ljust(l2 )) for i in p]) paraDef = ‘#(

’ +‘,

’.join( [‘ 。’+ i[0].ljust(l1 +1) + ‘( ’+ i[0].ljust(l1 )+‘ )’ for i in p])+ ‘)

’ else: l1 = 6 l2 = 2 preDec = ‘

’.join( [‘parameter %s = %s;

’ %(‘PERIOD’.ljust(l1 +1), ‘10’.ljust(l2 ))]) paraDec = preDec + paraDec return paraDec,paraDef

3.2 创建文件夹和在文件中写入数据

“”“ 打开目标文件,这里的文件需要大家自己手动给出路径,当封装为插件后则是可以自动获取文件路径,这里仅做测试用”“”

target_dir_v = “C:\Users\25778\Desktop\VScode\test\”

“”“这里的i2c_dri.v是需要生成TB的原文件名字,需要给出名字,封装后也是自动获取”“”with open(target_dir_v + “i2c_dri.v”, ‘rb’) as f: f_info = chardet.detect(f.read()) f_encoding = f_info[‘encoding’]with open(target_dir_v + “i2c_dri.v”, encoding=f_encoding) as inFile: inText = inFile.read()

# removed comment,task,functioninText = delComment(inText)inText = delBlock (inText)

# moduel 。。. endmodule #moPos_begin = re.search(r‘(|^)module’, inText ).end()moPos_end = re.search(r‘endmodule’, inText ).start()inText = inText[moPos_begin:moPos_end]

name = findName(inText)paraList = paraDeclare(inText,‘parameter’)paraDec , paraDef = formatPara(paraList)

ioPadAttr = [ ‘input’,‘output’,‘inout’]input = portDeclare(inText,ioPadAttr[0])output = portDeclare(inText,ioPadAttr[1])inout = portDeclare(inText,ioPadAttr[2])

portList = formatPort( [input , output , inout] )input = formatDeclare(input ,‘reg’, ‘0’ )output = formatDeclare(output ,‘wire’)inout = formatDeclare(inout ,‘wire’)

timescale = ‘`timescale 1ns / 1ps

’clk = ‘’‘initialbegin forever #(PERIOD/2) clk=~clk;end’‘’rst = ‘’‘initialbegin #(PERIOD*2) rst_n = 1;end’‘’

operation = ‘’‘initialbegin

$finish;end’‘’

def openfile(file_dir): os.startfile(file_dir)

“”“这里的地址需要放到目标文件地址的上一级,封装成插件也是自动获取的并且创建TB文件夹,同时创建.v文件,tb文件的命名方式是目标文件的模块名字+tb”“”target_dir = target_dir_v + “\tb\”cr_time = time.strftime(‘%Y.%m.%d.%H.%M.%S’)Tb_target_dir = target_dir + name + “_”+ cr_time +‘.v’

if not os.path.exists(target_dir): os.mkdir(target_dir) file = open(Tb_target_dir,‘w’) file.close()else: file = open(Tb_target_dir,‘w’) file.close()

if __name__ == “__main__”: file_dir = Tb_target_dir openfile(file_dir) print(“TB file created successfully”)else: print(“Failed to create file of TB”)

“”“这里是将提取出来的字符写入生成的TB文件”“”

with open(Tb_target_dir,“w”) as OUTFile0: OUTFile0.write(timescale) OUTFile0.write(“module tb_”+name+“

”) if(paraDec!=‘’): OUTFile0.write(paraDec+“

”) OUTFile0.write(input+“

”) OUTFile0.write(output+“

”) if(inout!=‘’): OUTFile0.write(inout+“

”) OUTFile0.write(clk+“

”+rst+“

”) OUTFile0.write(name+“ ”+paraDef+“ ”+“u_”+name+“ (

”+portList+“

”+“);”) OUTFile0.write(operation+“

”+“endmodule”)

因为贴出的代码已经添加了比较详细的注释,具体的文章内容就不再赘述代码具体功能,python属于特别好上手的语言,主要去调取一些接口来实现了想要的功能。因为代码是边学边写,花的时间很短,代码质量不高,也欢迎大家批评指正。

四、代码测试

进入正题:

测试前准备好前面所说的环境(其他环境没有具体测试,python版本影响应该不大)

首先准备好一个测试的文件夹,一个需要测试的Verilog原文件,这里使用一个i2c_dri.v做一个简单的测试

大家根据代码描述格式和注释添加自己的测试路径,完成的基本功能就是创建一个TB文件夹,创建测试文件(名字是:模块名+创建测试文件的时间,如果有需要可以修改为和测试文件内模块名一样(tb_模块名)),自动用Vscode打开(前提是你电脑的.v文件默认打开方式是Vscode,如果不是那么就会使用默认的编辑器打开)

小结:如果觉得Tb文件名不好的,读者可以自行把文件名修改为和TB文件的模块名一致(从python代码中修改),其它功能和优化会陆续进行。

六、总结

使用python写这个脚本配置环境其实还是有些麻烦的,有更方便快捷的脚本语言也欢迎讨论。

写这个代码主要为了给习惯使用Vscode的读者提供一个基础的平台,可以在这个基础上实现自己定制化的脚本,后续也会封装成VScode插件,VHDL的自动生成测试文件脚本也基本测试完成,后续代码也会公布。如果大家有其他便利的脚本也欢迎和作者交流。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    30

    文章

    1370

    浏览量

    114159
  • 代码
    +关注

    关注

    30

    文章

    4942

    浏览量

    73159
  • python
    +关注

    关注

    57

    文章

    4858

    浏览量

    89599

原文标题:在VScode中自动生成Verilog仿真文件(Python)

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    VSCode + ESP-IDF环境下给ESP32-S3项目添加头文件

    VSCode + ESP-IDF环境下给ESP32-S3项目添加头文件
    的头像 发表于 11-28 07:27 758次阅读

    请问测试用例.verilog文件是怎么生成的呢?

    仿真时可以通过添加.verilog文件,直接读入ITCM,从而在仿真时我们就可以知道处理器的运行结果,例如打印hello_world字样
    发表于 11-11 07:56

    使用NucleiStudio生成tb仿真需要的.verilog文件

    project编译后生成仿真需要的.verilog文件: 1.打开一个工程,右键选择工程名,打开Properties: 2.选择C/C++ Build ->setti
    发表于 11-05 07:07

    Hbirdv2在vivado2018.3上的仿真工作

    可以在官方给的文件获得实例.verilog文件,如果我们想要仿真自己C程序编译出来的对应.verilo
    发表于 10-31 08:43

    语法纠错和testbench的自动生成

    在编写Verilog代码时,我一般都是先在编辑器上写完,因为编辑器vscode或者notepad++可以提供语法高亮和自动补全等功能,然后用仿真器跑
    发表于 10-27 07:07

    在VIVADO对NICE进行波形仿真的小问题的解决

    分别如下图 可以看到,输出运算结果的pritnf函数被#ifdef所定义,所以我们如果想在VIVADO的控制台看到输出结果,要先在main.c定义DEBUG_INFO,如下图 这样,将编译后生成的.verilog
    发表于 10-27 06:41

    芯来e203移植开发分享(二)——仿真文件简述与itcm固化程序

    可以在makefile设置自己想要仿真的testcase,这里使用的rv32ui-p-add.verilog,这里我们把的这个文件复制的上次分享建立的
    发表于 10-27 06:04

    NucleiStudio如何生成.verilog文件和.dasm文件,以及对.dasm文件自定义指令反汇编结果分析

    硬件设计需要.verilog文件来运行加NICE后的tb仿真、软件组需要.dasm来确定自定义指令有无被正确编译。今天,我们来分享一下NucleiStudio如何生成.
    发表于 10-24 06:33

    Nucleistudio+Vivado协同仿真教程

    编译完成后,我们会在工程目录下发现生成了.verilog文件,此即为我们仿真需用到的文件,可以将改
    发表于 10-23 06:22

    使用Simulink自动生成浮点运算HDL代码(Part 1)

    引言 想要实现浮点运算功能,如果自己写Verilog代码,需要花费较多的时间和精力。好在Simulink HDL Coder工具箱提供了自动代码生成技术。下图展示了HDL Coder如何生成
    发表于 10-22 06:48

    何在Vivado上仿真蜂鸟SOC,仿真NucleiStudio编译好的程序

    ram的IP就可以 2. 将机器指令初始化到ITCM的bank-ram-IP 生成的机器指令在这里 然后我们需要把它转化为coe文件 我们参考网上的相关代码,做了hex到coe的转换,核心代码实现如下: 读取hex: 生成
    发表于 10-21 11:08

    生成式 AI 重塑自动驾驶仿真:4D 场景生成技术的突破与实践

    生成式AI驱动的4D场景技术正解决传统方法效率低、覆盖不足等痛点,如何通过NeRF、3D高斯泼溅等技术实现高保真动态建模?高效生成极端天气等长尾场景?本文为您系统梳理AI驱动的4D场景生成体系及其在
    的头像 发表于 08-06 11:20 4817次阅读
    <b class='flag-5'>生成</b>式 AI 重塑<b class='flag-5'>自动</b>驾驶<b class='flag-5'>仿真</b>:4D 场景<b class='flag-5'>生成</b>技术的突破与实践

    使用 QWQ:32B 模型搭配 VSCode 的 Cline 插件实现自动化代码编程!

    作者:算力魔方创始人/英特尔创新大使刘力 一,概述 随着人工智能技术的快速发展,自动化编程工具逐渐成为开发者的得力助手。QWQ:32B 模型是一种先进的自然语言处理模型,能够理解并生成高质量的代码
    的头像 发表于 03-21 18:12 1084次阅读
    使用 QWQ:32B 模型搭配 <b class='flag-5'>VSCode</b> 的 Cline 插件实现<b class='flag-5'>自动</b>化代码编程!

    Verilog 电路仿真常见问题 Verilog 在芯片设计的应用

    。然而,在实际应用,设计师可能会遇到各种问题,这些问题可能会影响仿真的准确性和设计的可靠性。 Verilog电路仿真常见问题 仿真环境的搭
    的头像 发表于 12-17 09:53 1613次阅读

    Verilog 测试平台设计方法 Verilog FPGA开发指南

    Verilog设计的仿真需求。 编写测试文件 : 编写Verilog测试文件,对设计的各个模块进行测试。测试
    的头像 发表于 12-17 09:50 1563次阅读