assuming my assessment that there is an unnecessary sync/clock state introduced, i believe that this extra clock delay may be removed on load output *and* store acknowledgment may be achieved as follows:<div><br></div><div><a href="https://github.com/antonblanchard/microwatt/blob/master/dcache.vhdl#L299">https://github.com/antonblanchard/microwatt/blob/master/dcache.vhdl#L299</a></div><div><br></div><div>* all reg_stage_1_t forwarding and the block marked &quot;signals to complete&quot; to be moved to a new struct, call it (for lack of a better name) reg_stage_1_out_t</div><div><br></div><div>* note in passing that the majority of the new struct is pretty much the same as dout and that it is the focus of attention of writeback_control *except* for cache_out row.</div><div><br></div><div>* make a reg_stage_1_out_t a member of reg_stage_1_t called r1.out and adjust all references of r1 in dcache.vhdl to use the new r1.out (temporarily)</div><div><br></div><div>* run all unit tests to make sure nothing got &quot;damaged&quot;</div><div><br></div><div>* create a new variable, r1_out, which is combinatorially copied from r1.out</div><div><br></div><div>* in a rising edge block, copy r1_out into r1.out</div><div><br></div><div>* in all cases where members of r1.out were set in a *rising* edge, now set them *combinatorially* in r1_out instead.</div><div><br></div><div>* remove the ADD_BUF=true argument from all cache_ram instances</div><div><br></div><div>* in the entirety of writeback_control, where any use of r1.out is specified (read), use r1_out instead.</div><div><br></div><div>this basically shifts the entirety of writeback_control output early by an entire clock cycle, necessitating the removal of the ADD_BUF=true because the cache hit data output need no longer be delayed by that one extra cycle.</div><div><br></div><div>note that even the acknowledgement of stores is moved one cycle early.</div><div><br></div><div>i cannot say if this is &quot;wise&quot; inasmuch that there may be good reasons (gate latency) why the extra cycle is there: i have not done the analysis.</div><div><br></div><div>however i believe it should be possible, with a small amount of extra work (similar to ADD_BUF itself back in cache_ram.vhdl) to make a compile-time choice to make r1_out either combinatorial or rising edge set.</div><div><br></div><div>this would allow the old behaviour to be preserved at the choice of the user.</div><div><br></div><div>thoughts?</div><div><br></div><div>l.</div><div><br></div><br><br>-- <br>---<br>crowd-funded eco-conscious hardware: <a href="https://www.crowdsupply.com/eoma68" target="_blank">https://www.crowdsupply.com/eoma68</a><br><br>