前回、RISC-Vの64bitコアを搭載したSoCプラットフォームE51を使ってCoremarkを動作させたが、このときにあらかじめ提供されているMCSを改造してCoremarkを挿入した。 この方法はハードウェア設計の師匠に教えてもらったものだが、師匠から許可を得たのでその方法を記載してみる。
MCSファイルの仕組み
FPGAにおけるMCSファイルは、Intel Hexというフォーマットで記述されている。
- Intel Hex
: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を書き込むだけでプログラムを動作させることができる。