眼鏡止水

FPGA、ネットワーク機器、料理、そしてメガネ女子。

【GTKWave】RISC-Vの命令の波形をPythonスクリプトでアセンブリ表示にしてみる

Verilogなどで実装したプロセッサのデバッグをしているとき、プログラムカウンタと各パイプラインステージで処理中の命令の波形をGTKWaveに表示することがしばしばあります。 しかしながら、命令のフォーマットを覚えてないと、今目の前でバグを引き起こしている命令が何の命令なのかわかりません。

プログラムカウンタと4つのパイプラインステージにおける命令の波形

このような場合、筆者はプロセッサが実行しているELFファイルをobjdumpし、アセンブリと波形の両方を交互に眺めるという作業をしていました。

しかし、ある日、GTKWaveに命令のアセンブリを表示している人がいることを知りました。

「これは便利そうだ」 と思い、この方のGitHubリポジトリを探してみたところ、公開されているGTKWaveのワークスペースファイル内で 以下の記述を見かけました。

^>1 /home/hd/hacking/asic_harris/projects/kianv/gtkwave-python-filter-process/examples/riscv-filter.py

どうやら、このPythonスクリプトが鍵のようです。 これは以下のリポジトリで配布されているものと思われます。

github.com

ビデオデモに沿って、このスクリプトをフィルタとして波形に適用します。

フィルタを適用し波形の値にアセンブリを表示する様子

無事にアセンブリを表示できました!

ところで、これはどのようにして実現しているのでしょうか? Pythonスクリプトは以下の処理を繰り返し行っているようでした (一部略)。

  1. tempfileで一時ファイルobj_tempasm_tempを作る。
  2. 標準入力から読んだ値lを用いてasm_temp.word 0xlを書く。例えば、l00000213ならば.word 0x00000213を書く。
  3. riscv64-unknown-elf-asasm_tempをアセンブルしobj_tempに保存する。
  4. riscv64-unknown-elf-objdumpobj_tempを逆アセンブルする。このとき、.word 0x00000213li tp,0などになる。
  5. 逆アセンブルの結果を標準出力に書く。

GTKWave側で波形の情報をスクリプトの標準入力に書き、標準出力から読んだ値を表示しているようです。 なるほど、これはいろいろなことに応用できそうです。

…ちなみに、GNUツールチェーンの (特にasobjdumpの) バージョンによっては逆アセンブル時に.word 0x...しか表示されないという現象が起こるようです。

.word 0x... しか表示されない例

以下に、筆者が利用したGNUツールチェーンのバージョンを示します。

  • うまくデコードできた: 2.35.1
  • うまくいかなかった: 2.40.0.20230214, 2.43.1

引用したコードのライセンスを示します。

Copyright (C) 2022 Hirosh Dabui hirosh@dabui.de

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.