[ソース コード] Python を使用して Vivado および ModelSim シミュレーションを自動化する方法を段階的に説明します。

RTL コードから最終的なテープアウト GDSII ファイルに至るまで、チップ設計はすべてテキスト ファイルであるため、テキスト解析と処理言語を習得することは、集積回路設計における重要な基本スキルです。この公開アカウントは、シミュレーションと総合的な効率を向上させるためにテキスト分析ツールの使用を促進することに取り組んできました。詳細については、この公開アカウント アルバム「チップ設計コースと関連実験」を参照してください。この記事は、Sun Yiwen によって Python で実装された Vivado と Modelsim の共同シミュレーション用の自動スクリプトです。これは実際のプロジェクトで長期間テストされており、今日では誰もが学ぶことができるようにオープンソース化されています。改善のための経験や提案を交換します。同時に、Python をベースにした Verilog コードのインテリジェントな分析と処理に関する記事も今後順次公開していきますので、ご期待ください。

05c4c7940dfb5766154d943dd0f92bab.jpeg


Vivado のデフォルト設定を使用して、Windows システムでのシミュレーションのために ModelSim などのサードパーティ シミュレータを呼び出すと、シミュレーション ソフトウェアは、デフォルトで最初にテストベンチのトップレベル信号波形を波形インターフェイスにロードし、次のようにシミュレートします。停止する前に 1000ns 継続します。対応するモジュールの波形を表示したい場合は、手動で追加する必要がありますが、一定期間シミュレーションを実行した後に波形が記録されていないことが判明した後に新しいモジュールや信号を追加することを避けるために、事前にコンソール上で手動で log -r ./ * コマンドを実行し、すべての信号波形を記録します。ただし、コードを変更し、エミュレータを閉じて再起動して再度シミュレーションするたびに、実行を続行する前に、以前の操作 (対応するモジュール信号の削除と追加、log -r ./* の実行など) を再度完了する必要があります。見たい信号の波形を取り出します。シミュレーション中に追加したモジュール信号は *.do ファイルとして保存でき、次のシミュレーションで do *.do を実行することで以前の波形をすぐに追加できますが、コードが頻繁に変更され、頻繁に再シミュレーションが必要になる場合は、 , 毎回手動で信号を追加する操作は感情に影響を与えるため、Python などのスクリプト言語を使用してワンクリック シミュレーションを実装し、必要なモジュール信号を自動的に追加することはできますか?

まず、Vivado ソフトウェアによるサードパーティ シミュレーションの実装プロセスを分析し、その手順を理解する必要があります。

15e70aaf825e6f9735927df8a67df25f.jpeg

 Vivado ソフトウェアのサードパーティ シミュレーション解析

1.1 Vivado はサードパーティ ソフトウェアを呼び出します

前回の記事「Modelsim を使用して Vivado IP コアでシミュレーション プロジェクトを個別にシミュレートする」を参照してください。

https://mp.weixin.qq.com/s/6Q4H9PsHt60_xC1VXkBDOwでは、Vivado ソフトウェアがプロジェクトのシミュレーション ディレクトリ プロジェクト名 .sim/ でシミュレーション ファイルを実行および生成していることがわかり、サンプル プロジェクトのシミュレーション ディレクトリを開きます。 、写真に示すように

bdd013620ce771b67eceb321c2d04415.png

写真と記事を組み合わせると、Vivado ソフトウェアがサードパーティ エミュレータを呼び出す方法は、プロジェクト ファイルに事前に設定されているエミュレータ パスとジョイント デバッグ ライブラリ パスのパラメータに基づいて、エンジニアリング シミュレーション ディレクトリに一連のシミュレーション結果を生成することであることがわかります。 Tcl スクリプトとシステム バッチ スクリプト (Linux ではシェル) は、システム コマンド (最初にコンパイル、次にエラボレート、最後にシミュレーション) を通じて上記のバッチ スクリプトを実行し、サードパーティのシミュレーション ソフトウェアを呼び出してシミュレーション機能を実装します。

1.2 Vivado シミュレーション スクリプトの分析

上の図には、compile.bat、elatelic.bat、simulator.bat という 3 つのバッチ処理スクリプトがあります。コンパイル、エラボレート、シミュレートの 3 つの関数が順番に実装されます。以下では、各バッチ スクリプトの内容を個別に分析します。

1.2.1 コンパイル関連スクリプト

compile.bat スクリプトの全体の内容は次のとおりです。

@echo off
set bin_path=C:\questasim64_10.6c\win64
call %bin_path%/vsim -c -do "do {xxxxxxxx_compile.do}" -l compile.log
if "%errorlevel%"=="1" goto END
if "%errorlevel%"=="0" gotoSUCCESS
:END
exit 1
:SUCCESS
exit 0

このプロジェクトでセットアップされたサードパーティ シミュレータは Quetasim で、スクリプト内の特定の関数は 2 行目と 3 行目に実装されています。

  1. バイナリ ファイル パス bin_path を設定します。

  2. このパスの下で vsim プログラムを呼び出して、do {xxxxxxxx_compile.do} コマンドを実行します。

このうち、xxxxxxxx_compile.do はバッチスクリプトと同じディレクトリにある Tcl スクリプトファイルで、ファイルの内容は以下のとおりです(コメントを追加しました)。

######################################################################
#
# File name : xxxxxxxx_compile.do
# Created on: Fri Aug 14 16:40:09 +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 module
vlog -work xil_defaultlib "glbl.v"


#强制退出
quit -force

上記のコードとコメントを読むと、コンパイル スクリプトは、サードパーティのエミュレータを呼び出して、対応する Tcl スクリプト xxxxxxxx_compile.do を実行することによって、プロジェクト内のコード ファイルのコンパイルを実装していることがわかります。このスクリプトでは、すべてのプロジェクト コード ファイルがxxxxxxxx_compile.do パスに書き込まれます。

1.2.2 elaborate脚本

Evaluate.bat スクリプトの全体の内容は次のとおりです。

@echo off
set bin_path=C:\questasim64_10.6c\win64
call %bin_path%/vsim  -c -do "do {xxxxxxxx_elaborate.do}" -l elaborate.log
if "%errorlevel%"=="1" goto END
if "%errorlevel%"=="0" goto SUCCESS
:END
exit 1
:SUCCESS
exit 0

このスクリプトに実装されている特定の関数が次のとおりであることもわかります。

  1. バイナリ ファイル パス bin_path を設定します。

  2. このパスの下で vsim プログラムを呼び出して、do {xxxxxxxx_elaborate.do} コマンドを実行します。

xxxxxxxx_elaborate.do スクリプトの内容は次のとおりです (注釈付き)。

######################################################################
#
# File name : xxxxxxxx_elaborate.do
# Created on: Fri Aug 14 16:40:15 +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 off
set bin_path=C:\questasim64_10.6c\win64
call %bin_path%/vsim   -do "do {xxxxxxxx_simulate.do}" -l simulate.log
if "%errorlevel%"=="1" goto END
if "%errorlevel%"=="0" goto SUCCESS
:END
exit 1
:SUCCESS
exit 0

このスクリプトに実装されている特定の関数は次のとおりです。

  1. バイナリ ファイル パス bin_path を設定します。

  2. このパスの下で vsim プログラムを呼び出して、do {xxxxxxxx_simulate.do} コマンドを実行します。

xxxxxxxx_simulate.do スクリプトの内容は次のとおりです (注釈付き)。

######################################################################
#
# File name : xxxxxxxx_simulate.do
# Created on: Fri Aug 14 16:40:22 +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}


#仿真1000ns
run 1000ns

このスクリプトは、最適化されたデザインのシミュレーションを開始するためのサードパーティ シミュレーション ソフトウェアの呼び出し、シミュレーション インターフェイスの呼び出し、xxxxxxxx_wave.do スクリプトの実行、シミュレーション関連のウィンドウの開き、xxxxxxxx.udo スクリプトの実行の継続を実装します。

次に、xxxxxxxx_wave.do スクリプトの内容を指定します。

######################################################################
#
# File name : `xxxxxxxx_wave.do
# Created on: Fri Aug 14 16:40:22 +0800 2020
#
# Auto generated by Vivado for 'behavioral' simulation
#
######################################################################
#添加当前模块内(即仿真顶层模块)信号
add wave *
#添加GSR(全局复置位信号)
add wave /glbl/GSR

xxxxxxxx_wave.do スクリプト ファイルの主な機能は、シミュレーション波形を追加することであることがわかります。もう 1 つの xxxxxxxx.udo スクリプトには実際の内容はありません。

######################################################################
#
# File name : xxxxxxxx.udo
# Created on: Wed Jun 10 16:36:49 +0800 2020
#
# Auto generated by Vivado for 'behavioral' simulation
#
######################################################################

デフォルト設定では、Vivado は xxxxxxxx.udo スクリプトを介してコマンドを実行しないことに注意してください。

1.2.4 シミュレーションスクリプトの概要

この時点で、これら 3 つのスクリプトの機能と他のスクリプト ファイルとの関係は基本的に理解できました。

  1. compile.bat スクリプトは主にシミュレーション コード ファイルのコンパイルを実装します。

  2. Evaluate.bat スクリプトは主に、コンパイルされたデザインに対してグローバルな最適化を実行し、最適化された結果を生成します。

  3. Simulate.bat スクリプトは、特にシミュレーション ソフトウェア インターフェイスを呼び出して、最適化されたデザインをシミュレーションし、シミュレーション ソフトウェア関連のウィンドウの表示、モジュール信号の追加、および最終波形シミュレーションに関連するその他の操作を制御します。

したがって、Python スクリプトを使用して波形を追加するなどのシミュレーション操作を自動化したい場合は、simulator.bat スクリプトとそれに関連する do スクリプト ファイルについて大騒ぎする必要があります。

1.3 Vivado シミュレーション機能のオプション

Vivado シミュレーション操作をさらに分析し、Python スクリプトを使用して必要な自動化を実現する方法を考える前に、まず次の質問をすることができます。

Vivado ソフトウェアには、シミュレーション操作を容易にするためのカスタム波形の自動追加などの機能が本当に提供されていないのでしょうか?

この問題に関しては、まず Vivado ソフトウェア シミュレーション機能に付属するシミュレーション オプションを確認します。ここでは、図に示すように、サードパーティ エミュレーターのパスと共同デバッグ ライブラリのパスが設定されています。

11c62440960670f792d82e1e072e05c4.png

下の赤いボックスには、[コンパイル]、[エラボレーション]、および [シミュレーション] という 3 つのタブがあることがわかります。これらはそれぞれ、シミュレーションの 3 つのステップと生成される関連スクリプト ファイルに対応しています。

[シミュレーション] タブを開くと、実行時シミュレーション時間 (デフォルトは 1000ns) を含む複数行のオプションが下に表示されます。次の赤い線の内容は log_all_signals、「すべての信号を記録する」です。これはシミュレーションで log -r ./* コマンドを自動的に実行するためのオプションですか? まずはこのオプションをチェックしてみましょう。

下を見ると、custom_wave_do というオプションがあります。上記のスクリプト分析から、xxxxxxxx_wave.do スクリプト ファイルがモジュール信号をシミュレートおよび追加する機能を実装していることがわかります。これはカスタム信号をシミュレートおよび追加するためのオプションですか?

ここでは、プロジェクトの前回のシミュレーションによって保存された信号ファイル wave.do の最初のバージョンを、シミュレーション スクリプトが配置されている behave ディレクトリの上のディレクトリにコピーします。

1d6e9172e52bc4658630556c6f96dec5.png

次に、上のシミュレーション オプションの図に示すように、custom_wave_do オプションへのパス (../wave.do) を書き込み、シミュレーションを再開します。

シミュレーション波形インターフェイスは次のように表示されます。

32f4595d41b59fd150137cc5294635bf.png

このインターフェイスに追加された信号グループは、../wave.do ファイルに設定された信号と同じであり、カスタム信号がここに自動的に追加されることを示しています。次に、シミュレーション ディレクトリ内の xxxxxxxx_simulate.do スクリプトを開いて、次のように内容を表示します。

######################################################################
#
# File name : xxxxxxxx_simulate.do
# Created on: Fri Aug 14 21:15:40 +0800 2020
#
# Auto generated by Vivado for 'behavioral' simulation
#
######################################################################
vsim -lib xil_defaultlib xxxxxxxx_opt


set NumericStdNoWarnings 1
set StdArithNoWarnings 1


do {../wave.do}


view wave
view structure
view signals


log -r /*


do {xxxxxxxx.udo}


run 1000ns

Vivado によって生成されたスクリプトの 14 行目と 20 行目に、 do {../wave.do} および log -r /* コマンドが自動的に追加されており、シミュレーション中に実際に自動実行が実現できることがわかります。すべての信号波形を検出し、カスタム信号を自動的に追加します。

したがって、Vivado 自体がこのような便利なシミュレーション操作オプションをすでに提供していますが、すべての信号波形を自動的に記録し、保存されたカスタム信号波形操作を自動的に追加するだけの場合は、シミュレーション オプションの 2 つのオプション log_all_signals とcustom_wave_do を直接設定して変更します。

しかし、初心者の私は Vivado について質問しようとは考えず、自分のアイデアに従って Python スクリプトをいじり始めました。

0c21ec042af4e2b07c135630857b628f.jpeg

 暫定的に想定されている機能の Python 実装

セクション 1.2 のシミュレーション スクリプトの分析で、シミュレーションに信号を自動的に追加して記録する機能を実装したい場合は、シミュレーションの最後のステップである Simulator.bat に関連するスクリプトに対応する変更を加える必要があることがわかりました。シミュレーション。ただし、最初に、これらのスクリプトは Vivado シミュレーション中に自動的に生成されるため、最初にスクリプトがない場合、またはコード ファイルを追加した後にスクリプトを更新する必要がある場合はどうなるでしょうか? (compile.bat に関連する .do スクリプトには新しく追加されたコード ファイルへのパスがないため、当然ながら新しいコードをコンパイルすることはできません。) したがって、まず Vivado にシミュレーションに関連する最新のスクリプトを生成させる必要があります。次に、スクリプトへの変更を実装します。

2.1 Vivado ソフトウェア シミュレーション スクリプトの生成

研究室の学生、Zhang Zhongyuのこの記事を参照してください。

自社開発のラボ ツールである Vivado Batch Mode Tool を紹介します。

https://mp.weixin.qq.com/s/EcrZl8iM0SZbpLrlXUJ6CAを見ると、Vivado ソフトウェアは動作中にバッチ モードを提供しており、バッチ モードと Tcl スクリプトを通じて、Vivado ソフトウェアは特定のプロジェクトで特定の機能を実行できます。したがって、ここではバッチ モードを使用するだけで、Vivado ソフトウェアで現在のプロジェクトのシミュレーション スクリプトを生成できます。では、シミュレーション スクリプトを生成するための対応する命令を見つけるにはどうすればよいでしょうか? Vivado プロジェクト GUI インターフェイスのシミュレーション ボタンをクリックすると、次の図に示すように、インターフェイスの下部にある Tcl コンソールが直ちに表示され、launch_simulation コマンドが実行されます。

2bf60f11c527040093cf86549f74c3f7.png

Vivado の Tcl コマンド マニュアル UG835 を開き、次のような launch_simulation コマンド エントリを見つけます。

a6abb66245be286a48ecc19e9c748b8c.png

launch_simulation コマンドはシミュレーションを実行するコマンドで、構文に -scripts_only オプションがあり、その説明は「スクリプトのみを生成する」となっていることがわかります。ここでのスクリプトは当然、関連するシミュレーション スクリプトです。このコマンド オプションを使用する限り、エンジニアリング シミュレーション スクリプトを生成できます。もちろん、達成したいのは機能シミュレーションなので、このコマンドを実行するときは、上記の -mode オプションで Behavioral を選択するのが最善です。

次に、機能シミュレーション スクリプトを生成する機能を実現するコマンドは次のようになります: launch_simulation -mode behavioural -scripts_only コマンドの正しさを検証するには、Vivado プロジェクトの GUI インターフェイスを使用して事前にテストします。コマンドコンソール Tcl Console でこのコマンドを入力して実行します 実行後、シミュレーションディレクトリに該当するスクリプトが生成されるか確認してください 検証後、このコマンドはシミュレーションスクリプトを生成できます

2.2 機能実装の考え方

この時点で、機能実装のアイデアを次のように要約します。

  1. Python を使用して Vivado ソフトウェアのバッチ モードを呼び出し、launch_simulation -mode behavioural -scripts_only コマンドを実行して、現在のプロジェクトの機能シミュレーション スクリプトを生成します。

  2. Python を使用して、生成された Simulate.bat に関連するスクリプトの内容を変更したり、 log -r ./* を追加してすべての信号波形を自動的に記録したり、カスタム wave.do スクリプト コマンドを追加して実行したり、信号ファイルの内容を置き換えたりすることができます。デフォルトで生成される xxxxxxxx_wave.do スクリプトでは、シミュレーションが完了するとカスタム信号が自動的に追加されます。

  3. Python のシステム関数ライブラリを使用して、compile.bat、ecute.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

2 つのスクリプトをプロジェクト xpr ファイルの同じディレクトリに配置し、Python3 を使用して実行します。実行後のシミュレーション ディレクトリの結果は次のようになります。

d3055df7258f4c96bcd1f621bae4f528.png

次に、生成されたスクリプトを順番にチェックして、Vivado のバッチ モードを使用して生成されたシミュレーション スクリプトと第 1 章のスクリプトの内容に違いがあるかどうかを確認します。

比較した結果、xxxxxxxx_simulate.do ファイルと Simulate.bat スクリプトの内容は若干異なるだけで、他のスクリプトの内容は全く同じであることが分かりました。

xxxxxxxx_simulate.do の内容:

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


set NumericStdNoWarnings 1
set StdArithNoWarnings 1


do {xxxxxxxx_wave.do}


view wave
view structure
view signals


do {xxxxxxxx.udo}


run 1000ns


quit -force

内容の違いは最後の行にあります。Vivado GUI インターフェイスでシミュレーション ボタンをクリックして生成されたスクリプトと比較すると、スクリプト xxxxxxxx_simulate.do はバッチ モードでシミュレーション オプション -scripts_only を使用して生成されます。 do には、強制終了するための追加コマンド quit -force があり、これにより、呼び出されたシミュレーション プログラムは、すべてのシミュレーション コマンドを実行した後、直ちにインターフェイスを閉じてプログラムを終了します。そのため、シミュレーション中に、スクリプトを実行する前にコマンドを削除する必要があります。

simulate.bat内容:

@echo off
set bin_path=C:\questasim64_10.6c\win64
call %bin_path%/vsim  -c -do "do {xxxxxxxx_simulate.do}" -l simulate.log
if "%errorlevel%"=="1" goto END
if "%errorlevel%"=="0" goto SUCCESS
:END
exit 1
:SUCCESS
exit 0

内容の違いは 3 行目です。vsim コマンドの後に追加の -c オプションがあります。図に示すように、QuestaSim コマンド マニュアルで vsim エントリの -c オプションの説明を見つけてください。

186d0a2aed25ec8bda02372b94e296ae.png

-c オプションにより vsim コマンドがコマンド ライン モードで実行されることがわかります。つまり、このオプションの実行後に開くのは、シミュレーション ソフトウェアの GUI インターフェイスではなく、ダーク コマンド ライン インターフェイスです。実行中のシミュレーション波形はリアルタイムで表示できないため、シミュレーション中に -c も削除する必要があります。

内容の違いのまとめ

したがって、スクリプトの後続の処理では、log -r ./* コマンドを追加し、xxxxxxxx_wave.do スクリプトに追加するシグナルを置き換えるだけでなく、最後の Quit -force も追加で削除する必要があります。スクリプト xxxxxxxx_simulate.do の行、およびスクリプト 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('\nlog -r ./*\n')
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 を使用してスクリプトを実行します。実行中のスクリーンショット結果は次のとおりです。

97bfe6815eb141045b18b21755afb634.png

シミュレーション ソフトウェアの呼び出しと波形の自動追加が正常に実装されており、使用時に Vivado プロジェクトの GUI インターフェイスを開く必要がないことがわかります。

2.4 実装の概要と展望

上記のコード関数の具体的な実装は、主に次の手順に分かれています。

  1. Python システム関数を使用して Vivado のバッチ モードを呼び出し、現在のプロジェクトの sim.tcl スクリプトで launch_simulation -mode behavioral -scripts_only コマンドを実行し、機能シミュレーションに関連するスクリプトを生成します。

  2. Python システム関数を使用して、シミュレーション ディレクトリ内で生成されたcompile.bat スクリプトと Evaluate.bat スクリプトを順番に実行し、シミュレーション コード ファイルのコンパイルとそれに続くグローバルな最適化を実現します。

  3. 生成された xxxxxxxx_simulate.do スクリプト ファイルの内容を読み取り、 run 1000ns と quit -force を削除し、 log -r ./* を追加して、 xxxxxxxx_simulate.do スクリプトを書き直します。

  4. 生成された Simulate.bat スクリプト ファイルの内容を読み取り、vsim コマンドの後の -c オプションを削除して、simulator.bat スクリプトを書き直します。

  5. Python スクリプトが配置されているディレクトリ内の wave.do ファイルの内容を読み取り、それをシミュレーション ディレクトリ内の xxxxxxxx_wave.do スクリプト ファイルに上書きして、シミュレーション中にカスタム信号を追加します。

  6. Python のシステム関数を使用して、シミュレーション ディレクトリ内の Simulate.bat スクリプトを実行し、シミュレーション プログラム インターフェイスを起動します。

この時点で、合計 60 行未満の Python コードと 1 行の Tcl コードで当初の目標を達成しました。ただし、このようなスクリプトにはまだ多くの粗雑な欠陥や開発の余地があります。

  • プロジェクトファイルのパス、ソフトウェアバージョンのパス、シミュレーションディレクトリのパスなど、コード内の各種変数の割り当てはすべて固定割り当てとなっており、スクリプトを別のプロジェクトに移行して使用する場合は、環境に応じて変更する必要があります。バージョンやプロジェクト ディレクトリ名など、スクリプトは確実な方法で使用することはできません。

  • このコードは、Vivado のバッチ モードの呼び出しからシミュレーション スクリプトを生成し、コンパイル、エラボレート、最後にシミュレーションを実行します。合計時間は長くなります。コードを変更しただけでシミュレーションを行う場合、コード ファイルの追加や IP コアの追加は必要ありません。シミュレーション スクリプトを再生成する必要はなく、コンパイルから開始するだけです。また、コードの変更がない場合は、最後のステップでシミュレート スクリプトを直接実行するだけで、時間のかかる前のステップは必要ありません。時間;

  • シミュレーション機能以外にも、通常 Vivado を開発する際には、スクリプトを使用して自動化できる面倒な操作が多数ありますが、これらは 1 つまたは複数のスクリプトに統合できます。

488bf4dd9a0a07430d30f2699c2449c2.jpeg

最適化機能のPython実装

第 2 章の最後の要約では、最初のスクリプトの欠陥と開発の領域が示されています。2 番目の欠陥は、複数のシミュレーション ステップを実装するための複数の条件オプションを提供することで簡単に解決できます。この章では主に、第 2 章でまとめた最初の欠陥を分析して解決します。

3.1 最適化関数の解析

スクリプトがプロジェクトの別のバージョンにコピーされると、変更せずに直接実行できることが期待されますが、そのためには、スクリプトが環境に直接一致するように操作に必要な一連のパラメーターを自動的に抽出できる必要があります。まず、予備機能の Python 実装における具体的な欠陥と、別のプロジェクトに移行した後にどの領域を変更する必要があるかを要約します。

3.1.1 パラメータ分析

ここでは、実行中のアカウントの形式で、予備関数の Python コードで使用されるすべてのパラメーターがリストされ、分析されます。

3.1.1.1 指定されたプロジェクト xpr ファイルのパス

# 指定工程xpr文件路径
XprFilePath = 'xxxxxxxx.xpr'

このパラメータの機能は、Vivado ソフトウェアが現在指定されているプロジェクトの特定の機能を実装できるようにすることです。スクリプトが別のプロジェクトにコピーされるたびに、このパラメータは基本的に変更されるため、自動的に識別することが最善です。デフォルトでは、各プロジェクトのプロジェクト ディレクトリには xpr ファイルが 1 つだけあります。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

実行されたシステム コマンドで新しく使用されたパスは、次の部分に分解できます。

  1. システム実行スクリプトコマンド: call

  2. ザイリンクス ソフトウェアのインストール ディレクトリ: C:/

  3. Vivado プロジェクト バージョン: 2017.2

  4. 呼び出す必要がある設定スクリプト名: settings64.bat

2 番目に生成されるシミュレーション スクリプト コマンド VivadoBatchModeScriptsCmd に含まれる Tcl スクリプト パスとプロジェクト xpr ファイル パスについては、すでに説明しました。

ここでは当面 Windows システム実装のみを考慮します。そのため、上記の分解部分での自動識別で考慮できるのは、インストール ディレクトリ C:/ およびプロジェクト バージョン 2017.2 です。

インストール ディレクトリは同じシステム内に固定されており、頻繁に変更する必要がないため、ここでは xpr プロジェクト ファイルの内容を読み取るだけで自動バージョン識別が可能になります。

3.1.1.4 シミュレーション ディレクトリ パス (Vivado 2017.2)

# 仿真目录路径
SimDirPath = 'xxxxxxxx.sim/sim_1/behav/'

上記のパスを次のように分解します。

  1. プロジェクト名:xxxxxxxx

  2. シミュレーションセット名: sim_1

  3. シミュレーション スクリプトが配置されているディレクトリ (バージョン 2017.2): behav

また、プロジェクト名はデフォルトで xpr プロジェクト ファイル名と同じであり、デフォルトではプロジェクト ディレクトリ内にサフィックス .sim が付いたディレクトリが 1 つだけ存在するため、シミュレーション セットのディレクトリ名も簡単に識別できます。プロジェクト内で複数の異なるシミュレーション セットを設定できますが、現在有効なシミュレーション セットは 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 概要

初期の機能コード実装に基づいて、少なくとも次のパラメーターの自動識別を実装する必要があります。

  1. プロジェクト xpr ファイルのパス (主にプロジェクト名)

  2. プロジェクトファイルのバージョン

  3. プロジェクトの有効なシミュレーション セット名

  4. プロジェクトの現在のシミュレーター名

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 ファイルの内容全体が基本的にルート ノードのプロジェクトに含まれており、ルート ノードには 4 つのサブノード (Configuration、FileSets、Simulators、および Runs) が含まれていることがわかります。実際のプロジェクト xpr ファイルの内容を分析すると、4 つのサブノードの主な内容が次のとおりであることがわかります。

  1. コンフィギュレーション: Vivado プロジェクトの一連のコンフィギュレーション パラメーター。FPGA チップ モデル、シミュレーション ジョイント デバッグ ライブラリ パス、ターゲット エミュレーターなど。

  2. FileSets: プロジェクトに追加されたすべてのコード、IP コアまたは制約ファイル パス、および一連の関連ファイル属性: セットされたトップレベル モジュール名、コードが合成、実装、シミュレーションなどに使用されるかどうか。

  3. シミュレータ: 現在のタイプのシステムで使用できるシミュレータの説明が含まれています。

  4. Runs: 合成と実装を必要とする IP コア ファイルとコード設計のための一連のパラメータ設定が含まれています。

次に、前のセクションの最適化分析の結論を組み合わせて、必要な xpr ファイルの内容をさらに分析および検索します。xpr を解析して取得する必要があるパラメータは、プロジェクトのバージョン、有効なシミュレーション セット名、および現在のシミュレータ名です。

3.1.2.2 プロジェクトのバージョン

検索を行った結果、ルート ノード プロジェクトには Vivado バージョンに関連するパラメーターが見つかりませんでした。バージョンに関連する唯一のコンテンツは、コンテンツの 2 行目にのみ表示されます。

<?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 であり、サブノードの構成の例の内容は次のとおりです。

<Option Name="ActiveSimSet" Val="sim_1"/>

3.1.2.4 現在のエミュレータ名

コンテンツ内の現在のシミュレーターの名前を示すパラメーターは TargetSimulator と呼ばれ、サブノードの Configuration にもあります。コンテンツの例は次のとおりです。

<Option Name="TargetSimulator" Val="Questa"/>

特に XML 形式ファイルの解析のために、Python は XML 関数ライブラリを提供しており、parse 関数を使用して XML テキストを簡単かつ効率的に処理できます。

3.2 機能実装の考え方

上記の分析に基づいて、最適化機能の実装アイデアは次のように要約されます。

  1. Python の OS ライブラリ関数を使用して、特定のパスにあるプロジェクト ファイル、特に xpr ファイルを検索します。

  2. xpr プロジェクト ファイルを見つけたら、ファイルの内容を読んでバージョン番号を取得します。

  3. Python の xml ライブラリ関数を使用して、見つかった xpr ファイルのテキスト コンテンツを解析し、有効なシミュレーション セット名と現在のシミュレータ名を抽出します。

  4. 上記の手順で取得した情報に基づいて、関連するパラメータを組み合わせて、引き続き第 2 章で実装された機能を完成させます。

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')

これで最適化機能の実装は完了しましたが、第 2 章のコードと統合することで、バージョンの異なる名前のプロジェクトを自動的に識別してシミュレーションできるようになります。

cb0aee5a2064c20dfe88868b874b7047.jpeg

追記

第1章、第2章、第3章では主に、Pythonスクリプトを利用してシミュレーション自動操作機能を実現する際の一連の学習・研究プロセスを時系列に沿って紹介します。プロセス全体に関わる重要なポイントが説明され、分析されます。もちろん、上記のプロセスに従って最終的に書かれたスクリプトはまだ比較的大まかであり、実装される機能も非常に限られています。その後の研究では、作成者は使用経験に基づいてスクリプトを再構築して複数回反復し、いくつかの新しい機能を追加し、使用シナリオを広げ、拡張性を強化しました。もちろん、作成者の個人的なレベルによる制限があるため、現時点ではスクリプトはまだ非常に大まかですが、プロジェクト内の Vivado エンジニアリング開発の特別なニーズに対応する単純な補助フレームワークをすでに提供しており、いくつかの単純な機能をより自由に追加できます。著者は、これをその後のプロジェクト開発と組み合わせる予定です。私たちは、その過程で遭遇した問題や使用経験に基づいて引き続き最適化し、より信頼性の高い優れたアシスタントになるよう努めていきます。

写真と文字の組版丨Gao Lu

画像とテキストの校正丨Gao Lu

担当編集者丨パン・ウェイタオ

あなたが見ているのは知っています

1096dd508e9165e81d31ac3f924f1e42.png

おすすめ

転載: blog.csdn.net/Pieces_thinking/article/details/132867823