FPGA開発日記

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

自作CPUの動作周波数改善検討 (9. RVCを含む命令ブロック抽出の考え直し)

RVC命令の切り出しの部分を改善について、もうちょっと考え直す。

以下の記事だが、なんか違う気がしてきた。

msyksphinz.hatenablog.com

RVCの位置を正確に計算するというのなら、以下のようなことを考えなければならないはずだ:

必要なのは、16ビットブロックの中に「どこが命令の下位16ビットを示すブロックになっているか」を特定することだ。 そのあとで、RVCかどうかを判定すればよい。

これは、前のブログで書いたとおりの方法で判定できる:

  • すぐ前の16ビットグループが,RVIの上位16ビットである.つまり,inst_16bit_valid[i-1] == 0
  • すぐ前の16ビットグループが,RVCである.つまりinst_rvc[i-1] == 1

ここで正確なRVCの検出ができていないとまずいので、inst_is_rvcを2つに分ける:

  • is_rvc_rough ビット判定だけで雑にチェックしたもの。偽陽性が入っている可能性がある。
  • is_rvc 正確なRVCの位置を示す。

まず、is_rvc_roughは簡単に判別可能だ。16ビットブロックの下位2ビットを検査すればいい。 正確なis_rvcは下位から検査していき、RVCの16ビットブロックもしくはRVIの下位16ビットブロックであることが判明(つまりinst_16bit_valid==1)が分かれば、is_rvc_roughとのANDを掛ければよい。

だいたいこんな感じになろうかと思う。

  assign w_f2_is_rvc_rough[w_idx] = i_f2_inst.inst[w_idx*16 +: 2] != 2'b11;
  if (w_idx == 0) begin : gen_idx_0
    assign w_f2_inst_16bit_valid[w_idx] = i_f2_inst.valid;
  end else if (w_idx == 1) begin : gen_idx_1
    assign w_f2_inst_16bit_valid[w_idx] = w_f2_inst_is_rvc[0];
  end else begin : gen_idx_non0
    assign w_f2_inst_16bit_valid[w_idx] = ~w_f2_inst_16bit_valid[w_idx-1] | w_f2_inst_is_rvc[w_idx-1];
  end

  assign w_f2_is_rvc[w_idx] = w_f2_inst_16bit_valid[w_idx] & w_f2_is_rvc_rough[w_idx];