Files
retroSoC/tests/rtl/usb2_link_domain_tb.sv
T
maksyuki e219973c45 feat: add USB2 support and related tests
- Introduced a new USB2 transaction engine testbench to validate the functionality of the USB2 transaction engine.
- Updated clock and reset domain tests to include USB2 ULPI crossings.
- Enhanced memory map tests to verify USB2 base addresses and performance offsets.
- Modified pin map tests to ensure USB2 ULPI pins are correctly generated.
- Updated SOC topology tests to account for USB2 peripherals and IRQ mappings.
- Added static timing analysis constraints for USB2 clock domains.
- Created dedicated USB2 tests for various components including packet RAM, descriptor validation, and transaction engine.
- Implemented a register parity test to ensure ABI consistency between RTL and C header definitions.
2026-08-22 07:15:41 +08:00

116 lines
4.4 KiB
Systemverilog

`timescale 1ns / 1ps
module usb2_link_domain_tb;
logic clk_i = 1'b0;
logic rst_n_i = 1'b0;
logic enable_i = 1'b0;
logic fill_cmd_valid_i = 1'b1;
logic drain_cmd_valid_i = 1'b1;
logic [ 7:0][31:0] endpoint_cfg_i = '0;
logic work_ready_o;
logic result_valid_o;
logic [63:0] result_data_o;
logic setup_valid_o;
logic [63:0] setup_data_o;
logic fill_cmd_ready_o;
logic fill_stream_ready_o;
logic drain_cmd_ready_o;
logic drain_stream_valid_o;
logic [36:0] drain_stream_data_o;
logic buffer_event_valid_o;
logic [ 2:0] buffer_event_data_o;
logic viewport_ready_o;
logic viewport_resp_valid_o;
logic [ 8:0] viewport_resp_data_o;
logic [ 1:0] line_state_o;
logic [ 1:0] vbus_state_o;
logic id_ground_o;
logic link_ready_o;
logic [13:0] frame_o;
logic transaction_busy_o;
logic retry_o;
logic protocol_error_o;
logic [31:0] ecc_corrected_count_o;
logic [31:0] ecc_uncorrectable_count_o;
usb2_ulpi_if ulpi ();
always #5 clk_i = ~clk_i;
assign ulpi.data_di_i = 8'd0;
assign ulpi.dir_i = 1'b0;
assign ulpi.nxt_i = 1'b1;
usb2_link_domain u_dut (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.enable_i (enable_i),
.phy_reset_n_i (1'b1),
.high_speed_i (1'b1),
.active_role_i (usb2_pkg::Usb2RoleIdle),
.device_addr_i (7'd0),
.endpoint_cfg_i (endpoint_cfg_i),
.timeout_i (32'd1000),
.work_valid_i (1'b0),
.work_ready_o (work_ready_o),
.work_data_i ('0),
.result_valid_o (result_valid_o),
.result_ready_i (1'b1),
.result_data_o (result_data_o),
.setup_valid_o (setup_valid_o),
.setup_ready_i (1'b1),
.setup_data_o (setup_data_o),
.fill_cmd_valid_i (fill_cmd_valid_i),
.fill_cmd_ready_o (fill_cmd_ready_o),
.fill_cmd_data_i ('0),
.fill_stream_valid_i (1'b0),
.fill_stream_ready_o (fill_stream_ready_o),
.fill_stream_data_i ('0),
.drain_cmd_valid_i (drain_cmd_valid_i),
.drain_cmd_ready_o (drain_cmd_ready_o),
.drain_cmd_data_i ('0),
.drain_stream_valid_o (drain_stream_valid_o),
.drain_stream_ready_i (1'b1),
.drain_stream_data_o (drain_stream_data_o),
.buffer_event_valid_o (buffer_event_valid_o),
.buffer_event_ready_i (1'b1),
.buffer_event_data_o (buffer_event_data_o),
.viewport_valid_i (1'b0),
.viewport_ready_o (viewport_ready_o),
.viewport_data_i ('0),
.viewport_resp_valid_o (viewport_resp_valid_o),
.viewport_resp_ready_i (1'b1),
.viewport_resp_data_o (viewport_resp_data_o),
.line_state_o (line_state_o),
.vbus_state_o (vbus_state_o),
.id_ground_o (id_ground_o),
.link_ready_o (link_ready_o),
.frame_o (frame_o),
.transaction_busy_o (transaction_busy_o),
.retry_o (retry_o),
.protocol_error_o (protocol_error_o),
.ecc_corrected_count_o (ecc_corrected_count_o),
.ecc_uncorrectable_count_o(ecc_uncorrectable_count_o),
.ulpi (ulpi)
);
initial begin
repeat (4) @(posedge clk_i);
rst_n_i = 1'b1;
repeat (4) @(posedge clk_i);
if (fill_cmd_ready_o || drain_cmd_ready_o || transaction_busy_o) begin
$fatal(1, "USB2 disabled packet-store isolation failed");
end
fill_cmd_valid_i = 1'b0;
drain_cmd_valid_i = 1'b0;
enable_i = 1'b1;
repeat (8) @(posedge clk_i);
if (!link_ready_o || !ulpi.reset_n_o || ulpi.data_oe_o || ulpi.stp_o ||
transaction_busy_o || result_valid_o || setup_valid_o || protocol_error_o ||
(ecc_corrected_count_o != 32'd0) || (ecc_uncorrectable_count_o != 32'd0)) begin
$fatal(1, "USB2 link domain idle smoke failed");
end
$display("USB2 link domain smoke passed");
$finish;
end
endmodule