FPGA開発日記

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

サイクル精度シミュレータSniperにおけるサイクル精度の調査

div命令のトレースを表示させてみると、Issue後に時間がかかっているのではなくて、Dispatchをずっと待っているような状態に見えている。

divのレイテンシ計算部分、これがgetInstructionLatency(68) = 1になっているのがそもそもおかしい。

disassembly : div         a4, a5, a0
instruction_decoder_wlib.cc::InstructionDecoder::decode() called
totalMicroOps = numLoads + numExecs + numStores = 1 = 0 + 1 + 0
CoreModelBoomV1::getInstructionLatency(68) = 1

これ、divをのぞいたら元に戻るかな?

divを除去するとパイプラインはきれいになった

divのレイテンシの情報は正しく伝わっているらしい。

これはよく見たら別のところで設定されているのか。

  • common/performance_model/performance_models/core_model/core_model_boom_v1.cc
unsigned int CoreModelBoomV1::getAluLatency(const MicroOp *uop) const
{
   switch(uop->getInstructionOpcode()) {
      case rv_op_div:
      case rv_op_divu:
      case rv_op_rem:
      case rv_op_remu:
      case rv_op_divw:
      case rv_op_divuw:
      case rv_op_remw:
      case rv_op_remuw:
      case rv_op_divd:
      case rv_op_divud:
      case rv_op_remd:
      case rv_op_remud:
      case rv_op_fdiv_s:
      case rv_op_fdiv_d:
      case rv_op_fdiv_q:
         return 32;     // TODO: Latency of div operations need to be more accurately determined
      default:
         return getInstructionLatency(uop);
         //LOG_PRINT_ERROR("Don't know the ALU latency for this MicroOp.");
   }

最終的にはパイプライン的にはこのようになり、32サイクルのdiv命令が次々と伝搬しているのが分かる。