Ch443d: registered AXI R buffer (texcache fill) + drop fill_data_q reset
Closes the last currently-visible EMIF-handshake -> FSM setup family the
Ch443c fit exposed (-0.043/-0.022/-0.005 ns), the read-response analogue
of the AW/W buffers.
- gs_axi_r_regbuf: one-entry FULLY-registered AXI R buffer (the R twin of
gs_axi_w_regbuf). Buffers the complete {rdata,rresp,rlast}; u_rready =
!full only (NO combinational dependence on the texture FSM's d_rready);
captures on u_rvalid && u_rready; d_rvalid = full with the payload held
stable until d_rvalid && d_rready; resets only . Inserted between
read-arbiter s2 and gs_texture_cache (u_texf_rbuf). The arbiter is
unchanged -- it completes its R transaction into the buffer, which then
owns delivery to the fill FSM. Cuts EMIF rvalid/rdata -> fst.F_R.
- gs_texture_cache: drop the unobservable fill_data_q reset. F_DRAIN (its
only reader) is reachable only after F_R loads it, so the reset value is
never observed; removing it kills the separate lock_sync|dreg[1] ->
fill_data_q[80] setup path (-0.005 ns).
- New tb_gs_axi_r_regbuf: exactly-once/in-order, randomized responses +
stalls, full backpressure, the full && d_rready no-fall-through case,
{rdata,rresp,rlast} stability, reset-while-empty AND reset-while-full.
All green: r-buffer TB, texture_cache, texture_psmt8_clut, scanout_lb,
scanout_restart, scanout_diag, ps2_hps_bridge, rd_arb, and the complete
f52 replay BYTE-IDENTICAL (Z 0/307200, COLOR 0/245760). No Quartus/board/
push from here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -126,7 +126,11 @@ module gs_texture_cache #(
|
||||
if (!axi_rst_n) begin
|
||||
fst <= F_IDLE; araddr <= '0; arvalid <= 1'b0; rready <= 1'b0;
|
||||
beat <= '0; fill_done <= 1'b0; fill_beats <= 32'd0; fill_bytes <= 32'd0;
|
||||
rd_errs <= 32'd0; fs_sync <= 3'd0; fill_data_q <= '0;
|
||||
rd_errs <= 32'd0; fs_sync <= 3'd0;
|
||||
// Ch443d (Codex): fill_data_q is deliberately UNRESET. F_DRAIN (its only reader)
|
||||
// is reachable only after F_R has loaded it from the buffered read response, so
|
||||
// its reset value is unobservable. Dropping the reset removes the separate
|
||||
// lock_sync_inst|dreg[1] -> fill_data_q[80] setup path (-0.005 ns).
|
||||
fill_lane <= 3'd0; fill_word_base <= '0; fill_crc <= 32'd0;
|
||||
end else begin
|
||||
fs_sync <= {fs_sync[1:0], fill_start};
|
||||
|
||||
Reference in New Issue
Block a user