検索
[Chisel]Whenの中は必ず評価される
- M.R

- 2024年6月29日
- 読了時間: 1分
現象
配列がある
インデックスを表す変数が配列のサイズ内かをチェックし、サイズ内の場合のみ要素にアクセス
というよくあることをやろうとした
val array = Seq.fill(ARRAY_SIZE)(...)
when(i.U < ARRAY_SIZE){
array(i-1) := ...
}すると下記のエラーが発生
java.lang.IndexOutOfBoundsException
ちゃんとwhenでガードしてるのに、、、
原因と解決策
原因は、タイトル通りwhenの中身は必ず実行、評価されるから。
上記の例でいえばi.U >= ARRAY_SIZEでもarray(i-1)にはアクセスし、エラーとなる。
簡単な解決策はifを用いること。ifは高級言語と同じく実行ポインタが変わるので条件を満たさない場合はあるコードを実行しない、ということが可能。
ただ、このような場合は一度設計を見直した方がいいと思う。
僕の場合は、(詳細は省きますが)二重ループの順序を変えることでifを使わずとも解決できた。
なぜ中身が評価される?
ソースを読んでいないので(読んだがよく分からなかったので)想像だが、「条件が満たされた場合のみ中身を実行」ではなく「条件が満たされたら実行結果を有効化する」ということをしているのだと思う。これも「ハードウェアの制御」という観点で見ればマルチプレクサの動作などを考えれば妥当と思われる。






コメント