« Cosmo-ZのFPGAソースをgitで管理するため再構築した | トップページ | Cosmo-Z Miniの回路をNahiViva環境に移行した »

2019.09.06

VivadoでユーザIPの設定を一括で変える方法

VivadoのユーザIPは、パラメータを作ってBlock Design上からカスタマイズすることができます。

例えば、こういうBlock Designでadcblock_0をダブルクリックすると、

Param1
以下のようなパラメータの設定画面が開きます。

Param2

ユーザIPが一つならこれでもよいのですが、ユーザIPが複数ある場合で、すべてのIPのパラメータを全部更新しなければならない場合、ひとつひとつ開いて設定していかなければならないので、大変面倒です。

例えば、Cosmo-Zは非常にたくさんの子IPブロックがあり、ADCの分解能やチャネル数をTCLスクリプトで一括変更できると便利だと思っていました。

そこで、「Block Designのコメントからパラメータを一括設定するTCLスクリプト」を作成しました。TCLのソースは本記事の末尾に書きます。

実は、Block Designにはユーザが任意のコメントを書くことができます。

何もないところで右クリックして、Create Commentを実行します。

Param6

するとBlock Designにコメントが書けるのでここに

CONFIGS:key1=value1[,key2=value2[,key3=value3]]...

という形式で設定したいパラメータのキーと値を書いていきます。

コメントは複数に分割しても構いません。

Param7

そして、vivadoのtclコンソールに本稿末の関数をコピペしてENTERを押し、

NahiConfigByComments

とタイプします。

すると、すべてのIP(VLNVがxilinx.com以外のもの)がスキャンされて、指定されたユーザ設定パラメータがあれば、その値が順番に変更されていきます。

NahiConfigByComments
ProcessComment:MAX_ADCCH <= 32
change /CPU/reg_files_0 : CONFIG.MAX_ADCCH <= 32
change /SignalProcess/TRIGGER/trigunit_0 : CONFIG.MAX_ADCCH <= 32
change /SignalProcess/adcblock_0 : CONFIG.MAX_ADCCH <= 32
change /SignalProcess/capture_top_0 : CONFIG.MAX_ADCCH <= 32
change /SignalProcess/particledetector_0 : CONFIG.MAX_ADCCH <= 32
change /SignalProcess/trigdelay_0 : CONFIG.MAX_ADCCH <= 32
ProcessComment:ADC_BITS <= 16
change /CPU/reg_files_0 : CONFIG.ADC_BITS <= 16
change /SignalProcess/TRIGGER/trigunit_0 : CONFIG.ADC_BITS <= 16
change /SignalProcess/adcblock_0 : CONFIG.ADC_BITS <= 16
change /SignalProcess/capture_top_0 : CONFIG.ADC_BITS <= 16
change /SignalProcess/particledetector_0 : CONFIG.ADC_BITS <= 16
change /SignalProcess/trigdelay_0 : CONFIG.ADC_BITS <= 16
ProcessComment:FPGA_VERSION <= 0x20190906
change /CPU/reg_files_0 : CONFIG.FPGA_VERSION <= 0x20190906
ProcessComment:USE_UPP <= true
change /CPU/reg_files_0 : CONFIG.USE_UPP <= true

Param3

さきほどのadcblock_0は、

CONFIGS:MAX_ADCCH=32,ADC_BITS=16,FPGA_VERSION=0x20190906,USE_UPP=true 

の設定により、以下のようにカスタマイズされました。

Param4

16進数のパラメータは0xを付け、チェックボックスはtrue,falseにします。

これで、以下のような項目数の多いIPブロックも自動的に設定できました。

Param5

ソースはこちら↓

 

proc NahiConfigByComments {} {
set keys [list_property [current_bd_design]]
foreach {w} $keys {
if {[string last {USER_COMMENTS.} $w] != -1} {
set comment [get_property $w [current_bd_design]]
set keyword {CONFIGS:}
if {[string first $keyword $comment] != -1} {
set commentlen [string length $comment]
set contents [string range $comment [string length $keyword] $commentlen]
set contents_list [split $contents ","]
foreach {item} $contents_list {
if {[string first {=} $item] != -1} {
set keyval [split $item {=}]
set key [lindex $keyval 0]
set val [lindex $keyval 1]
puts "ProcessComment:$key <= $val"
set allcells [get_bd_cells -hierarchical]
foreach {cell} $allcells {
if {[string first "xilinx.com:ip" [get_property VLNV [get_bd_cells $cell]]] == -1} {
set props [list_property [get_bd_cells $cell]]
foreach {prop} $props {
if {[string first $prop "CONFIG.$key"] != -1} {
puts "change $cell : $prop <= $val"
set_property $prop $val [get_bd_cells $cell]
}
}
}
}
}
}
}
}
}
}

|

« Cosmo-ZのFPGAソースをgitで管理するため再構築した | トップページ | Cosmo-Z Miniの回路をNahiViva環境に移行した »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Cosmo-ZのFPGAソースをgitで管理するため再構築した | トップページ | Cosmo-Z Miniの回路をNahiViva環境に移行した »