ハードウェアの気になるあれこれスマートフォン用の表示で見るハードウェアの気になるあれこれ技術的に興味のあることを調べて書いてくブログ。エラー解析スポンサーリンク今日はChiselで実装したモジュールをテストしていて出くわした、わかりにくかったエラーについて解析した際のメモを。VecをUIntにしたらテストがFAILするようになった。試してわかったことエラーを修正するには?VecをUIntにしたらテストがFAILするようになった。今回のエラーは以下のような感じのテストを実施した際に発生した。やろうとしていたのはリセット解除後の初期値確認。BlackBox.ざっくり訳すと、ユーザーモジュールの中ではない。APIがコールされたとか、BlackBoxモジュールの中でハードウェアを構築しようとした場合だ。いやいや、思いっきりModuleの中だし、、、と思いつつ、モジュールの方を修正する前には普通にPASSしてたテストなんだよなぁ、、、ということで自分の行った修正を振り返ってみて該当するのは以下の修正だった。バルク接続<>を使って接続しようとした時にVecの長さが違うためエラーになったので、その部分をUIntに変更した。}}試してわかったこと内部構造を理解するのにも役に立ちそうなので、幾つか試したりコードを追ってみたりしてみた。}上記のコードは普通に動く。c.io.outをしたとしても、中身はc.io.outになる。要はc.io.outのエイリアスになる感じ。上記の場合だとOutputでラップされたUIntになっていて、ハードウェアの信号を保持するようになっている。”無意識で使ってた”というのは以下のようなコードを書いて使っていたのだが、これはこの挙動を期待していることになる。_に入ったときの例外。このときのcurrentModuleは以下になる。currentModuleが更新されていく仕組みになっているはず。今回の場合はPeekPokeTesterの中で呼び出したためNoneになってて、例外が発生する。0x1.Uこういうので1bitだけ取ろうとしても、結局対応する演算がコールされるためエラーになる。that)なので出来るのは、ポートの信号をそのまま参照する動きだけ。println(s"${peek(c.io.out)}")エラーを修正するには?前項の挙動を踏まえると結論としてはポートの値をpeekで取得して、加工することでエラーを回避できるとなる。このようにすることで、ScalaのIntとして値を操作できるので、上記のようなChiselのデータ型依存のメソッドをコールせずに済む。それを踏まえて修正したのが以下のテスト。テスト対象は先程エラーになったRegenerateErrorModを使っている。}}シミュレーション結果は以下のようにエラーにならずに正常に終了するようになった。PASSEDということでChiselでよく分からなかったエラーを追ってみた話でした。技書博2にChisel本を出してきました月別アーカイブはてなブログをはじめよう!diningyo-kpuku-jougekiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。