Chiselでシリアル送信器のテストしていたら、OutOfMemoryError: Java heap spaceが発生した話
先日、chiselでシリアル受信器を作成したので、次に送信器を作ってみました。 以下のようなループバックになるようにしてみました。
- シリアル受信器で受診したデータを送信器に送る。
- 送信器はPCに送り返す。
chiselのテストは送受信で行うので、時間としては数msかかります。 1分ほど待っていると、なんと以下エラーが発生しました。
java.lang.OutOfMemoryError: Java heap space at java.base/java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:146) at treadle.vcd.VCD$$anonfun$serializeChanges$1$$anonfun$apply$mcVJ$sp$1$$anonfun$apply$1.apply(VCD.scala:657)
どういうことか、調べてみると以下がわかりました。 sbtは安全設計になっていることに関心しました。 (どこぞかの言語だと平然と何十GBでも食ってしまいそうです笑)
- java.lang.OutOfMemoryError: GC overhead limit exceeded · Issue #613 · freechipsproject/chisel3 · GitHub
- エラーメッセージの通りデフォルトのヒープサイズ(1024MB?)をオーバーしていたため発生
- sbt -mem 4096 オプションをつけて回避(←の場合4096MB)
というわけで、無事に回避することができ、 以下などの基本的なバグを抽出し、Chisel上で動作確認できました。
- 信号名が間違っている
- クリア信号が先にアサートされるため、期待する値にならないで、タイムアウト