FPGA開発日記

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

自作CPUの検証環境改変 (RASの検証環境作成)

自作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