chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在VScode中自動(dòng)生成Verilog仿真文件

FPGA之家 ? 來(lái)源:AriesOpenFPGA ? 作者:AriesOpenFPGA ? 2021-06-23 17:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、實(shí)現(xiàn)功能

1、可以自動(dòng)創(chuàng)建文件夾

2、根據(jù)Verilog文件自動(dòng)生成測(cè)試文件模板(TB文件名字是)

3、自動(dòng)打開(kāi)生成的文件

4、自動(dòng)調(diào)取modelsim仿真(后續(xù)添加)

二、基本介紹

使用語(yǔ)言:python

環(huán)境:win10/python3.7(需要chardet,代碼中有注釋)

運(yùn)行軟件:Vscode/IDLE (Python 3.7 64-bit)(目前這個(gè)腳本還沒(méi)有封裝成插件)

調(diào)試最方便的就是在VScode里面安裝python的插件

三、python代碼

3.1 提取Verilog文件關(guān)鍵字的代碼

##------------------------------------------------------------------------------------------------##--##-- 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 #請(qǐng)大家尤其注意此處,調(diào)用這個(gè)是需要下載另外一個(gè)文件的 #如果找不到,可以找群主要(Python Universal Character Encoding Detector)import osimport time

def delComment( Text ): “”“ removed comment ”“” single_line_comment = re.compile(r“//(.*)$”, re.MULTILINE)# (.*) 代表匹配除換行符之外的所有字符re.MULTILINE變成每行開(kāi)始和結(jié)束 multi_line_comment = re.compile(r“/*(.*?)*/”,re.DOTALL)# (.*?)后面多個(gè)問(wèn)號(hào),代表非貪婪模式,也就是說(shuō)只匹配符合條件的最少字符 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表示忽略大小寫(xiě) return Text #w匹配包括下劃線的任何單詞字符。等價(jià)于‘[A-Za-z0-9_]’ #W匹配任何非單詞字符。等價(jià)于 ‘[^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匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ 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 創(chuàng)建文件夾和在文件中寫(xiě)入數(shù)據(jù)

“”“ 打開(kāi)目標(biāo)文件,這里的文件需要大家自己手動(dòng)給出路徑,當(dāng)封裝為插件后則是可以自動(dòng)獲取文件路徑,這里僅做測(cè)試用”“”

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

“”“這里的i2c_dri.v是需要生成TB的原文件名字,需要給出名字,封裝后也是自動(dòng)獲取”“”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)

“”“這里的地址需要放到目標(biāo)文件地址的上一級(jí),封裝成插件也是自動(dòng)獲取的并且創(chuàng)建TB文件夾,同時(shí)創(chuàng)建.v文件,tb文件的命名方式是目標(biāo)文件的模塊名字+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”)

“”“這里是將提取出來(lái)的字符寫(xiě)入生成的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”)

因?yàn)橘N出的代碼已經(jīng)添加了比較詳細(xì)的注釋,具體的文章內(nèi)容就不再贅述代碼具體功能,python屬于特別好上手的語(yǔ)言,主要去調(diào)取一些接口來(lái)實(shí)現(xiàn)了想要的功能。因?yàn)榇a是邊學(xué)邊寫(xiě),花的時(shí)間很短,代碼質(zhì)量不高,也歡迎大家批評(píng)指正。

四、代碼測(cè)試

進(jìn)入正題:

測(cè)試前準(zhǔn)備好前面所說(shuō)的環(huán)境(其他環(huán)境沒(méi)有具體測(cè)試,python版本影響應(yīng)該不大)

首先準(zhǔn)備好一個(gè)測(cè)試的文件夾,一個(gè)需要測(cè)試的Verilog原文件,這里使用一個(gè)i2c_dri.v做一個(gè)簡(jiǎn)單的測(cè)試

大家根據(jù)代碼描述格式和注釋添加自己的測(cè)試路徑,完成的基本功能就是創(chuàng)建一個(gè)TB文件夾,創(chuàng)建測(cè)試文件(名字是:模塊名+創(chuàng)建測(cè)試文件的時(shí)間,如果有需要可以修改為和測(cè)試文件內(nèi)模塊名一樣(tb_模塊名)),自動(dòng)用Vscode打開(kāi)(前提是你電腦的.v文件默認(rèn)打開(kāi)方式是Vscode,如果不是那么就會(huì)使用默認(rèn)的編輯器打開(kāi))

小結(jié):如果覺(jué)得Tb文件名不好的,讀者可以自行把文件名修改為和TB文件的模塊名一致(從python代碼中修改),其它功能和優(yōu)化會(huì)陸續(xù)進(jìn)行。

六、總結(jié)

使用python寫(xiě)這個(gè)腳本配置環(huán)境其實(shí)還是有些麻煩的,有更方便快捷的腳本語(yǔ)言也歡迎討論。

寫(xiě)這個(gè)代碼主要為了給習(xí)慣使用Vscode的讀者提供一個(gè)基礎(chǔ)的平臺(tái),可以在這個(gè)基礎(chǔ)上實(shí)現(xiàn)自己定制化的腳本,后續(xù)也會(huì)封裝成VScode插件,VHDL的自動(dòng)生成測(cè)試文件腳本也基本測(cè)試完成,后續(xù)代碼也會(huì)公布。如果大家有其他便利的腳本也歡迎和作者交流。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    30

    文章

    1373

    瀏覽量

    114324
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4956

    瀏覽量

    73491
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4866

    瀏覽量

    89801

原文標(biāo)題:在VScode中自動(dòng)生成Verilog仿真文件(Python)

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    何在LTspice仿真中實(shí)現(xiàn)偽隨機(jī)數(shù)和真隨機(jī)數(shù)的生成

    本文討論如何在LTspice仿真中利用flat()、gauss()和mc()函數(shù)來(lái)實(shí)現(xiàn)偽隨機(jī)數(shù)和真隨機(jī)數(shù)的生成,并介紹如何使用設(shè)置面板的Hacks部分的 Use the clock
    的頭像 發(fā)表于 01-09 14:08 ?3929次閱讀
    如<b class='flag-5'>何在</b>LTspice<b class='flag-5'>仿真</b>中實(shí)現(xiàn)偽隨機(jī)數(shù)和真隨機(jī)數(shù)的<b class='flag-5'>生成</b>

    VSCode + ESP-IDF環(huán)境下給ESP32-S3項(xiàng)目添加頭文件

    VSCode + ESP-IDF環(huán)境下給ESP32-S3項(xiàng)目添加頭文件
    的頭像 發(fā)表于 11-28 07:27 ?1668次閱讀

    請(qǐng)問(wèn)測(cè)試用例.verilog文件是怎么生成的呢?

    仿真時(shí)可以通過(guò)添加.verilog文件,直接讀入ITCM,從而在仿真時(shí)我們就可以知道處理器的運(yùn)行結(jié)果,例如打印hello_world字樣
    發(fā)表于 11-11 07:56

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

    project編譯后生成仿真需要的.verilog文件: 1.打開(kāi)一個(gè)工程,右鍵選擇工程名,打開(kāi)Properties: 2.選擇C/C++ Build -&gt;setti
    發(fā)表于 11-05 07:07

    Hbirdv2在vivado2018.3上的仿真工作

    可以在官方給的文件獲得實(shí)例.verilog文件,如果我們想要仿真自己C程序編譯出來(lái)的對(duì)應(yīng).verilo
    發(fā)表于 10-31 08:43

    語(yǔ)法糾錯(cuò)和testbench的自動(dòng)生成

    在編寫(xiě)Verilog代碼時(shí),我一般都是先在編輯器上寫(xiě)完,因?yàn)榫庉嬈?b class='flag-5'>vscode或者notepad++可以提供語(yǔ)法高亮和自動(dòng)補(bǔ)全等功能,然后用仿真器跑
    發(fā)表于 10-27 07:07

    在VIVADO對(duì)NICE進(jìn)行波形仿真的小問(wèn)題的解決

    分別如下圖 可以看到,輸出運(yùn)算結(jié)果的pritnf函數(shù)被#ifdef所定義,所以我們?nèi)绻朐赩IVADO的控制臺(tái)看到輸出結(jié)果,要先在main.c定義DEBUG_INFO,如下圖 這樣,將編譯后生成的.verilog
    發(fā)表于 10-27 06:41

    芯來(lái)e203移植開(kāi)發(fā)分享(二)——仿真文件簡(jiǎn)述與itcm固化程序

    可以在makefile設(shè)置自己想要仿真的testcase,這里使用的rv32ui-p-add.verilog,這里我們把的這個(gè)文件復(fù)制的上次分享建立的
    發(fā)表于 10-27 06:04

    何在vivado上基于二進(jìn)制碼對(duì)指令運(yùn)行狀態(tài)進(jìn)行判斷

    a0 -8 為例 獲取相應(yīng)的二進(jìn)制碼將其轉(zhuǎn)換為16進(jìn)制導(dǎo)入vivado,方法就是將代碼文件修改為.verilog文件并存入蜂鳥(niǎo)的tb文件夾,在vivado的tb
    發(fā)表于 10-24 06:46

    NucleiStudio如何生成.verilog文件和.dasm文件,以及對(duì).dasm文件自定義指令反匯編結(jié)果分析

    硬件設(shè)計(jì)需要.verilog文件來(lái)運(yùn)行加NICE后的tb仿真、軟件組需要.dasm來(lái)確定自定義指令有無(wú)被正確編譯。今天,我們來(lái)分享一下NucleiStudio如何生成.
    發(fā)表于 10-24 06:33

    Nucleistudio+Vivado協(xié)同仿真教程

    編譯完成后,我們會(huì)在工程目錄下發(fā)現(xiàn)生成了.verilog文件,此即為我們仿真需用到的文件,可以將改
    發(fā)表于 10-23 06:22

    使用Simulink自動(dòng)生成浮點(diǎn)運(yùn)算HDL代碼(Part 1)

    引言 想要實(shí)現(xiàn)浮點(diǎn)運(yùn)算功能,如果自己寫(xiě)Verilog代碼,需要花費(fèi)較多的時(shí)間和精力。好在Simulink HDL Coder工具箱提供了自動(dòng)代碼生成技術(shù)。下圖展示了HDL Coder如何生成
    發(fā)表于 10-22 06:48

    何在Vivado上仿真蜂鳥(niǎo)SOC,仿真NucleiStudio編譯好的程序

    ram的IP就可以 2. 將機(jī)器指令初始化到ITCM的bank-ram-IP 生成的機(jī)器指令在這里 然后我們需要把它轉(zhuǎn)化為coe文件 我們參考網(wǎng)上的相關(guān)代碼,做了hex到coe的轉(zhuǎn)換,核心代碼實(shí)現(xiàn)如下: 讀取hex: 生成
    發(fā)表于 10-21 11:08

    生成式 AI 重塑自動(dòng)駕駛仿真:4D 場(chǎng)景生成技術(shù)的突破與實(shí)踐

    生成式AI驅(qū)動(dòng)的4D場(chǎng)景技術(shù)正解決傳統(tǒng)方法效率低、覆蓋不足等痛點(diǎn),如何通過(guò)NeRF、3D高斯?jié)姙R等技術(shù)實(shí)現(xiàn)高保真動(dòng)態(tài)建模?高效生成極端天氣等長(zhǎng)尾場(chǎng)景?本文為您系統(tǒng)梳理AI驅(qū)動(dòng)的4D場(chǎng)景生成體系及其在
    的頭像 發(fā)表于 08-06 11:20 ?5028次閱讀
    <b class='flag-5'>生成</b>式 AI 重塑<b class='flag-5'>自動(dòng)</b>駕駛<b class='flag-5'>仿真</b>:4D 場(chǎng)景<b class='flag-5'>生成</b>技術(shù)的突破與實(shí)踐

    使用 QWQ:32B 模型搭配 VSCode 的 Cline 插件實(shí)現(xiàn)自動(dòng)化代碼編程!

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