[Libre-soc-dev] [OpenPOWER-HDL-Cores] microwatt dcache potential bug (overlap r0 and r1)
Luke Kenneth Casson Leighton
lkcl at lkcl.net
Fri Jan 14 23:25:02 GMT 2022
On Fri, Jan 14, 2022 at 10:26 PM lkcl <luke.leighton at gmail.com> wrote:
> >The VHDL certainly is designed to be able to handle a store coming in
> >while r1.full = 0 and the state machine is in RELOAD_WAIT_ACK state.
>
> hmm then i need to look at that closely.
arrrgh, i think i've got it.
everything's "good"... the RELOAD_WAIT_ACKs completed, set
r1.state == IDLE, no problem.
this here tries to set r1.full = 1, again, looks like it's fine:
-- Note that r1.full = 1 implies req_op = OP_NONE
if req_op = OP_LOAD_MISS or req_op = OP_LOAD_NC or
req_op = OP_STORE_MISS or req_op = OP_STORE_HIT then
r1.req <= req;
r1.full <= '1';
end if;
but... butbutbut... down below, bear in mind r1.state is currently
RELOAD_WAIT_ACK, and bear in mind ld_stbs_done=true, this
code *also* activates:
if req.valid = '1' and req.same_tag = '1' and
((r1.dcbz = '1' and req.dcbz = '1') or
(r1.dcbz = '0' and req.op = OP_LOAD_MISS)) and
r1.store_row = get_row(req.real_addr) then
r1.full <= '0';
and it *overwrites* r1.full back to zero.
that's it.
it's easily solved by adding a variable, in case r1.state==IDLE:
r1_next_cycle := 0;
if req_op = OP_LOAD_MISS or req_op = OP_LOAD_NC or
req_op = OP_STORE_MISS or req_op = OP_STORE_HIT then
r1.req <= req;
r1.full <= '1';
r1_next_cycle := 1;
end if;
and using it in the case r1.state==STORE_WAIT_ACK:
if req.valid = '1' and req.same_tag = '1' and
((r1.dcbz = '1' and req.dcbz = '1') or
(r1.dcbz = '0' and req.op = OP_LOAD_MISS)) and
r1.store_row = get_row(req.real_addr) then
r1.full <= r1_next_cycle;
that i think should do the trick.
l.
More information about the Libre-soc-dev
mailing list