FPGA設計プロジェクトに必須のXDC拡張子の「制約」ファイルは、信号をFPGAのどの端子に出力するかから、DC電圧の規定、AC的な遅延時間などFPGAを物理的な回路として成り立たせるための諸般を記述するものです。そして『XDC は単なる文字列ではなく、~中略~ Tcl コマンドです。(UG945より引用)』だそうな。
※かえらざるMOS回路 投稿順 INDEX
※実習にはWindows11上の AMD社(Xilinx) Vivado 2023.2 を使用させていただいております。
VivadoのTCL
TCL処理系はVivado環境に密に組み込まれており、制約ファイルの記述一つとってもTCLコマンドの集まりなのでした。第54回でVivadoのコマンドラインからTCLに触りました。TCL自体は「汎用のスクリプト言語処理系」であるので「標準的なTCLの文法やお作法」が存在します。一方、論理回路の設計のために拡張された部分も多いに存在します。忘却力の老人はかなり昔にTCL処理系を使ったことがありますが「もはや覚えちゃいない」です。今回は「汎用処理系」側の方からTCLを操作していきたいと思います。コマンドプロンプトから対話的にvivado内蔵のTCL処理系のプロンプトへは以下です(もちろん vivadoのbinにpathが通ってないとなりませぬ。)
vivado -mode tcl
なお、vivado のTCLについては以下のコマンドリファレンスが存在します。
Vivado Design Suite Tclコマンドリファレンスガイド(UG835)
まあ「リファレンス」なので端から読む必要は無いかとは思いますが、「2019.2日本語版」にて1721ページもある文書です。読めといわれても死ぬまでに読み切れるかどうか怪しい。。。
TCLなお作法
まず、朧気に覚えているTCL処理系のスローガンを掲げます。
全てが文字列
いろいろな処理系がありますが、TCLの場合、スクリプトそのものも文字列ならば、変数の中身その他、世界のほとんどが「建前」文字列、であるようです。潔い割り切りっす。知らんけど。
上記では赤線で変数「a」に Hello! という文字列を代入し、その後青線で「変数置換」によってaの内容を呼び出して puts コマンドで標準出力に Hello! と書き出してます。その後、黄色で変数「c」に puts という文字列を代入し、さらに緑で”$c $a”を evalすることで再び Hello!と書き出してます。
勿論数値も扱えますが、結局数値も計算の刹那以外は建前文字列らしいっす。以下は変数 a に1を加えている例(TCLには+1する専用コマンドもありですが。)
上記ではTCLの文法の一つ [ ] カギカッコで括ったコマンド置換も登場してます。[ ] カギカッコにくるんだコマンドの実行結果(もちろん文字列)を値として使うもの。ここで1点注意しなければならないのが、処理対象のVerilogソースなどでもカギカッコを使う場面がままあることです。上記のマニュアルに曰く
角かっこ [] は Tcl で特別な意味を持つので、角かっこを使用するインデックス付きバス (ビットまたは一部選択) は波かっこで囲む必要があります。
だそうな。直ぐに忘れそうだな。。。
また忘れるとビックリするお作法が他にもいくつかありです。まず行の末尾のバックスラッシ(あるいは半角の円マークキャラクタ)は「継続行」のお印です。以下のように文字列の中にも書けるのでダラダラと長い文字列を複数行にわけて記述することも可能。さらに言えば、「継続行」のお印なしに文字列を複数行に分けて記述すると「改行」まで含んだ文字列となるみたい。
上記で定義した変数 a と b の違いが以下に。
TCLのリストは{} で囲む、でも文字列とほぼほぼ一緒
TCLにもリスト構造はあり、中かっこ{ } で囲むことになってます。しかし ” ” で囲った文字列と区別せずに使える、というかネスト可能な ” ” という感じっす。こんな感じ。
上記では文字列を連結する join にリストを食わせてますが、こういう簡単な例ならば結果は一緒ね。なお、連結するときの文字を省略すると半角スペースになってしまうので、間を詰めたいときは{}と空文字列にするみたいっす。
TCLコマンドの処理
プロンプトにコマンドとオプション、引数などを与えていけばTCL処理系が処理してくれることになってますが、「ありもしないコマンド」を投げかけてしまうことがままあるでしょう。おっと手が滑った! するとこの処理系は「自分が知らんものはOSに投げる」というポリシーだそうな。こんな感じ。
上記はWindows環境で(コマンドプロンプトから)Vivadoを実行しています。DIRコマンドなどTCLには存在しないハズが、OS側に渡されて DIR の結果が表示されております。なお上記のWARNINGにあるとおり、これを「穏当に」警告なく実行するには TCLの execコマンドにOS側のコマンドを渡してやれば実行できるみたい。
上記をみると分かるとおり DIRされてはいるけど挙動はちょっと違いますな。どちらかというとプログラムで処理しやすくなってます。
なお、第54回でもやりましたが TCL のhelpは充実しており、TCLのプロンプトからでも以下のように呼び出せます(以下はhelpコマンド自身のhelpの最初の方。)
「汎用のTCL」以外のコマンドの構文は、アンダースコア ( _ ) で区切られた「動詞 – 名詞」および「動詞 – 形容詞 – 名詞」の形だそうです。
set_property コマンドのhelp(一部)を見てみるとこんな感じ。
次回はいよいよ制約ファイルを書いてみる?大丈夫か?