自作RISC-V CPUコアのデバッグをしているときに気が付いたのだが、現状の乗算器にはバグがあるようだ(自分で作ったのだけれども)。 乗算器において符号付数、符号なし数についての取り扱いをきちんと設計しないと結構実装でミスをしてしまうのだが、この辺の理解が中途半端なもも実装してしまったのが原因のようだ。
乗算器について、符号なしの場合は何も考えずに実装できるが、符号付きの場合はそうもいかない。今回の場合は非常にナイーブな方法で実装する。 符号付き乗算器の設計方法で検索するといろんな人が非常に複雑な方法で数式を取り出して説明しているのだが全く理解できないので、以下の教科書に載っている方法を採用した。
すなわち、
- multiplicandの最上位の1ビット以外は、multiplierを符号拡張しながら通常通り乗算を行い結果を足し込む
- multiplicandの最上位が1の場合(つまり負の数の場合)は、multiplierの値を符号反転し足し込む(つまり引き算する)
この方式は、単純な例でいうならば を と考えることにより、 と考えて、とりあえずmultiplicandの最上位以外は普通に乗算し()、最後にの部分を加算(というかを減算)という方式でつじつまを合わせる。 これにより、最終的に という計算結果が得られる。 非常にナイーブな方法だし、Boothとか使うともっときれいに作れるのだろうけど、まあ今回は動くので良しとする。
これにより、とりあえずバグとして出ていた問題は修正され、riscv-tests
のmul
, mulh
, mulhsu
, mulhu
のすべてのテストケースをパスすることが出来るようになった。
前回使用したランダムテストパタンも、無事に問題なく流れるようになった。これで検証が進むようになる。