私は現在、内部に多くのモジュールとサブモジュールを含む大きなプロジェクトに取り組んでいます。(GUI または Tcl スクリプト) すべてのウェーブを追加し、モジュール ツリーのようなツリーにグループ化することは可能ですか?
例: モジュール A には、モジュール b0、b1、b2、b3、...、b10 が含まれます。グループA内の分離された地面に各ブロックb0〜b10を追加したい.
怠惰な方法だと思いますが、tcl スクリプトを使用して構成する多くの方法よりも優れている可能性があります。
私は現在、内部に多くのモジュールとサブモジュールを含む大きなプロジェクトに取り組んでいます。(GUI または Tcl スクリプト) すべてのウェーブを追加し、モジュール ツリーのようなツリーにグループ化することは可能ですか?
例: モジュール A には、モジュール b0、b1、b2、b3、...、b10 が含まれます。グループA内の分離された地面に各ブロックb0〜b10を追加したい.
怠惰な方法だと思いますが、tcl スクリプトを使用して構成する多くの方法よりも優れている可能性があります。
私は Questa/Modelsim の専門家ではありませんが、TCL で少し扱っているので、これは私のアプローチです。
これはいくつかのステップに分けられます。
1) デザイン階層をトラバースする
2) グループを作成
する 3) グループに信号を追加する
1) デザインの
トラバース モデル自体をトラバースするか、すべてのシグナルを wave に追加してトラバースします。 1.1) search wave -all signal_name
を使用して選択 + 検索でき
ますその後、手動で繰り返します (インスタンスの検索 /top/* ...など)。次に、find signal/nets/.. YOUR_LEVELを使用してネット/シグナルを検索できます。
2) グループ
の作成 ウェーブ ウィンドウで何かを選択し、「ウェーブ グループ名」を実行すると、グループを作成できます。
それほど明白ではないのは、実際に表示される「赤いグループのひし形」を再度選択し、それを再グループ化してサブグループを作成することで、同じことを実行できることです。
または、「 add wave -group G1 -group G2」を使用してサブグループを指定することもできます
3) 信号をグループに
追加 通常の「add -position N wave signal_name」を使用して信号を追加できます。
役立つその他のビット;
a) ウェーブ ウィンドウでの選択
set WAVEWIN [view wave]
$WAVEWIN.tree.tree1 curselection
$WAVEWIN.tree.tree1 selection clear all
$WAVEWIN.tree.tree1 selection set 1 2 etc
b) 選択したアイテムから信号名を取得する
# gets its signal name "sim:/path/to/sig"
set SIGPATH $WAVEWIN.tree.tree1 get 1
c) すべての信号を同じ波形ウィンドウに追加すると非常に扱いにくくなる可能性があるので、別の波形ウィンドウに追加することも検討したいと思うかもしれません。
set WAVEWIN [view -new wave]
シミュレーションでデザインの再帰的なグループ化を自動的に行う方法が必要なので、これを行うと思われるコードを次に示します。上記の回答の一部を使用した1つの実装にすぎませんが、これを追加して上記の回答を混乱させたくなかったので、この別の回答を作成しました。
やりたいこと(希望のティクル出力の手動ビュー)
add wave /top/*
add wave -group dut /top/dut/*
add wave -group dut -group subA /top/dut/subA/*
上記のように Questa/Modelsim のfindコマンドとadd waveを少しの TCL マジックで使用することで、これを行うことができます。 「-noupdate」を使用すると、大量のシグナルをはるかに高速に追加できますが、完了したらウェーブ リフレッシュを呼び出す必要があることに注意してください。
# Kick everything off from here.
proc add_wave_groupedrecursive { } {
add_wave_breadthwiserecursive "" ""
# Added all signals, now trigger a wave window update
wave refresh
}
proc add_wave_breadthwiserecursive { instance_name prev_group_option } {
# Should be a list something like "/top/inst (MOD1)"
set breadthwise_instances [find instances $instance_name/*]
# IFF there are items itterate through them breadthwise
foreach inst $breadthwise_instances {
# Separate "/top/inst" from "(MOD1)"
set inst_path [lindex [split $inst " "] 0]
# Get just the end word after last "/"
set gname [lrange [split $inst_path "/"] end end]
# Recursively call this routine with next level to investigate
add_wave_breadthwiserecursive "$inst_path" "$prev_group_option -group $gname"
}
# Avoid including your top level /* as we already have /top/*
if { $instance_name != "" } {
# Echo the wave add command, but you can turn this off
echo add wave -noupdate $prev_group_option "$instance_name/*"
set CMD "add wave -noupdate $prev_group_option $instance_name/*"
eval $CMD
}
# Return up the recursing stack
return
}
もちろん、これを改善して、N レベルのみを表示したり、TCLの正規表現を使用して関心のあるモジュールのみを表示したりすることもできます。しかし、その演習は読者に任せます。