ec82764bef
RTL (GS rasterizer, EE core stub, platform bridge, LPDDR4B path), sim regression (272 TBs), docs, and tooling. Copyrighted PS2 content (BIOS, game code, GS dumps, and all dump-derived textures/traces) is excluded via .gitignore and stays local. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
83 lines
2.9 KiB
Systemverilog
83 lines
2.9 KiB
Systemverilog
// retroDE_ps2 — tb_gs_texel_addr
|
|
//
|
|
// Unit test for gs_texel_addr: hand-computed (u,v,tbw,psm) -> byte address
|
|
// cases across all four common PS2 pixel formats, including the PSMT4
|
|
// nibble-select. Pure combinational DUT; drive inputs, check outputs.
|
|
|
|
`timescale 1ns/1ps
|
|
|
|
module tb_gs_texel_addr;
|
|
|
|
localparam logic [5:0] PSMCT32 = 6'h00;
|
|
localparam logic [5:0] PSMCT16 = 6'h02;
|
|
localparam logic [5:0] PSMT8 = 6'h13;
|
|
localparam logic [5:0] PSMT4 = 6'h14;
|
|
|
|
logic [31:0] base_byte_addr;
|
|
logic [10:0] u, v;
|
|
logic [13:0] tbw;
|
|
logic [5:0] psm;
|
|
logic [31:0] texel_byte_addr;
|
|
logic nibble_hi;
|
|
|
|
int errors = 0;
|
|
|
|
gs_texel_addr #(.ADDR_W(32)) dut (
|
|
.base_byte_addr (base_byte_addr),
|
|
.u (u),
|
|
.v (v),
|
|
.tbw (tbw),
|
|
.psm (psm),
|
|
.texel_byte_addr(texel_byte_addr),
|
|
.nibble_hi (nibble_hi)
|
|
);
|
|
|
|
task automatic check(input string name,
|
|
input logic [31:0] exp_addr,
|
|
input logic exp_nib);
|
|
#1;
|
|
if (texel_byte_addr !== exp_addr || nibble_hi !== exp_nib) begin
|
|
$display("FAIL %-22s addr=%0d (exp %0d) nib=%0b (exp %0b)",
|
|
name, texel_byte_addr, exp_addr, nibble_hi, exp_nib);
|
|
errors++;
|
|
end else begin
|
|
$display("ok %-22s addr=%0d nib=%0b", name, texel_byte_addr, nibble_hi);
|
|
end
|
|
endtask
|
|
|
|
initial begin
|
|
// PSMCT32, base 0, tbw=1 (64 texels/row), (u=3,v=2):
|
|
// offset = 2*64 + 3 = 131 -> *4 = 524
|
|
base_byte_addr = 0; tbw = 1; psm = PSMCT32; u = 3; v = 2;
|
|
check("CT32 b0 (3,2)", 32'd524, 1'b0);
|
|
|
|
// PSMCT16, base 0x1000, tbw=2 (128/row), (u=10,v=1):
|
|
// offset = 128 + 10 = 138 -> *2 = 276 ; +0x1000(4096) = 4372
|
|
base_byte_addr = 32'h1000; tbw = 2; psm = PSMCT16; u = 10; v = 1;
|
|
check("CT16 b0x1000 (10,1)", 32'd4372, 1'b0);
|
|
|
|
// PSMT8, base 0, tbw=4 (256/row), (u=5,v=0): offset=5 -> *1 = 5
|
|
base_byte_addr = 0; tbw = 4; psm = PSMT8; u = 5; v = 0;
|
|
check("T8 b0 (5,0)", 32'd5, 1'b0);
|
|
|
|
// PSMT4, base 0, tbw=1 (64/row), (u=7,v=0): offset=7 -> >>1 = 3, nib=1
|
|
base_byte_addr = 0; tbw = 1; psm = PSMT4; u = 7; v = 0;
|
|
check("T4 b0 (7,0)", 32'd3, 1'b1);
|
|
|
|
// PSMT4, (u=8,v=0): offset=8 -> >>1 = 4, nib=0
|
|
base_byte_addr = 0; tbw = 1; psm = PSMT4; u = 8; v = 0;
|
|
check("T4 b0 (8,0)", 32'd4, 1'b0);
|
|
|
|
// CT32 row stride sanity: tbw=2 (128/row), (u=0,v=1): offset=128 -> 512
|
|
base_byte_addr = 0; tbw = 2; psm = PSMCT32; u = 0; v = 1;
|
|
check("CT32 stride (0,1)", 32'd512, 1'b0);
|
|
|
|
if (errors == 0)
|
|
$display("\nPASS tb_gs_texel_addr (6/6)");
|
|
else
|
|
$display("\nFAIL tb_gs_texel_addr (%0d errors)", errors);
|
|
$finish;
|
|
end
|
|
|
|
endmodule
|