昨日の続き。結局これはメモリアドレスのPMAの設定の問題で、Spikeは0xfffffff0へのアクセスを許可しているが、私の現在のRTLは許可していない、という話だった。
18005 : RTL(9,1) Exception Cause = SRET Flush(25) PC=0000ffc00140, Inst=10200073, sret 18005 : 4360 : PC=[00000000ffc00140] (M,09,01) 10200073 sret 18049 : RTL(13,1) Exception Cause = Illegal Instruction(2) PC=0000000029e0, Inst=00301073, csrw fcsr, zero ========================================== 18049 : Exception Happened(13,1) : Cause = Illegal Instruction(2) ========================================== 18076 : 4360 : PC=[0000000080000008] (M,01,01) 3040206f j pc + 0x2304 GPR[00](0) <= 00000000 18103 : 4362 : PC=[000000008000230c] (M,03,01) ff010113 addi sp, sp, -16 GPR[02](30) <= fffffff0 18117 : 4363 : PC=[0000000080002310] (M,04,01) 34900513 li a0, 841 GPR[10](8) <= 00000349 18117 : RTL(4,2) Exception Cause = Store Access Fault(7) PC=000080002314, Inst=00112623, sw ra, 12(sp) ========================================== 18117 : Exception Happened(4,2) : Cause = Store Access Fault(7) ========================================== 18131 : 4364 : PC=[0000000080000008] (M,07,01) 3040206f j pc + 0x2304 MW4(0xfffffffffffffffc)=>00000000
現在のCPUのPMA(Protected Memory Region)は、JSONファイルで管理している。
// 中略 "comment":"Serial device" }, { "base": "0x8000_0000", "size": "0x1000_0000", "attr": {"R": 1, "W": 1, "X": 1, "C": 1, "A": 1}, "comment":"Main Memory" } ]
メモリ領域の定義が明らかに足りていなかった。増強する。
diff --git a/src/pma_memory_map.json b/src/pma_memory_map.json index 38aa7fa..158a818 100644 --- a/src/pma_memory_map.json +++ b/src/pma_memory_map.json @@ -61,7 +61,7 @@ }, { "base": "0x8000_0000", - "size": "0x1000_0000", + "size": "0x8000_0000", "attr": {"R": 1, "W": 1, "X": 1, "C": 1, "A": 1}, "comment":"Main Memory" }
これで、IMCにおける基本的なテストケースは動くようになっている。リグレッションを流して確認していく。