NahiVivaというVivadoのTcl拡張ライブラリを作っています。
VivadoのUpdate IPや論理合成、ブロックデザインを最小限のTCLファイル化して保存するSaveコマンドなどを備えています。このNahiVivaのSaveコマンドを使うとVivadoのプロジェクトディレクトリを全部消してしまってテキストのソースだけにできるので、gitで管理できるようになるというのが売りでした。
NahiVivaの弱点というのも自分では把握しており、
- たまにSaveして、テキストのソースから戻せないプロジェクトがある
- 最初のプロジェクトを作る方法がよくわからない
- Vivadoをインストールしたパスによって設定ファイルを変えなければならない
という点です。
この3番目の弱点を改善しました。
今までのNahiVivadはSETTINGS.CMDというバッチファイルに
@SET VIVADO_PATH=D:\Xilinx\Vivado\
@SET VIVADO_VERSION=2020.2
という内容を書いておいて、このバッチファイルを読み込んでVivadoを起動するしくみだったのですが、Vivadoをインストールするパスは個々人の環境依存なのでバッチファイルを書き換えてくださいということにしていました。
しかし、バッチファイルを書き換えるというのは今日日やることではありません。
ということで、SETTINGS.CMDの代わりにSETTINGS.TXTというファイルにして、使いたいVivadoのバージョンだけを
VIVADO_VERSION=2022.2
と一文書いておけばよくしました。
これを実行するバッチファイルですが、バッチファイルから別の設定ファイルを読み込むテクニックを使っています。
@SET VIVADO_PATH=C:\Xilinx\Vivado\
@REM ==================================
@REM ここから下は変更しないでください
@REM ==================================
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=1,2 delims==" %%a in (SETTINGS.TXT) do (
if %%a == VIVADO_VERSION (
set VIVADO_VERSION=%%b
)
if %%a == VIVADO_PATH (
set VIVADO_PATH=%%b
)
)
if not defined VIVADO_VERSION (
echo VIVADO_VERSION が設定されていません。SETTINGS.TXTを修正してください。
goto err
)
if exist "%VIVADO_PATH%\%VIVADO_VERSION%\bin\" (
echo "FOUND %VIVADO_PATH%\%VIVADO_VERSION%\bin"
) else (
SET VIVADO_PATH=%VIVADO_PATH:C:=D:%
if exist "!VIVADO_PATH!\%VIVADO_VERSION%\bin\" (
echo "FOUND !VIVADO_PATH!\%VIVADO_VERSION%\bin"
) else (
echo --------------------------------------------------------------------------------------
echo 指定されたバージョンのVivadoが %VIVADO_PATH%\%VIVADO_VERSION%\bin に存在しません
echo SETTINGS.CMDを見直してください
echo --------------------------------------------------------------------------------------
goto err
)
)
%VIVADO_PATH%\%VIVADO_VERSION%\bin\vivado.bat -mode tcl -nolog -nojournal -source nahiviva.tcl -tempDir ./temp -tclargs "vivado_version=%VIVADO_VERSION%" opengui
:err
pause -1
このバッチファイルはVivadoの存在するパスをCとDを検索し、ユーザがテキストファイルに書いたVivadoのバージョンを開き、バッチファイルからTclへ環境変数を渡しています。
バッチファイルというのは本当にクソな仕様で、変数を書き換えても書き換わらないということがよくあるようです。理由はなんだかんだあるのですが、期待した動作をさせるには、setlocal ENABLEDELAYEDEXPANSION を使えば解決できるようです。
VivadoはBlockDesignをTcl形式で保存するとTCLの中にVivadoのバージョンがハードコーディングされてしまいます。
################################################################
# Check if script is running in correct Vivado version.
################################################################
set scripts_vivado_version 2020.2
set current_vivado_version [version -short]と
このため、作ったバージョンのVivadoでしか開くことができません。
Vivadoでバージョンを気にせずに配布できるファイルを作るというのはかなり難しいことなのです。
そこで、
################################################################
# Check if script is running in correct Vivado version.
################################################################
set scripts_vivado_version $specified_vivado_version
set current_vivado_version [version -short]と
と置き換えて、しかも、Vivadoの起動時にバッチファイルから渡されたVIVADO_VERSIONの値をTCLの変数にして、バージョンによらずBlockDesignを開けるようにしました。
これで、Vivado 2020.2以降であればなんでも開けるプロジェクトが完成しました。
最近のコメント