Files
thejayman77 ec82764bef Initial commit: retroDE_ps2 — first-of-its-kind PS2 GS FPGA core (DE25-Nano / Agilex 5)
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>
2026-06-29 20:10:50 -04:00

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