FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

T-Head(Alibaba)のRISC-Vコアデザインの試行 (2. Coremarkコンパイルエラーの修正)

アリババのRISC-Vコアデザインのオープンソース化があった。中身を見てみるとビルドスクリプトにも思いっきりT-Headって書いてあるのでT-Headでいいでしょう。

T-HeadのGCCを取ってくるのは面倒くさいので、crt0とGCCのオプションをいじって無理よりCoremarkのコンパイルが通るようにする。

GCCコンパイルオプションで、余計なものを徹底的に消していく。

diff --git a/smart_run/tests/lib/Makefile b/smart_run/tests/lib/Makefile
index e776131..b4d2903 100644
--- a/smart_run/tests/lib/Makefile
+++ b/smart_run/tests/lib/Makefile
@@ -28,7 +28,7 @@ OBJECTS = $(SSRC:%.S=%.o) $(sSRC:%.s=%.o) $(CSRC:%.c=%.o)

 FLAG_ABI =
 # FLAG_MARCH = -mtune=c920
-FLAG_MARCH = -mtune=c910
+# FLAG_MARCH = -mtune=c910
 #CPU_ARCH_FLAG_0 => CPU Arch: c910
 ifeq (${CPU_ARCH_FLAG_0}, c910)
   FLAG_MARCH += -march=rv64imafdcxtheadc
@@ -40,7 +40,8 @@ endif
 CFLAGS = ${FLAG_MARCH} ${FLAG_ABI}

 ifeq (${CASENAME}, coremark)
-  CFLAGS += -c -O3 -mtune=c910 -static -funroll-all-loops -finline-limit=500 -fgcse-sm -fno-schedule-insns --param max-rtl-if-conversion-unpredictable-cost=100 -msignedness-cmpiv -fno-code-hoisting -mno-thread-jumps1 -mno-iv-adjust-addr-cost -mno-expand-split-imm -DITERATIONS=10000
+  # CFLAGS += -c -O3 -mtune=c910 -static -funroll-all-loops -finline-limit=500 -fgcse-sm -fno-schedule-insns --param max-rtl-if-conversion-unpredictable-cost=100 -msignedness-cmpiv -fno-code-hoisting -mno-thread-jumps1 -mno-iv-adjust-addr-cost -mno-expand-split-imm -DITERATIONS=10000
+  CFLAGS += -c -O3 -static -funroll-all-loops -finline-limit=500 -fgcse-sm -fno-schedule-insns --param max-rtl-if-conversion-unpredictable-cost=100 -fno-code-hoisting -DITERATIONS=10
   # CFLAGS += -c -v -funroll-all-loops -finline-limit=500 -fgcse-sm -fno-schedule-insns --param max-rtl-if-conversion-unpredictable-cost=100 -fno-code-hoisting -mno-thread-jumps1 -mno-iv-adjust-addr-cost -DITERATIONS=10000 -O3 -static -mbit-translate
 else
   CFLAGS += -c -O2
@@ -105,4 +106,3 @@ all : ${FILE}.pat ${FILE}.hex ${FILE}.elf ${FILE}.obj
 .PHONY :clean
 clean:
        rm -rf *.o *.pat *.elf *.obj *.hex
-

crt0にも良く分からないレジスタがたくさん使われていた。T-Headには特殊なCSRと特殊な命令があるらしい。こういうのは全部削除していく。

diff --git a/smart_run/tests/lib/crt0.s b/smart_run/tests/lib/crt0.s
index 8c553f5..a8a454b 100644
--- a/smart_run/tests/lib/crt0.s
+++ b/smart_run/tests/lib/crt0.s
@@ -26,9 +26,9 @@ limitations under the License.
 __start:


-# enable extension
-  li   x3, 0x400000
-  csrs mxstatus,x3
+# # enable extension
+#   li   x3, 0x400000
+#   csrs mxstatus,x3

 # enable fpu
   li   x3, 0x6000
@@ -38,16 +38,16 @@ __start:
   li   x3, 0x800000
   csrs mstatus,x3

-# enable unalign
-  li   x3, 0x8000
-  csrs mxstatus,x3
-
-# mxstatus
-  li   x3, 0x638000
-  csrs mxstatus,x3
-
-# msmpr
-  csrsi msmpr, 0x1
+## enable unalign
+#  li   x3, 0x8000
+#  csrs mxstatus,x3
+#
+## mxstatus
+#  li   x3, 0x638000
+#  csrs mxstatus,x3
+#
+## msmpr
+#  csrsi msmpr, 0x1

 # PART 1: initialize all registers
   li  x1, 0
@@ -107,7 +107,8 @@ cpu_0_sp:
   # li x3, 0x10f7
   # csrs 0x7c1,x3  #mhcr
   li x3, 0x11ff
-  csrs mhcr,x3  #mhcr
+    # csrs mhcr,x3  #mhcr
+    csrs 0x7c1,x3  #mhcr

   .global after_l2en
 after_l2en:
@@ -115,17 +116,19 @@ after_l2en:
   # li x3, 0x4
   # csrs 0x7c1,x3  #mhcr
   li x3, 0x11ff
-  csrs mhcr,x3  #mhcr
+    # csrs mhcr,x3  #mhcr
+    csrs 0x7c1,x3  #mhcr

   # enable lbuf,way_pred,data_cache_prefetch, amr
   # li x3, 0x7e30c
   # csrs 0x7c5,x3   #mhint
   li x3, 0x6e30c
-  csrs mhint,x3   #mhint
+  # csrs mhint,x3   #mhint
+  csrs 0x7c5,x3   #mhint

   # mccr2
-  li x3, 0xe0000009
-  csrs mccr2,x3
+  # li x3, 0xe0000009
+  # csrs mccr2,x3

   jal  main

@@ -135,7 +138,7 @@ __exit:
   addi x1,x0,0x5a
   addi x2,x0,0x6b
   addi x3,x0,0x7c
-  sync
+  fence.i
   li   x3, 0x444333222
   add x4,x0,x3
 #
@@ -144,7 +147,7 @@ __fail:
   addi x10,x0,0x0
   addi x1,x0,0x2c
   addi x2,x0,0x3b
-  sync
+  fence.i
   li x3,0x2382348720

ここまで改造して、Coremarkのビルドとシミュレーションが走り出したっぽい。ただしまだ結果は出てきていない。

DESKTOP-P42Q0NR:~/work/riscv/openc910/smart_run% make runcase CASE=coremark
  [THead-smart] Compiling smart now ...
  [THead-smart] SIM = iverilog
  Toolchain path: /home/msyksphinz/riscv64b/bin
cd ./work && vvp xuantie_core.vvp
        ********* Init Program *********
        ********* Wipe memory to 0 *********
        ********* Read program *********
WARNING: ../logical/tb/tb.v:136: $readmemh: Standard inconsistency, following 1364-2005.
WARNING: ../logical/tb/tb.v:137: $readmemh: Standard inconsistency, following 1364-2005.
        ********* Load program to memory *********

あれ?このメッセージが出てきた。これはコンパイルが上手く行っていないかな。

ERROR! Please define ee_ptr_int to a type tht hollds a pointer!