diff options
Diffstat (limited to '')
| -rw-r--r-- | platform/wavelet3d/gfx_raster.sv | 111 | ||||
| -rw-r--r-- | platform/wavelet3d/gfx_top.sv | 18 |
2 files changed, 82 insertions, 47 deletions
diff --git a/platform/wavelet3d/gfx_raster.sv b/platform/wavelet3d/gfx_raster.sv index 5d17625..0e740dc 100644 --- a/platform/wavelet3d/gfx_raster.sv +++ b/platform/wavelet3d/gfx_raster.sv @@ -288,11 +288,11 @@ module gfx_raster_bounds {min.fine, min.sub} <= '0; {max.fine, max.sub} <= '0; - edges_ref.y <= min; - edges_span.y <= max - min; - if (end_new_dim) begin + edges_ref.y <= min; edges_ref.x <= edges_ref.y; + + edges_span.y <= max - min; edges_span.x <= edges_span.y; end end @@ -322,19 +322,30 @@ module gfx_raster_edges import gfx::*; - logic coarse_handshake, coarse_stall, offsets_flow; - fixed_xy delta, inc, p, q; - - // - 3 porque empieza antes que offsets y porque coarse valid va al final - logic[FIXED_DOTADD_DEPTH - 3:0] dotadd_valid; - enum int unsigned { EDGE_AB, EDGE_BC, - EDGE_CA + EDGE_CA, + // EDGE_CA cumple doble función como OFFSETS_AB + OFFSETS_BC, + OFFSETS_CA, + OUT } state; + struct + { + fixed_xy cur, + delay1, + delay2; + } inc; + + logic coarse_handshake, coarse_stall, offsets_flow; + fixed_xy delta, p, q; + + // - 2 porque coarse valid va al final + logic[FIXED_DOTADD_DEPTH - 2:0] dotadd_valid; + assign coarse_stall = coarse_valid & ~coarse_ready; assign coarse_handshake = coarse_valid & coarse_ready; @@ -344,12 +355,18 @@ module gfx_raster_edges .c(0), .q(coarse_base), .a0(delta.x), - .b0(inc.x), + .b0(inc.cur.x), .a1(delta.y), - .b1(inc.y), + .b1(inc.cur.y), .stall(coarse_stall) ); + always_comb + unique case (state) + OUT: offsets_flow = coarse_handshake; + default: offsets_flow = 1; + endcase + always_ff @(posedge clk or negedge rst_n) if (~rst_n) begin state <= EDGE_AB; @@ -361,12 +378,10 @@ module gfx_raster_edges bounds_ready <= 0; coarse_valid <= 0; - offsets_flow <= 1; for (int i = 0; i < $bits(dotadd_valid) - 1; ++i) dotadd_valid[i] <= 0; end else begin - dotadd_valid[0] <= 0; for (int i = 1; i < $bits(dotadd_valid); ++i) dotadd_valid[i] <= dotadd_valid[i - 1]; @@ -374,6 +389,7 @@ module gfx_raster_edges coarse_valid <= dotadd_valid[$bits(dotadd_valid) - 1]; bounds_ready <= 0; + dotadd_valid[0] <= 0; unique case (state) EDGE_AB: begin @@ -397,35 +413,42 @@ module gfx_raster_edges end EDGE_CA: begin + state <= OFFSETS_BC; + p <= bounds_vtx.c; q <= bounds_vtx.a; // Esto ocurre justamente en un momento en que ab, bc, ca // quedan todos en sus lugares correctos en la pipeline - if (offsets_flow) begin - offsets_flow <= 0; - dotadd_valid[0] <= 1; - end else begin - offsets_flow <= coarse_handshake; - - if (coarse_handshake) - state <= EDGE_AB; - end + dotadd_valid[0] <= 1; end + + OFFSETS_BC: + state <= OFFSETS_CA; + + OFFSETS_CA: + state <= OUT; + + OUT: + if (coarse_handshake) + state <= EDGE_AB; endcase end always_ff @(posedge clk) begin - //TODO: top-left rule delta.x <= coarse_ref.x - q.x; delta.y <= coarse_ref.y - q.y; + inc.cur.x <= p.y - q.y; + inc.cur.y <= q.x - p.x; + + //TODO: top-left rule if (offsets_flow) begin - inc.x <= p.y - q.y; - inc.y <= q.x - p.x; + inc.delay1 <= inc.cur; + inc.delay2 <= inc.delay1; - coarse_offsets.x <= make_raster_offsets(inc.x); - coarse_offsets.y <= make_raster_offsets(inc.y); + coarse_offsets.x <= make_raster_offsets(inc.delay2.x); + coarse_offsets.y <= make_raster_offsets(inc.delay2.y); end end @@ -477,8 +500,10 @@ module gfx_raster_coarse prev; } offsets; + logic edges_recv, end_block, end_x, end_y, first_run, + mask, mask_reset, new_geom, test_flow, out_flow; + fixed edge_test, reference_x, vertical_inc; - logic edges_recv, end_x, end_y, mask, mask_reset, new_geom, test_flow, out_flow; fixed_xy max_offset, min_offset, test_offset; raster_coarse_xy stride; raster_coarse_dim width; @@ -490,6 +515,7 @@ module gfx_raster_coarse assign end_x = stride.x == '0; assign end_y = stride.y == '0; + assign end_block = end_x & end_y; assign edge_test = edge_fn.cur + test_offset.x + test_offset.y; assign vertical_inc = vertical.cur + coarse_offset(offsets.cur.y); @@ -515,14 +541,17 @@ module gfx_raster_coarse endcase unique case (state) - TEST_BC: edges_ready = 1; + SETUP: edges_ready = 1; default: edges_ready = 0; endcase unique case (state) - SETUP, TEST_AB, TEST_BC: + SETUP: edges_recv = 1; + TEST_AB, TEST_BC: + edges_recv = first_run; + default: edges_recv = 0; endcase @@ -546,9 +575,10 @@ module gfx_raster_coarse end always_ff @(posedge clk or negedge rst_n) - if (~rst_n) + if (~rst_n) begin state <= SETUP; - else + first_run <= 1; + end else unique case (state) SETUP: if (edges_valid) @@ -563,9 +593,11 @@ module gfx_raster_coarse TEST_CA: state <= OUT; - OUT: + OUT: begin + first_run <= end_block; if (out_flow) - state <= end_x & end_y ? SETUP : TEST_AB; + state <= end_block ? SETUP : TEST_AB; + end endcase always_ff @(posedge clk) begin @@ -624,7 +656,7 @@ module gfx_raster_coarse else test_offset.y <= min_offset.y; - mask <= (mask | mask_reset) & (edge_test >= 0); + mask <= (mask | mask_reset) & 1/*(edge_test >= 'sd0)*/; end if (edges_recv) begin @@ -732,8 +764,11 @@ module gfx_raster_fine endcase unique case (out_state) - OUT_MASK: begin_bary = coverage.tvalid; - default: begin_bary = 0; + OUT_MASK, OUT_BARY_B: + begin_bary = coverage.tready; + + default: + begin_bary = 0; endcase unique case (out_state) diff --git a/platform/wavelet3d/gfx_top.sv b/platform/wavelet3d/gfx_top.sv index 9f7e452..1a57b90 100644 --- a/platform/wavelet3d/gfx_top.sv +++ b/platform/wavelet3d/gfx_top.sv @@ -43,15 +43,15 @@ module gfx_top gfx_axil sched_axi(); gfx_pkts geometry(), coverage(); - assign geometry.tdata = geom_tdata; - assign geometry.tlast = geom_tlast; - assign geometry.tvalid = geom_tvalid; - assign geom_tready = geometry.tready; + assign geometry.tx.tdata = geom_tdata; + assign geometry.tx.tlast = geom_tlast; + assign geometry.tx.tvalid = geom_tvalid; + assign geom_tready = geometry.tx.tready; - assign raster_tdata = coverage.tdata; - assign raster_tlast = coverage.tlast; - assign raster_tvalid = coverage.tvalid; - assign coverage.tready = raster_tready; + assign raster_tdata = coverage.rx.tdata; + assign raster_tlast = coverage.rx.tlast; + assign raster_tvalid = coverage.rx.tvalid; + assign coverage.rx.tready = raster_tready; gfx_fpint fpint ( @@ -70,7 +70,7 @@ module gfx_top ( .clk, .rst_n, - .geometry(coverage.rx), + .geometry(geometry.rx), .coverage(coverage.tx) ); |
