Snapshot: fog implementation + fidelity tooling baseline (pre bilinear-clamp fix)
Per-vertex GS fog end-to-end (gs_stub emit incl. persp_emit5, gs_prim_list_feeder XYZ2->XYZF2 on PRIM.FGE, gs_make_sh3_scheduler_fixture.py F/FGE packing), new fog TBs, fidelity attribution tooling. Functional baseline before removing the dead bilinear lerp8 clamps (Codex: 161-node comb loop -> -0.042ns setup fail). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
// Integration proof for the runtime CLUT writer mux in the BRAM board top.
|
||||
`timescale 1ns/1ps
|
||||
|
||||
module tb_top_psmct32_runtime_clut;
|
||||
logic clk = 1'b0;
|
||||
always #5 clk = ~clk;
|
||||
logic rst_n, core_go;
|
||||
logic runtime_wr_en, runtime_busy;
|
||||
logic [7:0] runtime_wr_idx;
|
||||
logic [31:0] runtime_wr_data;
|
||||
logic [7:0] r,g,b;
|
||||
logic hsync,vsync,de,core_halt,dma_done_seen,frame_seen,raster_overflow,frame_toggle,dma_done_toggle;
|
||||
int errors;
|
||||
|
||||
top_psmct32_raster_demo_bram #(.PSMCT32_SWIZZLE(1'b0)) dut (
|
||||
.clk, .rst_n, .core_go, .r, .g, .b, .hsync, .vsync, .de,
|
||||
.core_halt, .dma_done_seen, .frame_seen, .raster_overflow,
|
||||
.frame_toggle, .dma_done_toggle,
|
||||
.joy_a_pressed_i(1'b0), .joy_b_pressed_i(1'b0),
|
||||
.runtime_clut_wr_en_i(runtime_wr_en),
|
||||
.runtime_clut_wr_idx_i(runtime_wr_idx),
|
||||
.runtime_clut_wr_data_i(runtime_wr_data),
|
||||
.runtime_clut_busy_i(runtime_busy)
|
||||
);
|
||||
|
||||
task automatic runtime_write(input logic [7:0] idx, input logic [31:0] data);
|
||||
@(posedge clk);
|
||||
runtime_wr_idx <= idx;
|
||||
runtime_wr_data <= data;
|
||||
runtime_wr_en <= 1'b1;
|
||||
@(posedge clk);
|
||||
runtime_wr_en <= 1'b0;
|
||||
endtask
|
||||
|
||||
task automatic check(input string label, input logic [31:0] got, input logic [31:0] want);
|
||||
if (got !== want) begin
|
||||
$error("[%s] got 0x%08x expected 0x%08x",label,got,want);
|
||||
errors = errors + 1;
|
||||
end
|
||||
endtask
|
||||
|
||||
initial begin
|
||||
rst_n=0; core_go=0; runtime_wr_en=0; runtime_wr_idx=0; runtime_wr_data=0; runtime_busy=0; errors=0;
|
||||
repeat(4) @(posedge clk);
|
||||
rst_n=1;
|
||||
runtime_write(8'h00,32'h10203040);
|
||||
runtime_write(8'h37,32'hA1B2C3D4);
|
||||
runtime_write(8'hFF,32'h55667788);
|
||||
repeat(2) @(posedge clk);
|
||||
check("clut[0]",dut.u_clut.mem[0],32'h10203040);
|
||||
check("clut[55]",dut.u_clut.mem[8'h37],32'hA1B2C3D4);
|
||||
check("clut[255]",dut.u_clut.mem[8'hFF],32'h55667788);
|
||||
runtime_busy=1;
|
||||
repeat(2) @(posedge clk);
|
||||
if (dut.clut_busy !== 1'b1) begin $error("runtime busy did not stall CLUT consumer"); errors=errors+1; end
|
||||
if(errors) $fatal(1,"tb_top_psmct32_runtime_clut FAILED: %0d errors",errors);
|
||||
$display("tb_top_psmct32_runtime_clut PASS: writer mux + busy gate");
|
||||
$finish;
|
||||
end
|
||||
endmodule
|
||||
Reference in New Issue
Block a user