自作CPUのRAS(Return Address Stack)を一時的に無効化していたので、再度有効化して検証環境を作成する。 RASのC++モデルとRTLを一致させるためには、以下の情報が必要となる。
- (投機実行しない)コミットした命令のみでRASにどのような情報が挿入されるかの理想的な情報
- RTLが投機的にRASを操作した情報
これらをもとに、RTLの動作とモデルがどのようにずれるかをチェックする。
C++のモデルの実装は以下のようにした。
uint64_t *iss_ras_stack; size_t iss_ras_length; size_t iss_ras_head; /* ... 途中省略 ... */ void step_ras (long long rtl_commit_time, int rtl_commit_cmt_id, int rtl_commit_grp_id, long long rtl_commit_ras_index, long long rtl_commit_ras_addr) { processor_t *p = spike_core->get_core(0); auto iss_next_pc = p->get_state()->pc; auto iss_pc = p->get_state()->prev_pc; auto iss_insn = p->get_state()->insn; if (is_call(iss_insn.bits())) { uint64_t stack_val = iss_pc + inst_size(iss_insn.bits()); fprintf (ras_log_fp, "%lld : CMT RAS PUSH : PC = %08lx (%02d,%02d), RAS[%u]<=%08lx\n", rtl_commit_time, iss_pc, rtl_commit_cmt_id, rtl_commit_grp_id, iss_ras_head, stack_val); iss_ras_stack[iss_ras_head] = stack_val; iss_ras_head = (iss_ras_head + 1) % iss_ras_length; } if (is_ret(iss_insn.bits())) { fprintf (ras_log_fp, "%lld : CMT RAS POP : PC = %08lx (%02d,%02d), RAS[%u]=>%08lx, TARGET=%08lx : %s, RTL RAS[%u]=>%08lx : %s\n", rtl_commit_time, iss_pc, rtl_commit_cmt_id, rtl_commit_grp_id, iss_ras_head-1, iss_ras_stack[iss_ras_head-1], iss_next_pc, iss_ras_stack[iss_ras_head-1] != iss_next_pc ? "MODEL_DIFF " : "MODEL_MATCH", rtl_commit_ras_index, rtl_commit_ras_addr, iss_ras_stack[iss_ras_head-1] != rtl_commit_ras_addr ? "RTL_MODEL_DIFF " : "RTL_MODEL_MATCH" ); iss_ras_head = iss_ras_head >= 1 ? iss_ras_head - 1 : iss_ras_length - 1; } return; }
これでRTL側の情報と突き合わせていく。まだ結構ずれているのが多い。地道にデバッグしていこう。
21688 : RTL RAS POP : PC = 8000320e RAS[31]=>00000000 21716 : RTL RAS FLUSH: PC = 800031dc (50,01), RAS_INDEX<=0 21752 : RTL RAS POP : PC = 800031f4 RAS[31]=>00000000 21760 : RTL RAS POP : PC = 800031f4 RAS[30]=>00000000 21768 : RTL RAS POP : PC = 800031f4 RAS[29]=>00000000 21776 : RTL RAS POP : PC = 800031f4 RAS[28]=>00000000 21780 : RTL RAS FLUSH: PC = 800031da (54,01), RAS_INDEX<=0 21782 : CMT RAS POP : PC = 800031da (54,01), RAS[0]=>80003476, TARGET=80003476 : MODEL_MATCH, RTL RAS[0]=>00000000 : RTL_MODEL_DIFF 21796 : RTL RAS PUSH : PC = 80003496 RAS[0]<=80003498 21800 : RTL RAS PUSH : PC = 800034ce RAS[1]<=800034d0 21804 : RTL RAS POP : PC = 80003510 RAS[1]=>800034d0 21808 : RTL RAS POP : PC = 80003554 RAS[0]=>80003498 21828 : RTL RAS FLUSH: PC = 80003494 (59,04), RAS_INDEX<=0 21838 : CMT RAS PUSH : PC = 80003494 (59,04), RAS[0]<=80003498