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を以下に記載します。
- Chiselでビットコインマイナーを設計してみる(2. ScalaでSHA256の検証プログラムを書く) - FPGA開発日記
- BigIntで回避された経験が記載されてました。
- How to convert long hex string to BigInt in scala - Stack Overflow
- Hex文字列をBigIntに変換する方法が記載されてます。
↑から学んだ回避策を以下に示します。
- 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にすると遅くなるなど理由はあるみたいですが、びっくりしました。