[Chisel]Whenの中は必ず評価される
現象
配列がある
インデックスを表す変数が配列のサイズ内かをチェックし、サイズ内の場合のみ要素にアクセス
というよくあることをやろうとした
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を使わずとも解決できた。
なぜ中身が評価される?
ソースを読んでいないので(読んだがよく分からなかったので)想像だが、「条件が満たされた場合のみ中身を実行」ではなく「条件が満たされたら実行結果を有効化する」ということをしているのだと思う。これも「ハードウェアの制御」という観点で見ればマルチプレクサの動作などを考えれば妥当と思われる。
最新記事
すべて表示概要 Queueを使ってデータのやり取りをする場合、以下のような操作が可能です。 Queue.io.enq.valid:falseにするとデータを入れない Queue.io.deq.valid:falseにするとデータを取り出さない これらの使い分けについてまとめてみます...
やりたいこと 類似したユニットが複数ある これらの処理は大部分が共通で一部のみ異なる 条件に応じて適切なユニットを1つ選び、処理を実行させる やろうとしたこと これを実現するために 親クラスを定義し、共通処理はここに記述...
やりたいこと ★ 同種のモジュールが複数ある これらのうち、所定の条件を満たすものを1つ選択 これを実現するために モジュール一覧を配列で定義 Seq.tabulateでモジュール配列に対してループを回す 1つ1つ条件を満たすかチェック 満たせばそれを選択し、ループ終了...
コメント