在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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 : [email protected]##-- @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
    +關注

    關注

    28

    文章

    1364

    瀏覽量

    111585
  • 代碼
    +關注

    關注

    30

    文章

    4883

    瀏覽量

    70099
  • python
    +關注

    關注

    56

    文章

    4822

    瀏覽量

    85945

原文標題:在VScode中自動生成Verilog仿真文件(Python)

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    使用 QWQ:32B 模型搭配 VSCode 的 Cline 插件實現自動化代碼編程!

    作者:算力魔方創始人/英特爾創新大使劉力 一,概述 隨著人工智能技術的快速發展,自動化編程工具逐漸成為開發者的得力助手。QWQ:32B 模型是一種先進的自然語言處理模型,能夠理解并生成高質量的代碼
    的頭像 發表于 03-21 18:12 ?434次閱讀
    使用 QWQ:32B 模型搭配 <b class='flag-5'>VSCode</b> 的 Cline 插件實現<b class='flag-5'>自動</b>化代碼編程!

    Verilog 電路仿真常見問題 Verilog 在芯片設計的應用

    。然而,在實際應用,設計師可能會遇到各種問題,這些問題可能會影響仿真的準確性和設計的可靠性。 Verilog電路仿真常見問題 仿真環境的搭
    的頭像 發表于 12-17 09:53 ?969次閱讀

    Verilog 測試平臺設計方法 Verilog FPGA開發指南

    Verilog設計的仿真需求。 編寫測試文件 : 編寫Verilog測試文件,對設計的各個模塊進行測試。測試
    的頭像 發表于 12-17 09:50 ?899次閱讀

    如何自動生成verilog代碼

    介紹幾種自動生成verilog代碼的方法。
    的頭像 發表于 11-05 11:45 ?846次閱讀
    如何<b class='flag-5'>自動</b><b class='flag-5'>生成</b><b class='flag-5'>verilog</b>代碼

    VSCodeMarkdown借助plantuml繪制流程圖

    VSCodeMarkdown里通過plantuml繪制流程圖,簡直不要太方便。
    的頭像 發表于 10-28 11:19 ?2398次閱讀

    labview工程文件如何生成exe

    生成可執行文件(EXE)是LabVIEW程序開發過程的一個重要步驟,它允許用戶在沒有安裝LabVIEW的計算機上運行程序。以下是步驟和注意事項: 1. 準備工作 在開始生成EXE
    的頭像 發表于 09-04 17:09 ?2729次閱讀

    關于Makefile自動生成-autotools的使用

    在Linux應用開發,編寫Makefile是一項必備技能,因為它定義了工程中所有文件的編譯順序、規則和依賴關系,決定了哪些文件需要編譯以及它們的編譯順序。 雖然對初級開發者而言,編寫復雜
    的頭像 發表于 07-25 15:50 ?1713次閱讀
    關于Makefile<b class='flag-5'>自動</b><b class='flag-5'>生成</b>-autotools的使用

    何在VSCODE下面進行RISC-V的調試

    如題,如何在VSCODE下面進行RISC-V的調試?下載等
    發表于 07-25 11:49

    用env工具生成rt-thread的工程文件,vscode編譯報錯的原因?

    使用vscode的eide插件可以編譯裸機的國民技術芯片,我用env工具生成rt-thread的工程文件,keil編譯無問題,vscode編譯報錯
    發表于 07-11 08:31

    何在ModelSim添加Xilinx仿真

    今天給大俠帶來在FPGA設計應用何在ModelSim添加Xilinx仿真庫,話不多說,上貨。 注意:ModelSim一定要安裝在不帶空格的目錄下,即不要安裝在“Progr
    發表于 07-03 18:16

    請問如何將.C的圖片文件添加到VScode(PlatfromIO)生成的lvgh項目中?

    當使用LVGL官方網頁轉換器,將png圖片轉換為.c矩陣文件之后,如何將.c的圖片文件加到VScode(PlatfromIO)的lvgh工程里面?<br> 不管是把.c放到assets、lib、include為什么每
    發表于 06-17 06:03

    引用外部文件的頭文件時,如何讓VSCODE不提示波浪線錯誤?

    各位好: 我將常用的組件放在項目文件夾以外的某個地方,嘗試在項目內引用此文件夾下的組件,失敗,在代碼無法include相關頭文件。我在main組件
    發表于 06-07 08:19

    vscode中使用ESP-IDFV5.03版本,編譯工程生成的sdkconfig.h文件無法跳轉怎么解決?

    問題描述:在vscode中使用ESP-IDFV5.03版本,編譯工程生成的sdkconfig.h文件無法跳轉,只能跳轉到ESP-IDF的某個組件里面的sdkconfig.h
    發表于 06-07 07:53

    VSCode編譯過程cmake錯誤的原因?

    M2版macbook上正確安裝了ESP-IDF v5.1.2,并安裝了VSCode插件,編譯get-started的項目hello_world,利用idf.py build可以正確完成,但是在
    發表于 06-06 06:48

    FPGA設計 Verilog HDL實現基本的圖像濾波處理仿真

    個數據: 代碼: 2、EdgeSobel的Verilog源代碼: 代碼: 3、仿真文件:EdgeSobel_tb.v
    發表于 05-20 16:44
    主站蜘蛛池模板: 国产视频二区 | 色婷婷激情五月综合 | 亚洲人成网站999久久久综合 | 国产精品情人露脸在线观看 | 婷婷亚洲综合五月天小说在线 | www.一区二区三区 | 日本人zzzwww | 欧美成年网站 | 五月婷婷在线播放 | 欧美成人eee在线 | 足控免费视频xxav | 最新日韩中文字幕 | 一级毛片无毒不卡直接观看 | 九色综合网 | 快色视频免费 | 久久刺激视频 | 大又大粗又爽又黄少妇毛片 | 国产三级精品播放 | 成年人看的黄色 | 欧美又粗又硬又大久久久 | www.一区二区| 国产成人精品三级 | 777国产精品永久免费观看 | 大尺度在线播放 | 欧美一卡2卡三卡4卡5卡免费观看 | 国产主播一区二区 | 亚洲视频在线播放 | free性日韩| 日韩特级毛片 | 91寡妇天天综合久久影院 | 亚洲黄色高清视频 | 三级毛片免费 | av免费网站在线观看 | 在线观看国产一级强片 | 男女免费视频 | 天天操天天操天天干 | 手机看片日韩福利 | 成人欧美网站 | 一级特黄aaa免费 | 天天碰视频 | 最好免费高清视频观看韩国 |