[libre-riscv-dev] [Bug 216] LOAD STORE buffer needed
bugzilla-daemon at libre-riscv.org
bugzilla-daemon at libre-riscv.org
Mon Mar 23 10:21:03 GMT 2020
http://bugs.libre-riscv.org/show_bug.cgi?id=216
--- Comment #14 from Luke Kenneth Casson Leighton <lkcl at lkcl.net> ---
ok i have a pair of classes now:
* LDSTSplitter - this is designed to connect directly to LDSTCompUnit
* TwinPartialAddrBitmap - designed to be connected to LDSTSplitter
the idea is:
* misaligned LDs/STs that cross cache-line boundaries get "split" into
a *pair* of LD/ST addresses plus corresponding "byte-map".
* these "byte-maps" are based on the bottom LSBs of the address *and*
the length (byte-LD = len=1 ==> 0b1, halfword-LD = len=2 ==> 0b11
which is then *SHIFTED UP* by the bottom LSBs
* any byte-map that goes over a cache line results in the SECOND
of the two addresses "activating" from the LDSTSplitter
* key thing to note: the bytemaps *already encode* the position in the
L1 cache, and can be used directly as "byte read/write-enable" lines on
the underlying Memory. no further shifting or offsetting is required
at the Cache: the bytemaps can be wired *directly* into nmigen Memory
as byte-enables.
* TwinPartialAddrBitmap takes *pairs* of addresses (plus length bytemaps)
and identifies which addresses are clashing. there are extra addresses
included (actually, excluded) because only the LSBs are checked: this
is fine.
important to note: LDSTSplitter has clock-synchronous signalling with
combinatorial bypass on it. in other words, if the downstream LDs/STs
signal that they are ready immediately, LDSTSplitter will *also* respond
immediately (in that same clock cycle). however if one of the LDs/STs
is not ready yet (cache miss for example) then LDSTSplitter will take
note of that and wait until the downstream sources set their "valid"
flag(s).
errors are simply merged. this is still TODO properly.
--
You are receiving this mail because:
You are on the CC list for the bug.
More information about the libre-riscv-dev
mailing list