FPGA開発日記

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

OpenSPARC T1の調査(7. S1coreでDhrystoneを動作させたい)

S1coreとOpenSPARC T1純正環境との差分は引き続き調査中だ。 とりあえず、S1coreを使いこなせるようになりたい。 まずはベンチマークプログラムを動作させられるようにしたい。Coremarkが動けば面白いのだが、まずはDhrystoneかな。

Dhrystoneは、CPUの基本性能を知るための最も基礎的なベンチマークプログラムだ。

Dhrystone - Wikipedia

S1coreでプログラムを動作させるためには

前回少し解説したが、S1coreでベンチマークプログラムを動作させるためには、以下の2つのファイルを用意する必要がある。

  • rom_harness.hex : リセット後のブート動作を行うためのプログラム。main()に入る直前まで。
  • ram_harness.hex : main()以降のプログラムを格納している。

まずは、S1coreのリリース群に入っているスクリプトを確認して、何をしなければならないのかを確認しよう。

$ less ./tools/bin/compile_test
...
# Compile the boot code
sparc64-linux-gnu-as -ah -am -o boot/boot.bin boot/boot.s
sparc64-linux-gnu-objdump -d -EB -w -z boot/boot.bin > boot/boot.dump
grep "  " boot/boot.dump | egrep -v "elf64-sparc" | dump2hex.bin > boot/rom_harness.hex

# Compile the C test
sparc64-linux-gnu-gcc -c -O0 $1.c
sparc64-linux-gnu-ld -Ur --script=$S1_ROOT/tools/src/linker.map -EB -o $1.bin $1.o
sparc64-linux-gnu-objdump -d -EB -w -z $1.bin > $1.dump
grep "  " $1.dump | egrep -v "elf64-sparc" | dump2hex.bin > ram_harness.hex

基本的にsparcgccを使ってコンパイルし、リンカはlinker.mapを使っている。これはDhrystoneも同じものを使えばよかろう。 このコンパイル手順をDhrystoneにも適用すれば良いと思われる。

Dhrystoneのコードは以下からダウンロードした。

fossies.org

Makefileの編集を行う。

CC=      sparc64-linux-gnu-gcc           # C compiler name goes here (UNIX)
GCC=        sparc64-linux-gnu-gcc
...

CFLAGS= $(OPTIMIZE) $(TIME_FUNC) -DHZ=$(HZ) $(ENUMS) $(STRUCTASSIGN) $(CFL) -Ur -Xlinker --script=/home/masayuki/work/s1_core_opensparc_t1/s1_core/tools/src/linker.map -Xlinker -EB -lc
GCCFLAGS= $(GCCOPTIM) $(TIME_FUNC) -DHZ=$(HZ) $(ENUMS) $(STRUCTASSIGN) $(CFL) -Ur -Xlinker --script=/home/masayuki/work/s1_core_opensparc_t1/s1_core/tools/src/linker.map -Xlinker -EB -lc

さらに、cc_dhryを作成した後に、hexファイルを生成する手順も追加した。

cc_dry2:     $(SRC) $(HDR)
        $(CC) $(CFLAGS) $(SRC) $(LFLAGS) -o $@
        sparc64-linux-gnu-objdump -d -EB -w -z $@ > $@.dump
        grep "  " $@.dump | egrep -v "elf64-sparc" | dump2hex.bin > ram_harness.hex

これで、Dhrystoneのディレクトリにram_harness.hexが生成される。これを既存のs1_core/test/ram_harness.hex (hello.cから生成したもの)と置き換えてシミュレーションを走らせて見ればよい。