-
Notifications
You must be signed in to change notification settings - Fork 48
Description
Hi Charles,
To follow up on the discussion in this pull request #115
As I understand it, when the processor is in baremetal mode, and makes a store to a non-peripheral address, the request will pass through the cache.
If this address is not mapped in memory, the tilelink bus will send an error to the cache during refill.
The cache will store the line loaded with the fault tag set to true.
But during the refill, the LSU does not trigger a trap and the store instruction is committed.
Moreover, the store will be cached, even if the line is faulty.
In your opinion, isn't this behaviour a functional bug ?
Even if I understand that the store instruction won't have any effect architecturally, because of the faulty cache line.
But the fact of committing a store instruction to a non-existent address troubles me, and impacts cache performance by loading a line for nothing.
Would it be possible to solve this by adding a memRegion argument to the MMU ?
This argument could be used to trigger a trap when the address is outside the range, if translation is not active, and also to abort the cache request with the translated.abort signal.
We could use this line, which already exists in the code :
| ACCESS_FAULT := ps.preAddress.drop(physicalWidth) =/= 0 |
Moreover, would this change make store-to-load forwarding possible ? #43
Perhaps I didn't see a corner case that would make this modification impossible, thank you in advance for your feedback !