色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用Python實現Vivado和ModelSim仿真自動化?

FPGA開源工作室 ? 來源:網絡交換FPGA ? 作者:網絡交換FPGA ? 2021-05-03 10:06 ? 次閱讀

芯片設計從RTL代碼一直到最后流片的GDSII文件,都是文本文件,因此,掌握文本分析處理語言是集成電路設計的一項重要的基本功。本公眾號一直致力于推廣采用文本分析工具來提升仿真和綜合效率的方法。詳見本公眾號專輯《芯片設計課程及相關實驗》。本文是孫義雯同學采用Python語言實現的Vivado和Modelsim聯合仿真的自動化腳本,已經在實際項目中經過較長時間的檢驗,今天開源出來,供大家學習,歡迎留言交流心得體會和改進建議。同時,后續我們會陸續推出基于Python的Verilog代碼智能化分析處理文章,敬請期待。

我們在Windows系統下使用Vivado的默認設置調用第三方仿真器比如ModelSim進行仿真時,一開始仿真軟件都會默認在波形界面中加載testbench頂層的信號波形,并自行仿真1000ns后停止。當我們想查看對應模塊的波形時,需要自己去手動添加,并且為了防止跑一段時間仿真后,添加新模塊或者信號卻發現沒有記錄波形,就要提前手動在控制臺上執行log -r 。/*命令來實現對全部信號波形的記錄。但是每當我們修改完代碼,關閉重啟仿真器再一次仿真時,就需要將之前的操作(刪改添加對應模塊信號,執行log -r 。/*等)重新完成一遍才能繼續跑出想看的信號波形。

盡管可以通過將仿真時添加的模塊信號保存為*.do文件,下次仿真通過執行do *.do的形式來快速添加之前波形;但在頻繁修改代碼,需要經常重新仿真的情況下,每次都手動去添加信號的操作會比較影響到我們的情緒,那么能否通過腳本語言比如Python來實現一鍵仿真并自動添加好所需要的模塊信號呢?首先我們需要對Vivado軟件實現第三方仿真的過程進行分析,弄清楚其中的步驟。 Vivado軟件第三方仿真分析

1.1 Vivado調用第三方軟件方式

參考之前的文章:用Modelsim獨立仿真帶Vivado IP核的仿真工程,我們可以知道Vivado軟件執行和生成仿真文件是在工程的仿真目錄工程名.sim/下,然后我們打開一個示例工程的仿真目錄,如圖所示

7d464730-9d17-11eb-8b86-12bb97331649.png

結合圖片和文章我們可以看出,Vivado軟件調用第三方仿真器的方式,是根據之前在工程文件中設置的仿真器路徑和聯調庫路徑等參數,在工程仿真目錄下生成一系列仿真用的Tcl腳本和系統的批處理腳本(Linux下就是shell),通過系統命令執行上面的批處理腳本(先compile,再elaborate,最后simulate),來調用第三方仿真軟件實現仿真功能。

1.2 Vivado仿真腳本分析

上面圖片中共有三個批處理腳本:compile.bat、elaborate.bat、simulate.bat。依次分別實現了三種功能:compile、elaborate、simulate。下面我們對每個批處理腳本的內容分別進行分析。

1.2.1 compile相關腳本

compile.bat腳本全部內容如下:

@echo offset bin_path=C:questasim64_10.6cwin64call %bin_path%/vsim -c -do “do {xxxxxxxx_compile.do}” -l compile.logif “%errorlevel%”==“1” goto ENDif “%errorlevel%”==“0” gotoSUCCESS:ENDexit 1:SUCCESSexit 0

本工程設置的第三方仿真器為Questasim,腳本中具體功能實現在第2和第3行:

設置二進制文件路徑bin_path;

調用該路徑下的vsim程序執行do {xxxxxxxx_compile.do}命令。

其中的xxxxxxxx_compile.do是跟批處理腳本同一目錄下的Tcl腳本文件,文件內容如下(已添加注釋):

######################################################################## File name : xxxxxxxx_compile.do# Created on: Fri Aug 14 1609 +0800 2020## Auto generated by Vivado for ‘behavioral’ simulation########################################################################新建work庫vlib work#新建msim庫vlib msim

#新建msim/xil_defaultlib庫vlib msim/xil_defaultlib

#將目前的邏輯工作庫xil_defaultlib和實際工作庫msim/xil_defaultlib映射對應vmap xil_defaultlib msim/xil_defaultlib

#編譯verilog代碼文件(VHDL文件需要用vcom命令),編譯到xil_defaultlib庫下vlog -64 -incr -work xil_defaultlib #vivado的官方IP核提供的仿真代碼文件“。。/。。/。。/xxxxxxxxxxxx.srcs/sources_1/ip/xxxxxxxxxxxx/xxxxxxxxxxxx_sim_netlist.v” “。。/。。/。。/xxxxxxxxxxxx.srcs/sources_1/ip/xxxxxxxxxxxx/xxxxxxxxxxxx_sim_netlist.v” “。。/。。/。。/xxxxxxxxxxxx.srcs/sources_1/ip/xxxxxxxxxxxx/xxxxxxxxxxxx_sim_netlist.v” “。。/。。/。。/xxxxxxxxxxxx.srcs/sources_1/ip/xxxxxxxxxxxx/xxxxxxxxxxxx_sim_netlist.v” “。。/。。/。。/xxxxxxxxxxxx.srcs/sources_1/ip/xxxxxxxxxxxx/xxxxxxxxxxxx_sim_netlist.v” #工程中自行編寫的代碼文件“。。/。。/。。/。。/rtl/xxx/xxxxxxx.v” “。。/。。/。。/。。/rtl/xxxx/xxxxxxx.v” 以下省略若干行的代碼文件。。.。。.。。

# compile glbl modulevlog -work xil_defaultlib “glbl.v”

#強制退出quit -force

看過上述代碼和注釋,我們可以了解到compile腳本通過調用第三方仿真器執行對應的Tcl腳本xxxxxxxx_compile.do實現了對工程中代碼文件的編譯,其中xxxxxxxx_compile.do中會寫入全部工程代碼文件的路徑。

1.2.2 elaborate腳本

elaborate.bat腳本全部內容如下:

@echo offset bin_path=C:questasim64_10.6cwin64call %bin_path%/vsim -c -do “do {xxxxxxxx_elaborate.do}” -l elaborate.logif “%errorlevel%”==“1” goto ENDif “%errorlevel%”==“0” goto SUCCESS:ENDexit 1:SUCCESSexit 0

同樣可以看出,該腳本中實現的具體功能為:

設置二進制文件路徑bin_path;

調用該路徑下的vsim程序執行do {xxxxxxxx_elaborate.do}命令。

其中xxxxxxxx_elaborate.do腳本的內容如下(已加注釋):

######################################################################## File name : xxxxxxxx_elaborate.do# Created on: Fri Aug 14 1615 +0800 2020## Auto generated by Vivado for ‘behavioral’ simulation########################################################################vopt是在使用vcom或vlog編譯設計后對其執行全局優化vopt -64 +acc=npr -L xil_defaultlib -L unisims_ver -L unimacro_ver -L secureip -L xpm -work xil_defaultlib xil_defaultlib.xxxxxxxxx xil_defaultlib.glbl -o xxxxxxxxx_opt#強制退出quit -force

可以看出上述腳本主要實現的功能是對代碼編譯后的設計文件進行全局優化。

1.2.3 simulate腳本

simulate.bat腳本全部內容如下:

@echo offset bin_path=C:questasim64_10.6cwin64call %bin_path%/vsim -do “do {xxxxxxxx_simulate.do}” -l simulate.logif “%errorlevel%”==“1” goto ENDif “%errorlevel%”==“0” goto SUCCESS:ENDexit 1:SUCCESSexit 0

該腳本中實現的具體功能為:

設置二進制文件路徑bin_path;

調用該路徑下的vsim程序執行do {xxxxxxxx_simulate.do}命令。

其中xxxxxxxx_simulate.do腳本的內容如下(已加注釋):

######################################################################## File name : xxxxxxxx_simulate.do# Created on: Fri Aug 14 1622 +0800 2020## Auto generated by Vivado for ‘behavioral’ simulation########################################################################指定vsim查找設計單元的默認工作庫為xil_defaultlib,并對指定的優化后的設計開始仿真vsim -lib xil_defaultlib xxxxxxxx_opt

#設置變量NumericStdNoWarnings為1,即禁用在加速的numeric_std和numeric_bit包中生成的警告set NumericStdNoWarnings 1#設置變量StdArithNoWarnings為1,即禁用在加速Synopsys標準軟件包中生成的警告set StdArithNoWarnings 1

#執行xxxxxxxx_wave.do文件中的tcl指令do {xxxxxxxx_wave.do}

#打開wave窗口view wave#打開structure窗口view structure#打開signals窗口view signals

#執行xxxxxxxx.udo文件中的tcl指令do {xxxxxxxx.udo}

#仿真1000nsrun 1000ns

該腳本中實現了調用第三方仿真軟件對優化后的設計開始仿真,調出仿真界面,執行xxxxxxxx_wave.do腳本,打開仿真相關窗口,并繼續執行xxxxxxxx.udo腳本。下面我們接著給出xxxxxxxx_wave.do腳本的內容:

######################################################################## File name : `xxxxxxxx_wave.do# Created on: Fri Aug 14 1622 +0800 2020## Auto generated by Vivado for ‘behavioral’ simulation########################################################################添加當前模塊內(即仿真頂層模塊)信號add wave *#添加GSR(全局復置位信號)add wave /glbl/GSR

可知xxxxxxxx_wave.do腳本文件主要功能是實現對仿真波形的添加。而另一個xxxxxxxx.udo腳本中無實際內容:

######################################################################## File name : xxxxxxxx.udo# Created on: Wed Jun 10 1649 +0800 2020## Auto generated by Vivado for ‘behavioral’ simulation#######################################################################

說明在默認設置下,Vivado是不通過xxxxxxxx.udo腳本執行命令的。

1.2.4 仿真腳本總結

至此,我們基本弄清楚了這三個腳本的功能以及與其他腳本文件之間的關系:

compile.bat腳本主要實現對仿真代碼文件的編譯;

elaborate.bat腳本主要對編譯后的設計進行全局的優化,并生成優化后的結果;

simulate.bat腳本則是具體調出仿真軟件界面對優化后的設計進行仿真,控制仿真軟件相關窗口的顯示、模塊信號的添加等等其他與最終波形仿真相關的操作。

于是,如果想通過python腳本實現仿真自動化添加波形等的操作,那么就需要在simulate.bat腳本及其相關的do腳本文件上做文章。

1.3 Vivado仿真功能選項

在進一步分析Vivado仿真操作,思考如何使用python腳本實現我們想要的自動化之前,我們可以先問這樣一個問題:難道Vivado軟件真的沒有提供仿真自動添加自定義波形等等方便仿真操作的功能嗎?關于這個問題,我們可以先去查看Vivado軟件仿真功能自帶的仿真選項,就在設置第三方仿真器路徑和聯調庫路徑的地方,如圖所示:

7d57386a-9d17-11eb-8b86-12bb97331649.png

可以看到在下面紅框中有三個標簽頁Compilation、Elaboration、Simulation,分別對應仿真時的三個步驟和生成的相關腳本文件。打開Simulation標簽頁,我們可以看到下面有多行選項,其中就有runtime仿真時間,默認是1000ns。然后下一行紅橫線上內容是log_all_signals,“記錄全部信號”,那這個是仿真自動執行log -r 。/*命令的選項嗎?我們先將該選項打勾。然后接著向下看,有個custom_wave_do的選項,在上面腳本分析中我們知道xxxxxxxx_wave.do腳本文件實現的是仿真添加模塊信號的功能,那這里是仿真添加自定義信號的選項嗎?這里我將之前該工程仿真保存的一版信號文件wave.do拷貝到仿真腳本所在behave目錄的上一級目錄下:

7d8f4d5e-9d17-11eb-8b86-12bb97331649.png

然后如上面仿真選項圖中所示寫入custom_wave_do選項的路徑為:。。/wave.do,然后重新開始仿真。出現仿真波形界面如圖:

7dc763ce-9d17-11eb-8b86-12bb97331649.png

該界面中添加的信號分組與。。/wave.do文件中設置的信號相同,說明這里實現了對自定義信號的自動添加。接著我們再打開仿真目錄下的xxxxxxxx_simulate.do腳本查看,其內容如下:

######################################################################## File name : xxxxxxxx_simulate.do# Created on: Fri Aug 14 2140 +0800 2020## Auto generated by Vivado for ‘behavioral’ simulation#######################################################################vsim -lib xil_defaultlib xxxxxxxx_opt

set NumericStdNoWarnings 1set StdArithNoWarnings 1

do {。。/wave.do}

view waveview structureview signals

log -r /*

do {xxxxxxxx.udo}

run 1000ns

可以看到在Vivado生成的該腳本中第14行和第20行,已經自動添加上了do {。。/wave.do}和log -r /*的命令,說明的確在仿真時就可以實現自動記錄全部信號波形和自動添加自定義信號的操作。因此,Vivado本身就已經提供了這樣方便的仿真操作選項,如果只是想實現自動記錄全部信號波形和自動添加保存的自定義信號波形操作的話,我們直接設置修改仿真選項中的log_all_signals和custom_wave_do兩個選項的內容即可。但是初出茅廬的我并沒有想到向Vivado提出問題,而是按照自己的想法開始了Python腳本的折騰之路。

7dd495c6-9d17-11eb-8b86-12bb97331649.jpg

初步設想功能的Python實現在1.2節對仿真腳本的分析中,我們知道了如果想實現仿真自動添加和記錄信號的功能,就需要對仿真最后一步simulate.bat相關的腳本進行對應的修改。但首先,這些腳本都是Vivado仿真時自動生成的,那如果一開始沒有腳本,或者我們添加了一些代碼文件后,腳本需要更新怎么辦?(compile.bat相關的.do腳本中沒有新加入的代碼文件的路徑,自然就無法去編譯新的代碼)因此我們就需要首先讓Vivado來產生仿真相關的最新腳本,再去實現對腳本的更改。

2.1 Vivado軟件仿真腳本生成

參考實驗室張仲禹同學的這篇文章

實驗室自研工具Vivado Batch Mode Tool介紹!

https://mp.weixin.qq.com/s/EcrZl8iM0SZbpLrlXUJ6CA,我們可以了解到Vivado軟件在運行上提供了批處理模式batch mode,通過批處理模式和Tcl腳本可以讓Vivado軟件對特定工程執行具體功能。因此這里只要利用批處理模式讓Vivado軟件對當前工程生成仿真腳本即可。那么如何去查找生成仿真腳本的對應指令呢?當我們點擊Vivado工程GUI界面的仿真按鈕時,界面底部的控制臺Tcl Console便會立刻顯示并執行launch_simulation的命令,如圖所示:

7de10388-9d17-11eb-8b86-12bb97331649.png

我們打開Vivado的Tcl命令手冊UG835,查找到launch_simulation命令詞條如下:

7e02f9a2-9d17-11eb-8b86-12bb97331649.png

launch_simulation命令是運行仿真的命令,可以看到語法中有一個-scripts_only選項,其描述是:僅生成腳本。這里的腳本自然是相關的仿真腳本。只要利用這個命令選項就能實現對工程仿真腳本的生成。當然,我們想實現的是功能仿真,因此在執行該命令時,最好在上面的-mode選項中選擇behavioral。那么,實現對功能仿真腳本生成功能的命令就應該是:launch_simulation -mode behavioral -scripts_only,為了驗證命令正確性,我們可以利用Vivado工程的GUI界面提前進行測試,在刪除仿真目錄下的文件后,在命令控制臺Tcl Console輸入并執行該命令,執行完后檢測仿真目錄下是否生成了相關腳本,經過驗證,該命令可以生成仿真腳本。

2.2 功能實現思路

至此,我們針對功能的實現思路做如下總結:

使用Python調用Vivado軟件的批處理模式batch mode執行launch_simulation -mode behavioral -scripts_only命令,來生成當前工程的功能仿真腳本;

利用python可以對生成的simulate.bat相關的腳本內容進行修改,添加log -r 。/*以實現自動記錄全部信號波形,添加執行自定義wave.do腳本命令或將想添加的信號文件內容替換進默認生成的xxxxxxxx_wave.do腳本中,完成仿真時對自定義信號的自動化添加;

使用python中的系統函數庫依次執行compile.bat、elaborate.bat、simulate.bat腳本,調出仿真界面執行仿真。

2.3 具體實現

2.3.1 使用Python調用Vivado軟件生成仿真腳本

具體實現代碼和注釋如下:

import os

# 指定工程xpr文件路徑XprFilePath = ‘xxxxxxxx_project.xpr’# 指定Tcl腳本路徑SimTclFilePath = ‘sim.tcl’

# 命令-在使用命令行調用Vivado軟件前需要運行的批處理文件SourceSettingsFileCmd = ‘call C:/Xilinx/Vivado/2017.2/settings64.bat’ # 命令-調用Vivado軟件的batch mode打開當前工程文件并執行Tcl腳本中的生成仿真腳本命令VivadoBatchModeScriptsCmd = ‘vivado -mode batch -source ’ + SimTclFilePath + ‘ -nojournal -nolog ’ + XprFilePath

# 組合前兩條命令并調用系統函數依次執行os.system(SourceSettingsFileCmd + ‘ && ’ + VivadoBatchModeScriptsCmd)

其中上面代碼中用到的sim.tcl文件內容為:

#僅生成仿真腳本launch_simulation -mode behavioral -scripts_only

將兩個腳本放置于工程xpr文件的同目錄下,使用Python3執行,執行后仿真目錄結果如下:

7e317d9a-9d17-11eb-8b86-12bb97331649.png

接下來我們依次對生成的腳本進行檢查,查看本次使用Vivado的batch mode生成的仿真腳本與第一章中腳本內容是否存在差別。經過對比,發現除了xxxxxxxx_simulate.do文件和simulate.bat腳本存在一點差別外,其他腳本內容完全相同,存在差別的腳本內容如下xxxxxxxx_simulate.do內容:

######################################################################## File name : xxxxxxxx_simulate.do# Created on: Sat Aug 15 1541 +0800 2020## Auto generated by Vivado for ‘behavioral’ simulation#######################################################################vsim -lib xil_defaultlib xxxxxxxx_opt

set NumericStdNoWarnings 1set StdArithNoWarnings 1

do {xxxxxxxx_wave.do}

view waveview structureview signals

do {xxxxxxxx.udo}

run 1000ns

quit -force

內容差別在最后一行,相比Vivado的GUI界面下點擊仿真按鈕生成的腳本,batch mode下使用仿真選項-scripts_only生成腳本xxxxxxxx_simulate.do的最后一行額外添加了強制退出的命令quit -force,這會導致調出的仿真程序在執行完全部的仿真命令后,立刻關閉界面并退出程序,所以仿真時,我們需要在該腳本執行前刪除掉該命令。simulate.bat內容:

@echo offset bin_path=C:questasim64_10.6cwin64call %bin_path%/vsim -c -do “do {xxxxxxxx_simulate.do}” -l simulate.logif “%errorlevel%”==“1” goto ENDif “%errorlevel%”==“0” goto SUCCESS:ENDexit 1:SUCCESSexit 0

內容差別在第三行,在vsim命令后多出了一個-c的選項,查找QuestaSim命令手冊中vsim詞條的-c選項描述如圖:

7e438594-9d17-11eb-8b86-12bb97331649.png

可以看出-c選項是以命令行模式command-line mode執行vsim命令,也就是說,該選項執行后打開的不是仿真軟件的GUI界面,而是黑乎乎的命令行界面,這將導致我們無法實時查看跑出的仿真波形,所以在仿真時,-c也需要刪除掉。內容差別總結因此,在后續對腳本的處理中,我們除了添加log -r 。/*命令和將想添加的信號替換進xxxxxxxx_wave.do腳本中之外,還需要額外刪除腳本xxxxxxxx_simulate.do最后一行的quit -force,以及腳本simulate.bat中vsim命令后的-c。

2.3.2 使用Python修改并執行仿真腳本

具體實現代碼和注釋如下:

import os

# 仿真目錄路徑SimDirPath = ‘xxxxxxxx.sim/sim_1/behav/’# compile批處理腳本名稱CompileBatName = ‘compile.bat’# elaborate批處理腳本名稱ElaborateBatName = ‘elaborate.bat’# simulate批處理腳本名稱SimulateBatName = ‘simulate.bat’# 由于所執行的腳本內容里存在一些相對路徑,所以在執行腳本前,需要將系統路徑切換到所執行腳本所在的目錄下# 執行Compile腳本os.system(‘cd ’ + SimDirPath + ‘ && ’ + ‘call ’ + CompileBatName)# 執行Elaborate腳本os.system(‘cd ’ + SimDirPath + ‘ && ’ + ‘call ’ + ElaborateBatName)

# 修改xxxxxxxx_simulate.do腳本,刪除run 1000ns和quit -force,添加log -r 。/*SimulateDoFile = open(SimDirPath + ‘xxxxxxxx_simulate.do’, ‘r’)SimulateDoFileAllLines = SimulateDoFile.readlines()SimulateDoFile.close()SimulateDoFile = open(SimDirPath + ‘xxxxxxxx_simulate.do’, ‘w’)for EachLine in SimulateDoFileAllLines: if EachLine.find(‘run 1000ns’) == -1 and EachLine.find(‘quit -force’) == -1: SimulateDoFile.writelines(EachLine)SimulateDoFile.writelines(‘

log -r 。/*

’)SimulateDoFile.close()

# 刪除simulate.bat腳本中的-c選項內容SimulateBatFile = open(SimDirPath + SimulateBatName, ‘r’)SimulateBatFileAllLines = SimulateBatFile.readlines()SimulateBatFile.close()SimulateBatFile = open(SimDirPath + SimulateBatName, ‘w’)for EachLine in SimulateBatFileAllLines: if EachLine.find(‘%bin_path%/vsim -c -do’) != -1: EachLine = EachLine.replace(‘%bin_path%/vsim -c -do’, ‘%bin_path%/vsim -do’) SimulateBatFile.writelines(EachLine)SimulateBatFile.close()

# 將當前目錄下信號文件wave.do中的內容覆寫到仿真目錄下的xxxxxxxx_wave.do文件中SimWaveDoFile = open(‘wave.do’, ‘r’)SimWaveDoFileAllLines = SimWaveDoFile.readlines()SimWaveDoFile.close()SimWaveDoFile = open(SimDirPath + ‘xxxxxxxx_wave.do’, ‘w’)SimWaveDoFile.writelines(SimWaveDoFileAllLines)SimWaveDoFile.close()

# 執行Simulate腳本os.system(‘cd ’ + SimDirPath + ‘ && ’ + ‘call ’ + SimulateBatName)

上述代碼中涉及到的信號文件wave.do依舊是之前第1.3節測試仿真選項時使用的文件,將其放置在腳本所在的目錄下,然后使用Python3運行腳本,運行結果截圖如下:

7e504392-9d17-11eb-8b86-12bb97331649.png

可以看到成功實現了對仿真軟件的調用以及波形的自動添加,而且在使用時也不需要打開Vivado工程的GUI界面。2.4 實現總結與展望上述代碼功能的具體實現主要分以下幾個步驟:

使用Python系統函數調用Vivado的batch mode對當前工程執行sim.tcl腳本中的launch_simulation -mode behavioral -scripts_only命令,生成功能仿真的相關腳本;

使用Python系統函數在仿真目錄下依次執行生成的compile.bat和elaborate.bat腳本,實現對仿真代碼文件的編譯和后續的全局優化;

讀取生成的xxxxxxxx_simulate.do腳本文件內容,刪除其中的run 1000ns和quit -force,并添加上log -r 。/*后重新覆寫xxxxxxxx_simulate.do腳本;

讀取生成的simulate.bat腳本文件內容,刪除其中vsim命令后的-c選項后,重新覆寫simulate.bat腳本;

讀取Python腳本所在目錄下wave.do文件的內容,覆寫到仿真目錄下xxxxxxxx_wave.do腳本文件中,實現在仿真時對自定義信號的添加;

使用Python的系統函數在仿真目錄下執行simulate.bat腳本,調出仿真程序界面。

至此,我們就用總計約60行不到的Python代碼外加1行的Tcl代碼實現了最初設想的目標。但是,這樣的腳本還存在著許多粗糙的缺陷或有待發展之處:

代碼各種變量如工程文件路徑、軟件版本路徑、仿真目錄路徑等的賦值都是固定賦值,那么在將腳本遷移到另一個工程下使用時,就需要根據版本和工程目錄名等環境自行去修改腳本,無法做到傻瓜式操作;

代碼從調用Vivado的batch mode生成仿真腳本,再到compile、elaborate,最后到simulate,總共的耗時較長,對于簡單的修改代碼后進行仿真,不涉及到代碼文件添加或IP核添加時,是不需要重新生成仿真腳本的,直接從compile開始就行;而對于無代碼修改的情況,直接執行simulate腳本進行最后一步即可,就更不需要前面這些花費時間較長的步驟;

除去仿真功能外,我們平時進行Vivado開發時,還存在許多本可以用腳本自動化實現的繁瑣操作,這些均可以整合進一個或一組腳本中。

優化功能的Python實現第二章最后總結給出了初始腳本的缺陷和有待發展之處,其中第二項缺陷可以通過提供多種條件選項的方式,實現多種仿真步驟,解決較為簡單。本章將主要針對第二章總結的第一項缺陷進行分析,并加以解決。

3.1 優化功能分析

我們期望將腳本拷貝到另一版工程時,可以不經修改直接運行,這就要求腳本可以自動提取到其運行所需的一系列參數,從而直接對環境進行匹配。首先讓我們總結一下初步功能的Python實現中的具體缺陷,有哪些地方在遷移到另一工程后需要修改。

3.1.1 參數分析

這里以流水賬的形式,對初步功能的Python代碼中用到的全部參數進行羅列和分析:

3.1.1.1 指定的工程xpr文件路徑

# 指定工程xpr文件路徑XprFilePath = ‘xxxxxxxx.xpr’

該參數的作用是能夠讓Vivado軟件針對當前指定的工程實現具體功能,每當腳本拷貝到另一個不同的工程時,該參數基本肯定會改變,所以最好能進行自動識別。每個工程在其工程目錄下默認都只有一個xpr文件,而Python也提供了返回指定系統目錄下文件名列表的函數os.listdir,可以很方便的實現對特定文件名稱的獲取,只需對文件名進行判別是否是xpr文件即可實現自動識別。

3.1.1.2 指定的Tcl腳本路徑

# 指定Tcl腳本路徑SimTclFilePath = ‘sim.tcl’

由于指定Tcl腳本是跟隨Python腳本一起的,與實際仿真哪個工程無關,名稱和位置都固定,因此這里可以繼續使用固定賦值。

3.1.1.3 執行的系統命令

# 命令-在使用命令行調用Vivado軟件前需要運行的批處理文件SourceSettingsFileCmd = ‘call C:/Xilinx/Vivado/2017.2/settings64.bat’ # 命令-調用Vivado軟件的batch mode打開當前工程文件并執行Tcl腳本中的生成仿真腳本命令VivadoBatchModeScriptsCmd = ‘vivado -mode batch -source ’ + SimTclFilePath + ‘ -nojournal -nolog ’ + XprFilePath

可以將執行的系統命令中新用到的路徑分解為以下幾部分:

系統執行腳本命令:call

Xilinx軟件的安裝目錄:C:/

Vivado工程的版本:2017.2

需要調用的settings腳本名稱:settings64.bat

第二個生成仿真腳本命令VivadoBatchModeScriptsCmd涉及到的Tcl腳本路徑和工程xpr文件路徑已經說過。此處暫時只考慮Windows系統實現,因此上述分解部分中可以考慮自動識別的是:安裝目錄C:/和工程版本2017.2其中安裝目錄在同一個系統中都是固定的,不需要頻繁修改,所以此處僅需要讀取xpr工程文件內容,實現版本的自動識別。

3.1.1.4 仿真目錄路徑(Vivado 2017.2)

# 仿真目錄路徑SimDirPath = ‘xxxxxxxx.sim/sim_1/behav/’

對上述路徑進行分解得:

工程名:xxxxxxxx

仿真集名稱:sim_1

仿真腳本所在目錄(2017.2版本):behav

同樣由于工程名與xpr工程文件名默認相同,并且在工程目錄下默認只有一個后綴名為.sim的目錄,因此同樣可以很容易的實現對該目錄名的識別;對于仿真集名稱,由于同一版工程中可以設置多個不同的仿真集,但在xpr文件內容中對當前有效的仿真集有專門的參數表示,因此可以通過解析xpr文件內容的形式識別出當前仿真集名稱;值得注意的是:不同版本的VIvado在仿真子目錄的路徑上存在一些差別,例如2017.2的仿真腳本全部生成在behav目錄下,但2018.2版本則在behav目錄下還有針對每個仿真器的子目錄,目錄名為小寫的仿真器名稱,所以我們還需要讀取xpr文件內容,識別出當前設置的目標仿真器,才能最終實現對仿真目錄的正確組合。

3.1.1.5 批處理腳本名稱

# compile批處理腳本名稱CompileBatName = ‘compile.bat’# elaborate批處理腳本名稱ElaborateBatName = ‘elaborate.bat’# simulate批處理腳本名稱SimulateBatName = ‘simulate.bat’

在同一類型的系統下,Vivado軟件默認生成的仿真相關批處理腳本的名稱均為固定,因此此處無需修改。

3.1.1.6 總結

在初步功能代碼實現的基礎上,我們至少要對如下參數實現自動識別:

工程xpr文件路徑(主要是工程名)

工程文件版本

工程有效仿真集名稱

工程當前仿真器名稱

3.1.2 xpr文件解析

3.1.2.1 xpr文件結構介紹xpr文件是包含了Vivado工程核心配置內容的文本文件,采用的是xml的內容格式,下面給出一個xpr文件結構示例:

《?xml version=“1.0” encoding=“UTF-8”?》《!-- Product Version: Vivado v2017.2 (64-bit) --》《!-- --》《!-- Copyright 1986-2017 Xilinx, Inc. All Rights Reserved. --》

《Project 。。.。。.。。.。。.。》 《Configuration 》 。。.。。.。。.。。.。 《/Configuration》 《FileSets 》 。。.。。.。。.。。.。 《/FileSets》 《Simulators 》 。。.。。.。。.。。.。 《/Simulators》 《Runs 》 。。.。。.。。.。。.。 《/Runs》《/Project》

可以看到整個xpr文件內容基本全部包含在一個根節點Project內,根節點內部又包含四個子節點Configuration、FileSets、Simulators、Runs。經過對實際的工程xpr文件內容進行分析,我們可以了解到四個子節點的主要內容為:

Configuration:Vivado工程的一系列配置參數,例如:FPGA芯片型號、仿真聯調庫路徑、目標仿真器等等;

FileSets:添加進該工程的全部代碼、IP核或約束文件路徑,及一系列相關的文件屬性:設定的頂層模塊名稱、代碼是否用于綜合、實現、仿真等;

Simulators:包含對當前類型系統下能夠使用的仿真器的描述等;

Runs:包含需要進行Synthesis、Implementation的IP核文件、代碼設計的一系列參數配置。

下面我們結合上一節優化分析的結論,對所需要的xpr文件內容進行進一步的分析和查找。需要解析xpr得到的參數有:工程版本、有效仿真集名稱、當前仿真器名稱。

3.1.2.2 工程版本

經過一番查找,在根節點Project中并沒有發現跟Vivado版本相關的參數,唯一與版本相關的內容僅出現在內容第二行:

《?xml version=“1.0” encoding=“UTF-8”?》《!-- Product Version: Vivado v2017.2 (64-bit) --》《!-- --》《!-- Copyright 1986-2017 Xilinx, Inc. All Rights Reserved. --》

因此我們只能將該行Vivado v后的內容2017.2提取為版本號使用。

3.1.2.3 有效仿真集名稱

表示當前工程的仿真集的參數名為ActiveSimSet,在子節點Configuration中,示例內容如下:

《Option Name=“ActiveSimSet” Val=“sim_1”/》

3.1.2.4 當前仿真器名稱

內容中表示當前仿真器名稱的參數名為TargetSimulator,同樣在子節點Configuration中,示例內容如下:

《Option Name=“TargetSimulator” Val=“Questa”/》

在具體針對xml格式文件的解析上,Python提供了一個xml函數庫,使用其中的parse函數可以對xml文本進行簡單高效的處理。

3.2 功能實現思路

根據上述分析,總結優化功能的實現思路如下:

利用Python的os庫函數實現對特定路徑下工程文件尤其是xpr文件的查找;

在查找到xpr工程文件后,讀取文件內容獲取版本號;

使用Python的xml庫函數對查找到的xpr文件文本內容進行解析,提取出有效仿真集名稱和當前仿真器名稱;

根據上述步驟獲取到的信息,組合相關參數,繼續完成第二章實現的功能。

3.3 具體實現

首先利用Python的os庫中的相關函數實現對工程文件路徑的查找,相關代碼和注釋如下:

import os

# 獲取并返回對應文件或目錄路徑名列表def getProjFilePathList(Path = ‘。/’, FilePartName = ‘.xpr’): # 判斷傳入參數是否為字符串 if type(Path) != str or type(FilePartName) != str: print(‘Error: The type of parameter is wrong! Please ensure each input parameter is a string!’) return [] # 判斷傳入的路徑參數是否存在 if os.path.isdir(Path) == False: print(‘Error: The path does not exist!’) return [] # 查找目標文件,并將查找結果路徑記錄到FilePathList的列表中

FilePathList = [] for FileName in os.listdir(Path): if FileName.find(FilePartName) != -1: FilePathList.append(Path + FileName) # 判斷是否查找到對應文件或目錄路徑 if len(FilePathList) == 0: print(‘Error: Can not find any file or dir whose name including “’ + FilePartName + ‘” in “’ + Path + ‘”’) return FilePathList

# 獲取并返回對應文件或目錄路徑名列表中的第一個路徑def getProjFilePath(Path = ‘。/’, FilePartName = ‘.xpr’): # 獲取并返回對應文件或目錄路徑名列表 FilePathList = getProjFilePathList(Path, FilePartName) # 返回列表中第一個元素 if len(FilePathList) == 0: return ‘’ else: return FilePathList[0]

然后根據查找到的xpr工程文件路徑,讀取內容,從中提取版本號:

# 獲取并返回當前工程版本def getProjVersion(XprFilePathName): VivadoProjVerLine = ‘’ VivadoProjVer = ‘’ VivadoProjVerLoc = -1 # 打開工程文件查找版本號所在行 XprFile = open(XprFilePathName, “r”) for string in XprFile.readlines(): if string.find(‘Product Version: Vivado v’) != -1:

VivadoProjVerLoc = string.find(‘Product Version: Vivado v’) + len(‘Product Version: Vivado v’) VivadoProjVerLine = string break XprFile.close() if VivadoProjVerLoc == -1: VivadoProjVer = ‘’ print(‘Error: Can not find the version of proj, please ensure the xpr file is ok!’)

return VivadoProjVer # 判斷查找到的版本號字符串是否合法 for CharVer in VivadoProjVerLine[VivadoProjVerLoc :]: if CharVer == ‘ ’ and VivadoProjVer != ‘’: break elif CharVer 》= ‘0’ and CharVer 《= ‘9’: VivadoProjVer = VivadoProjVer + CharVer elif CharVer == ‘。’: VivadoProjVer = VivadoProjVer + CharVer else: VivadoProjVer = ‘’ print(‘Error: Can not identify the version of this xpr file!’) return VivadoProjVer return VivadoProjVer

使用Python的xml庫函數解析xpr文件,提取出有效仿真集名稱ActiveSimSet和當前仿真器名稱TargetSimulator:

from xml.dom.minidom import parse

# 解析xpr工程文件doc = parse(XprFilePath)root = doc.documentElement# 記錄解析出的四個節點Configuration = root.getElementsByTagName(‘Configuration’)[0]FileSets = root.getElementsByTagName(‘FileSets’)[0]Simulators = root.getElementsByTagName(‘Simulators’)[0]Runs = root.getElementsByTagName(‘Runs’)[0]# 創建節點

Configuration中Option的關鍵詞字典,初始化為空

ConfigurationOptionDict = {}# 創建并初始化節點Configuration中Option的Name關鍵詞集合

ConfigurationOptionNameSet = {‘Part’, ‘CompiledLibDir’, ‘TargetSimulator’, ‘ActiveSimSet’, ‘DefaultLib’}# 查找xpr工程文件中Configuration節點中的關鍵詞并記錄到關鍵詞字典中Options = Configuration.getElementsByTagName(‘Option’)for Option in Options:

if Option.hasAttribute(‘Name’) and Option.hasAttribute(‘Val’): for keyword in ConfigurationOptionNameSet: if Option.getAttribute(‘Name’) == keyword: ConfigurationOptionDict[keyword] = Option.getAttribute(‘Val’)

至此我們就完成了對優化功能的實現,與第二章的代碼進行整合,就可以自行實現對不同版本不同名稱工程的自動識別,并進行仿真。

后記

前一、二、三章主要按照時間順序,詳細介紹了使用Python腳本實現對仿真自動化操作功能時,一系列的學習研究過程。對整個過程中所涉及到的關鍵點都進行了說明與分析。當然,按照上述過程最終編寫出的腳本還是較為粗糙,實現的功能也很有限。在后續的學習中,筆者根據使用體驗對該腳本做了重構和多次迭代,加入了一些新的功能,同時也拓寬了使用場景,增強了可擴展性。當然受限于筆者的個人水平,目前為止腳本仍然很粗糙,不過已經可以為項目中Vivado工程開發的特殊需求提供一個簡單的輔助框架,可以比較自由地添加一些簡單功能,筆者打算結合后續項目開發中遇到的問題和使用體驗,繼續對其進行優化,爭取讓其能成為一個比較可依賴的好助手。

原文標題:【源碼】手把手教你用Python實現Vivado和ModelSim仿真自動化

文章出處:【微信公眾號:FPGA開源工作室】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 仿真
    +關注

    關注

    50

    文章

    4070

    瀏覽量

    133552
  • ModelSim
    +關注

    關注

    5

    文章

    174

    瀏覽量

    47162
  • python
    +關注

    關注

    56

    文章

    4792

    瀏覽量

    84627
  • Vivado
    +關注

    關注

    19

    文章

    812

    瀏覽量

    66470

原文標題:【源碼】手把手教你用Python實現Vivado和ModelSim仿真自動化

文章出處:【微信號:leezym0317,微信公眾號:FPGA開源工作室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Python環境下的代理服務器搭建與自動化管理

    Python環境下搭建與自動化管理代理服務器是一項涉及網絡編程和自動化技術的綜合任務。
    的頭像 發表于 11-14 07:31 ?157次閱讀

    LMX2595EVM如何實現自動化控制?

    我需要用LMX2595EVM實現自動化控制,請問那里有LMX2595EVM相關的sdk接口文檔或者Demo?
    發表于 11-13 06:09

    使用modelsim時的問題分析

    仿真對于FPGA設計來說至關重要,我們經常使用modelsim來進行功能仿真或者時序仿真,這樣就需要將modelsim和設計軟件(quart
    的頭像 發表于 10-24 18:15 ?267次閱讀
    使用<b class='flag-5'>modelsim</b>時的問題分析

    如何使用python調起UDE STK5.2進行下載自動化下載呢?

    近期有需求使用python調起udestk5.2做一些自動化下載的事情,但是在網上搜索后沒有找到相關的資料,公司的同事們也沒接觸過此類需求,因此也不知道如何去做,我的想法是:原理上應該是通過調用
    發表于 10-17 09:22

    使用TPS2116實現建筑自動化應用的高能效

    電子發燒友網站提供《使用TPS2116實現建筑自動化應用的高能效.pdf》資料免費下載
    發表于 09-25 11:12 ?0次下載
    使用TPS2116<b class='flag-5'>實現</b>建筑<b class='flag-5'>自動化</b>應用的高能效

    開關電源自動化測試設備:如何實現自動化測試?

    開關電源自動化測試設備是將測試軟件和測試硬件集成在一個電源測試柜中的ate自動測試設備,其測試原理是通過計算機操控測試儀器,從而減少人工干預,完成開關電源的自動化測試,旨在解放人力,提高測試效率,讓測試更便捷。
    的頭像 發表于 08-30 18:19 ?1250次閱讀
    開關電源<b class='flag-5'>自動化</b>測試設備:如何<b class='flag-5'>實現</b><b class='flag-5'>自動化</b>測試?

    機械自動化和電氣自動化區別是什么

    機械自動化和電氣自動化是現代工業生產中兩個重要的領域,它們在許多方面有著密切的聯系,但也存在一些明顯的區別。 一、基本概念 機械自動化 機械自動化是指利用機械設備、傳感器、控制系統等技
    的頭像 發表于 07-01 09:33 ?4008次閱讀

    機械自動化自動化的一種嗎

    引言 自動化技術是指利用控制裝置對生產過程進行控制,以實現生產過程的自動化。機械自動化自動化技術的一種,它主要涉及到使用機械設備和控制系統
    的頭像 發表于 07-01 09:32 ?1642次閱讀

    如何實現PLC的自動化控制邏輯

    在工業自動化領域,PLC(Programmable Logic Controller,可編程邏輯控制器)扮演著至關重要的角色。PLC通過編程實現自動化控制邏輯,使設備能夠按照預定的程序進行工作,極大
    的頭像 發表于 06-15 16:44 ?1166次閱讀

    機械制造與自動化自動化類嗎

    機械制造與自動化自動化領域的一個重要分支,它涉及到機械設計、制造、檢測、控制等多個方面,是現代制造業的核心組成部分。 機械制造與自動化是指利用計算機、機器人、傳感器等自動化設備和技術
    的頭像 發表于 06-11 11:18 ?1505次閱讀

    工業自動化自動化區別是什么

    工業自動化自動化是兩個密切相關但又有所區別的概念。在這篇文章中,我們將詳細探討它們之間的區別,以及它們在現代工業生產中的應用。 一、自動化的定義 自動化是指通過使用機器、計算機和其他
    的頭像 發表于 06-11 11:13 ?1651次閱讀

    工廠自動化控制的典型實現方式

    工廠自動化控制是現代制造業的關鍵組成部分,它通過應用先進的信息技術、自動化技術和控制技術,實現生產過程的自動化、智能和信息
    的頭像 發表于 06-06 15:51 ?1031次閱讀

    TC397怎么自動化燒錄?

    TC397第一次燒錄的時候需要先燒錄六個包,使用Infineon Memtool 4.8軟件,如果想要量產,怎么實現不用手動選擇文件的燒錄方式,使用自動化燒錄
    發表于 01-25 07:03

    如何使用 ModelSim 進行設計仿真

    ModelSim為HDL仿真工具,我們可以利用該軟件來實現對所設計的VHDL或Verilog程 序進行仿真,支持IEEE常見的各種硬件描述語言標準。可以進行兩種語言的混合
    發表于 01-14 09:47 ?0次下載

    自動化仿真系統搭建實踐

    今天我們分享TIAV17+PLCSIM+PS+SIMIT:自動化仿真系統搭建實踐。
    的頭像 發表于 01-04 11:28 ?2177次閱讀
    <b class='flag-5'>自動化</b><b class='flag-5'>仿真</b>系統搭建實踐
    主站蜘蛛池模板: 欧美无码专区| JAVAPARSER丰满白老师| 亚洲综合国产精品| 亚洲免费每日在线观看| 一个人看的HD免费高清视频| 又黄又湿免费高清视频| 88福利视频| 成年人在线视频免费观看| 国产高清视频在线观看不卡v| 国产精品嫩草影院| 九九热综合| 琪琪SEE色原网色原网站18| 少妇第一次交换| 野花高清影视免费观看| 99久久伊人一区二区yy5099 | 拍戏被CAO翻了H| 无人区乱码1区2区3区网站| 在线va无卡无码高清| 插曲的痛30分钟视频最新章节| 国产人成高清在线视频99| 毛片免费播放| 亚洲国产精品无码中文字幕| 2020亚洲国产在线播放在线| 俄罗斯兽交XXXXX在线| 久久囯产精品777蜜桃传媒| 日日摸夜夜添夜夜爽出水| 亚洲一区在线播放| 大桥未久电影在线观看| 久久一级视频| 性美国人xxxxx18| 成年人视频在线免费| 麻豆第一区MV免费观看网站| 无码人妻精品国产婷婷| eussse手机电影在线观看| 久久99re热在线播放7| 无人区国产片| 俄罗斯bbbb| 人妻无码AV中文系统久久免费| 伊人久久大香网| 狠狠狠狠狠狠干| 香蕉久久av一区二区三区|