[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 AllOverview When communicating data using a Queue, the following operations are possible: Queue.io.enq.valid: When set to false, data will...
What I want to do There are multiple similar units Most of processes are the same, only some differences. Select an appropriate unit...
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...
Comments