Ch440: gs_async_fifo QUAD_WIDTH4_READ (2 depth x 4 width) for Z-req FIFO [READY FOR REVIEW]

Candidate 2 from the accepted structural proposal. Adds a QUAD_WIDTH4_READ
generate branch to gs_async_fifo: like QUADRANT_READ (2 depth x 2 width) but
splits the payload into FOUR width banks, so each preserved read-address launch
register drives ~half the M20K load (targets the 310MHz raddr_hi1_q->mem_hi1
setup family, WNS -0.103). Keeps QUADRANT_READ's proven 2:1 depth OUTPUT selector
unchanged (no new/deeper mux, per the doc's warning). Depth (8192), one-cycle
read latency, ordering, CDC, capacity, and interface are identical.

zc_emit u_req switched QUADRANT_READ->QUAD_WIDTH4_READ. New default-off param
leaves the other two gs_async_fifo instances byte-identical. TB gains a
TEST_QUAD_WIDTH4 variant + standalone Makefile target tb_gs_async_fifo_quad_width4.

NO simulations or Quartus run (per authorization). Awaiting review before any sim.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-21 10:19:09 -04:00
parent 67aa332928
commit 471c1af9cd
4 changed files with 109 additions and 5 deletions
+5 -1
View File
@@ -99,7 +99,11 @@ module gs_lpddr_zc_emit #(
// Split that fixed capacity by both depth and width instead: each physical
// address copy drives one quarter of the original deep/wide RAM tree.
gs_async_fifo #(.WIDTH(PW), .DEPTH(REQ_DEPTH), .REGISTERED_READ(1'b1),
.QUADRANT_READ(1'b1)) u_req (
// Ch440: 2 depth x 4 width banks (was QUADRANT_READ = 2 depth x
// 2 width) -> halves each read-address register's M20K load to
// shorten the 310 MHz raddr->mem address routing, keeping the
// proven 2:1 depth output selector, 8192 capacity, and latency.
.QUAD_WIDTH4_READ(1'b1)) u_req (
.wclk(gs_clk), .wrst_n(gs_rst_n), .wr(g_valid && g_ready), .wdata(req_wdata), .wfull(req_wfull),
.rclk(axi_clk), .rrst_n(axi_rst_n), .rd(req_rd), .rdata(req_rdata), .rempty(req_rempty)
);