Files
retroSoC/tests/rtl/jpeg_byte_joiner_tb.sv
T
maksyuki 39bc1c84b4 feat: add tests for JPEG reference model and register synchronization
- Implemented tests for the deterministic baseline JPEG reference model in , covering encoding, decoding, quality scaling, and error handling.
- Created  to ensure synchronization between RTL and C register constants for JPEG.
- Updated  to reflect changes in the number of APB interfaces and IRQ mappings, ensuring the topology generates correct bindings.
2026-08-31 19:23:19 +08:00

92 lines
2.6 KiB
Systemverilog

`timescale 1ns / 1ps
module jpeg_byte_joiner_tb;
logic clk = 1'b0;
logic rst_n = 1'b0;
logic [63:0] input_data;
logic [ 7:0] input_keep;
logic input_valid;
logic input_ready;
logic input_last;
logic error_flag;
int output_beats;
axi4_stream_if #(
.DATA_WIDTH(64)
) output_axis (
.aclk (clk),
.aresetn(rst_n)
);
always #5 clk = ~clk;
jpeg_byte_joiner u_dut (
.clk_i (clk),
.rst_n_i (rst_n),
.input_data_i (input_data),
.input_keep_i (input_keep),
.input_valid_i(input_valid),
.input_ready_o(input_ready),
.input_last_i (input_last),
.output_axis (output_axis),
.error_o (error_flag)
);
task automatic send_beat(input logic [63:0] data_i, input logic [7:0] keep_i, input logic last_i);
begin
@(negedge clk);
input_data = data_i;
input_keep = keep_i;
input_last = last_i;
input_valid = 1'b1;
@(posedge clk);
while (!input_ready) @(posedge clk);
@(negedge clk);
input_valid = 1'b0;
end
endtask
always @(posedge clk) begin
if (rst_n && output_axis.tvalid && output_axis.tready) begin
if (output_beats == 0) begin
if (output_axis.tdata != 64'ha2a1a00504030201 || output_axis.tkeep != 8'hff ||
output_axis.tlast) begin
$fatal(1, "joined full beat mismatch");
end
end else if (output_beats == 1) begin
if (output_axis.tdata[15:0] != 16'hd9ff || output_axis.tkeep != 8'h03 ||
!output_axis.tlast) begin
$fatal(1, "joined final beat mismatch");
end
end else begin
$fatal(1, "unexpected joined output beat");
end
output_beats <= output_beats + 1;
end
end
initial begin
input_data = '0;
input_keep = '0;
input_valid = 1'b0;
input_last = 1'b0;
output_axis.tready = 1'b0;
output_beats = 0;
repeat (3) @(posedge clk);
rst_n = 1'b1;
send_beat(64'h0000000504030201, 8'h1f, 1'b0);
send_beat(64'h0000000000a2a1a0, 8'h07, 1'b0);
repeat (2) @(negedge clk);
if (!output_axis.tvalid || output_axis.tdata != 64'ha2a1a00504030201) begin
$fatal(1, "full output was not held under backpressure: valid=%0d data=%h keep=%h",
output_axis.tvalid, output_axis.tdata, output_axis.tkeep);
end
output_axis.tready = 1'b1;
send_beat(64'h000000000000d9ff, 8'h03, 1'b1);
while (output_beats < 2) @(negedge clk);
if (error_flag) $fatal(1, "unexpected byte joiner error");
$display("JPEG byte joiner tests passed");
$finish;
end
endmodule