chisel/scalaでunsigned intの扱いに苦労した話

chiselというより、scalaですが、unsigned intの扱いに苦労したので、備忘のために記載します。

RISCVの命令は32bit幅で、命令をtxtファイルに記載して、テストベンチで読み込むことにしました。 scalaでtxtファイルを読み、Unsigned Int(32bit)にして、dut(RISCV)に与えるのですが、 このときに命令が0x80000000以上だとエラーになりました。

なぜなのだろうかと調べてみると、なんとScalaにはデフォ仕様にUnsigned Intがないということでした。 ま、まさか。。という感じでした。chisel使いは100%引っかかるのではないかと思える現象でした。

というわけで、回避するために調べました。 参考になったURLを以下に記載します。

↑から学んだ回避策を以下に示します。

  • 32bit以上に対応できない記載方法(0x80000000以上だとエラーになる) Integer.parseInt(inst_code,16)
  • 32bit以上に対応できる方法(BigIntを使用)
    var inst = BigInt(inst_code, 16)

ちなみに今回は以下のように修正しました。

mod Integer to BigInt · moamoai/chisel_riscv@8573bc3 · GitHub

あとがき

まさかScalaのような先進的言語にこんな致命的?にも見える問題があったとは。。 調べてみるとJavaの仕様をひきついでいたり、Unsingedにすると遅くなるなど理由はあるみたいですが、びっくりしました。