FPGA開発日記

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

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

msyksphinz.hatenablog.com

前回のレジスタアクセスに応じてベクトル命令を分解する作業は、よく考えたら演算命令にも導入しなければならないのだった。

基本的には考え方は同じで、レジスタ書き込みを行った回数だけ命令を複製するので大丈夫だ。

  std::vector<reg_t>vreg_array;
  for (auto i: reg) {
    if ((i.first & 0xf) == 2) {
      fprintf(stderr, "registered vreg : %ld\n", i.first >> 4);
      vreg_array.push_back(i.first >> 4);
    }
  }
  for (uint64_t addr_i = 0; addr_i < num_addresses; addr_i++) {
    if (std::find(vreg_array.begin(), vreg_array.end(), wr_regs[addr_i]) == vreg_array.end()) {
      vreg_array.push_back(wr_regs[addr_i]);
      fprintf(stderr, "registered vreg : %ld\n", wr_regs[addr_i]);
    }
  }

一応想定通りに命令が複製できている。

ただ問題なのは、今のところ全部書き込みアドレスが同じように見えてしまっており、v24しか書き込みをしていないことになってしまっている。 本当はこれをv24,v25,v26...というようにずらしていかないといけない。メモリアクセス命令も同様だ。 この対応を考えていこう。

あと、vse命令についても、vs3オペランドの情報が間違っている。これも訂正していきたい。