top of page

[Chisel] Block inside "when" is always executed


Phenomenon

  • There is an array

  • Check whether the index variable is within the size of the array, and access the element only if it is within the size.


I tried to do something common.

val array = Seq.fill(ARRAY_SIZE)(...)
when(i.U < ARRAY_SIZE){
  array(i-1) := ...
}

Then the following error occurs:

java.lang.IndexOutOfBoundsException


Although I'm properly guarding against it with "when"...



Cause and Solution

The reason is that, as the title says, the contents of when is always executed and evaluated.

In the above example, even if iU >= ARRAY_SIZE, array(i-1) is accessed and an error occurs.


A simple solution is to use "if". Just like in high-level languages, "if" changes the execution pointer, so it is possible not to execute a certain code if the condition is not met.


However, in such a case, I think you should reconsider your design.

In my case (I won't go into details) I was able to solve the problem without using "if" by changing the order of the double loop.



Why is content executed?

I haven't read the source code (actually I read but couldn't understand), so this is just my guess, I think it's not "execute the contents only when the conditions are met" but "enable the execution result when the conditions are met".

This seems reasonable from the perspective of "controlling the hardware" and taking the operation of multiplexers into account.

Recent Posts

See All

[Chisel] Queue.enq.valid vs deq.valid

Overview When communicating data using a Queue, the following operations are possible: Queue.io.enq.valid: When set to false, data will not be added. Queue.io.deq.valid: When set to false, data will n

[Chisel] Don't use polymorphism

What I want to do There are multiple similar units Most of processes are the same, only some differences. Select an appropriate unit depending on the conditions and execute the process What I tried to

[Chisel] Exiting a loop

What want to do ★ There are multiple modules of the same type Select one of these that meets the specified condition. To achieve this, I tried common routine in high-level languages like below. Define

Let's do our best with our partner:​ ChatReminder

iphone6.5p2.png

It is an application that achieves goals in a chat format with partners.

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

Let's do our best with our partner:​ ChatReminder

納品:iPhone6.5①.png

It is an application that achieves goals in a chat format with partners.

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

Theme diary: Decide the theme and record for each genre

It is a diary application that allows you to post and record with themes and sub-themes for each genre.

google-play-badge.png
Download_on_the_App_Store_Badge_JP_RGB_blk_100317.png

Inquiries: Please contact us on Twitter

  • Twitter
bottom of page