RVC命令の切り出しの部分を改善について、もうちょっと考え直す。
以下の記事だが、なんか違う気がしてきた。
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];