Ryuz's tech blog

FPGAなどの技術ブログ

Vitis/Vivadoのバージョンを切り替える

概要

複数のバージョンの Vivado や Vitis を共存させて切り替えながら使いこなしている人も多いと思います。

特に最近私がコマンドラインから使う機会が増えてきたのですが、不用意に settings64.sh を実行すると、他のツールとの競合もあったりして Vivado を使うときだけ使いたいバージョンの settings64.sh を呼んでおりました。

しかしながら、たまたま settings64.sh 実行時に cmake のバージョンが下がってしまって困ったケースがあったので、いっそ vivado コマンドを呼んだタイミングでだけ settings64.sh が実行されるようにしてしまうことができないかと思い、少し試行錯誤してみました。今回はその記録です。

環境は WSL2 の Ubuntu 20.04 でやっております。

やってみたこと

やったのは 下記のようなスクリプト(vivado_env.sh) を作り、パスの通るところ(私の場合は ~/.local/bin/)に置いただけです。

#!/bin/bash
if [ -z "$VIVADO_ENV" ]; then
    VIVADO_ENV=2019.2
fi
source /tools/Xilinx/Vitis/$VIVADO_ENV/settings64.sh
`basename $0` $@

一応、環境変数が無い時にデフォルトで呼ぶバージョンもここで入れておきます。

そのあとは、同じディレクトリで

ln -s vivado_env.sh vivado
ln -s vivado_env.sh vivado_hls
ln -s vivado_env.sh vitis_hls
ln -s vivado_env.sh vitis
ln -s vivado_env.sh xvlog
ln -s vivado_env.sh xelab
ln -s vivado_env.sh xsim

として、ラッピングしたいコマンド群のシンボリックリンクを作るだけです。私はとりあえず上のような感じで、とりあえず要るものを作りました。

これで VIVADO_ENV という環境変数を変えるだけでバージョンのスイッチができるはずです。

もう少し便利にしてみる

ついでに .bashrc に下記のように切り替えコマンドを定義してみました。

export VIVADO_ENV=2019.2
function vivado_switch() {
    export VIVADO_ENV=$1
}

として、さらにコマンドプロンプトの表示を変えるように以下にしました。

もともとgitのブランチを表示できるようにこちらを参考にさせて頂いて手を入れていたので、下記のようになりました。

# プロンプト変更
function parse_vivado_version {
    echo "$VIVADO_ENV"
}
function parse_git_branch {
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \(\1\)/'
}
function promps {
    local  BLUE="\[\e[1;34m\]"
    local  RED="\[\e[1;31m\]"
    local  GREEN="\[\e[1;32m\]"
    local  YELLOW="\[\e[1;33m\]"
    local  WHITE="\[\e[00m\]"
    local  GRAY="\[\e[1;37m\]"

    case $TERM in
        xterm*) TITLEBAR='\[\e]0;\W\007\]';;
        *)      TITLEBAR="";;
    esac
    local BASE="\u@\h"
    PS1="${TITLEBAR}${GREEN}${BASE}${WHITE}:${BLUE}\w${GREEN}\$(parse_git_branch)${YELLOW} (vivado\${VIVADO_ENV})${BLUE}${WHITE}\n\$ "
}
promps

結果

こんな感じでスイッチできるようになりました。

使い心地はこれからです。まだいろいろ課題が出てきそうな気もしていますがとりあえず作業メモまでです。

おまけ

Makefile などからバージョン判定の為の文字列を引っ張り出したメモを貼っておきます。

Makefileの場合

# get vivado version
empty:=
space:= $(empty) $(empty)
VIVADO_VERSIONS := $(subst .,$(space),$(subst v,,$(word 2,$(shell vivado -version))))
VIVADO_VERSION  := $(word 1,$(VIVADO_VERSIONS)).$(word 2,$(VIVADO_VERSIONS))

cmake の場合

# vivado version
execute_process (
    COMMAND vivado -version
    OUTPUT_VARIABLE VIVADO_VERSION_TEXT
)
string(REGEX MATCH [[v[0-9]+\.[0-9]+]] VIVADO_VERSION ${VIVADO_VERSION_TEXT})
string(SUBSTRING ${VIVADO_VERSION} 1 6 VIVADO_VERSION)
string(SUBSTRING ${VIVADO_VERSION} 0 4 VIVADO_VERSION_MAJOR)
string(SUBSTRING ${VIVADO_VERSION} 5 1 VIVADO_VERSION_MINOR)

追記

最近、もう少し便利なバージョン切り替え方法として、下記のようなツールにしてみました。 よろしければお試しください。

zenn.dev

github.com