読者です 読者をやめる 読者になる 読者になる

FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

SiFiveの64bit RISC-Vコア Soc E51でCoremarkを動作させる(MCSの作り方)

前回、RISC-Vの64bitコアを搭載したSoCプラットフォームE51を使ってCoremarkを動作させたが、このときにあらかじめ提供されているMCSを改造してCoremarkを挿入した。 この方法はハードウェア設計の師匠に教えてもらったものだが、師匠から許可を得たのでその方法を記載してみる。

MCSファイルの仕組み

FPGAにおけるMCSファイルは、Intel Hexというフォーマットで記述されている。

Intel HEX - Wikipedia

:020000040000FA
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:10002000000000BB11220044FFFFFFFFFFFFFFFFA6
:10003000AA995566200000003003E0010000026B21
:10004000300080010000001220000000300220017A
:1000500000000000300200010000000030008001BC
:1000600000000000200000003000800100000007B8
:1000700020000000200000003002600100000000AD
:100080003001200102003FE53001C0010000000006
:10009000300180010362D09330008001000000092C
:1000A000200000003000C001000004013000A00169
:1000B000000005013000C001000000003003000115
:1000C00000000000200000002000000020000000D0
:1000D00020000000200000002000000020000000A0
:1000E00020000000300020010000000030008001EE
:1000F00000000001200000003000400050085A5C61
:1001000000000000000000000000000000000000EF
:1001100000000000000020000000000000000000BF
:1001200000000000000000000000000000000000CF
:1001300000000000000000000000000000000000BF
...

この形式では、:02から始まる行は、:02_0000_04_0000_FAと分類でき、

  • データ量: 2バイト
  • アドレス: 0000
  • レコードタイプ: 拡張リニアアドレス
  • データ: 0x0000
  • チェックサム: 0xFA

となる。レコードタイプが拡張リニアアドレスのため、後続のデータのアドレスはこのレコードの16bitデータ0x0000を上位16bitに設定した値となる。したがって後続の行のデータ先頭アドレスは以下のようになる。

  • 2行目 : 0x0000_0000
  • 3行目 : 0x0000_0010 …

プログラムが格納されている部分を探す

では、次にこの:02から始まる行をgrepして取り出してみる。

$ grep :02 SiFive_E51_Coreplex_FPGA_Evaluation_v1p0_r0.mcs
...
:02000004001AE0
:02000004001BDF
:02000004001CDE
:02000004001DDD
:02000004001EDC
:02000004001FDB
:020000040020DA
:020000040021D9
:020000040040BA

この中で、:020000040040BA以降にプログラムが格納されており、それより前が回路情報となる。

このレコードは :02_0000_04_0040_BAとなり、データ先頭アドレスの上位16bitが 0x0040(IntelHexの拡張リニアアドレスはビッグエンディアン)となる。 つまり、0x0040_0000から先にプログラムが格納されているということが分かった。 RISC-Vのブートアドレスが0x20400000で、QSPIのベースアドレスを引いたアドレスが0x00400000のためこうなるらしい。 ほへへ。

確かに、このレコードから先は明らかにプログラムっぽい。

:020000040040BA
:1000000081400141814101428142014381430144D8
:1000100081440145814501468146014781470148A8
:10002000814801498149014A814A014B814B014C78
:10003000814C014D814D014E814E014F814F970101
:10004000C03F93812178970200009382A20E7390A3
:100050005230214973104930732940F1631D090260
:100060009702C03F938202FA1703C03F130383F93C
:1000700063F7620023B00200A102E3ED62FEB70461
:100080000002054923A024019104370900021B093D
...

MCSファイル内のレコードを置き換える

まずは:020000040040BAより先のレコードを削除する。次に、Coremarkのプログラムを代わりにペーストするというわけだ。Coremarkのバイナリから以下の要領でihexを生成する。

riscv64-unknown-elf-objcopy --target ihex coremark.bin coremark.ihex

生成されたihexのうち、最後の

:040000054040000077

は存在しているとVivado Hardware Managerによりエラーとみなされるようなので削除する。これで新しいMCSの完成だ。 あとはMCSを書き込むだけでプログラムを動作させることができる。