みねっちょのマイコン関係ブログ

組込開発系フリーソフトやハードの情報発信ブログ

CPU コアを含む Verilog シミュレーションでダンプすべき信号

サイト内 Google 検索:


最終更新:2021-04-23
本記事では、CPU コアを含む RTL を Verilog HDL 等で論理シミュレーションする場合の、ダンプすべき信号について解説します。論理シミュレーションに使用する ROM コードは、C 言語もしくはアセンブリ言語で作成する事を想定しています。

目次:

前提条件:

テキストダンプの例 f:id:minettyo:20210417005803p:plain

ディスアセンブル リストの例 (図です)
f:id:minettyo:20210423212634p:plain:w480

ダンプすべき項目:

レジスタ群:

プログラムカウンタ:

CPU の内部状態を知る上で一番の手掛かりになるのは、プログラム カウンタ (PC) です。プログラムカウンタの値と、ROM コード用のデバッグ情報 DWARF 付き ELF (実行可能形式ファイル) からディスアセンブルしたリストのアドレスを突き合わせます。これにより、CPU が C 言語プログラムのどの行を実行しているのかが分かります。

尚、プログラム カウンタ (の値) はパイプラインの各ステージ毎に存在します。また、複数命令を同時に実行可能なスーパースカラの場合には、実行ユニットの数分のプログラムカウンタ列が存在するのですが、ここでは話をシンプルにします。一般的には、命令をデコードしている最中のプログラムカウンタの値を使用します。

Dispatch と Issue という用語は業界内でも何を指すか統一されていない様ですが、RISC-V BOOM プロセッサ (Berkeley Out-of-Order Machine) のパイプラインの図は次の通りです。Decode 後に Queue に入る直前、もしくは、Decode 後 Dispatch される直前のプログラムカウンタをダンプするのが一般的です。
f:id:minettyo:20210418164105p:plain
図を借用したサイトはこちらです。 github.com

「ARM DesignKit Eval」パッケージ の様に、リバースエンジニアリングが禁止されている場合には、与えられた PC の値をそのまま使用します。

スタックポインタ:

C 言語では、スタックにはオート変数が割り当てられます。また、割り込みや例外発生のコンテキスト スイッチ時に各種レジスタの値がセーブされます。スタック ポインタの値とバスに現れるライト データとを突き合わせてプロセスの進行を確認します。
また、コーリング コンベンションや ABI (アプリケーション バイナリ インターフェース) に依存する話になりますが、C 言語の関数呼び出しにおいて、引数が少ない場合にはレジスタに割り当てられますが、引数が多い場合にはスタックに積まれます。

プロセッサステータスレジスタ

アセンブル リストを追いかける上では確認する機会は比較的少ないのですが、プロセッサの現在の状態を知る上では重要となります。
例えば ARM プロセッサでは、ARM ステート か Thumb ステートかの区別、どの割り込みや例外を処理している最中かの情報が得られます。

リンクレジスタ

現在実行中のプログラムの戻り番地が格納されています。どの様な経緯で現在のプログラム番地に辿り着いて居るのかが分かります。ARM プロセッサで Thumb ステートで動作している場合、戻り番地の最下位ビットは1になり、アドレスに1が足された様に見えますが、実際の戻り番地は1を引いた偶数番地となります。

汎用レジスタ

全ての汎用レジスタを表示させるのは現実的では有りません。一般的に、下位のレジスタは比較的良く利用されます。コーリング コンベンション や ABI (アプリケーション バイナリ インターフェース) の規定による、関数への引数や戻り値が格納されるレジスタ (ARM の場合は戻り値は R0) は、ダンプしておくと便利です。

システムバス

FPGA や SoC の中には数多くのバスが存在しますが、CPU コアの内部状態を確認する場合には、CPU コアと周辺回路の切り口のバスをダンプするのが一番分かり易くなります。ARM プロセッサの場合には、AMBA AHB または AMBA AXI と呼ばれるバスです。

AMBA AHB:

Cortex-M0 や M3 プロセッサに搭載されている AMBA 3 AHB-Lite の仕様は、次の公式サイトで解説されています。非常に一般的なバスなので、ARM 社以外の XilinxIntel、STMicro 等の半導体ベンダから、日本語のマニュアルも数多く提供されています。
developer.arm.com

AMBA AXI:

また、AMBA AXI バスの仕様は、次のサイトで解説されています。 developer.arm.com

パイプライン方式のバスの場合:

現代的なプロセッサ バスの仕様では、アドレス フェーズの信号群と、データ フェーズの信号群とがパイプライン処理で並列動作しています。どのデータフェーズがどのアドレスフェーズに対応しているのかを正しく判断することが重要です。
例えば AMBA AHB や AXI はパイプライン処理が行われています。AHB はアドレス フェーズとデータ フェーズが単純にパイプラインしたシングル チャネルの転送が行われます。また、AXI では最大5チャネルでの転送が行われます。詳細な仕様は上記のサイトで確認してください。

ハーバード アーキテクチャの場合:

上の図で示した ARM Cortex-M0 コアの場合には、1つの AHB で命令とデータが転送されて居ます。
しかし、ハーバード アーキテクチャと言って、命令フェッチとデータアクセスが別々のバスに分かれている場合があります。これは、命令用とデータ用に別々のメモリを持って別々のバスで接続する事により、並列処理で高速化を図ることが目的です。その場合には、両方のバスをダンプする必用が有ります。
同じ ARM Cortex-M シリーズでも上位のコア (例えば Cortex-M3) は、ハーバード アーキテクチャなので命令とデータが別々の AHB で転送されます。