mirror of
https://github.com/retroSoC/retroSoC.git
synced 2026-11-06 14:55:14 +00:00
- Removed legacy clock definitions and added a dynamic PLL timing template in retrosoc_pll.sdc. - Introduced a new SystemVerilog testbench (pll_ctrl_tb.sv) for the PLL controller, including clock generation, register read/write tasks, and validation of PLL configuration and timing. - Updated sysctrl_fault_tb.sv to include PLL controller interface and initialization. - Enhanced memory map tests to verify PLL configuration and status offsets. - Added tests for PLL controller dynamic reconfiguration and fallback to safe clock.
97 lines
2.8 KiB
Systemverilog
97 lines
2.8 KiB
Systemverilog
`timescale 1ns / 1ps
|
|
|
|
module sysctrl_fault_tb;
|
|
logic clk_i = 1'b0;
|
|
logic rst_n_i = 1'b0;
|
|
logic fault_valid_i = 1'b0;
|
|
logic [31:0] fault_addr_i = '0;
|
|
logic [ 3:0] fault_wstrb_i = '0;
|
|
logic fault_reserved_i = 1'b0;
|
|
nmi_if nmi ();
|
|
sysctrl_if sysctrl ();
|
|
pll_ctrl_if pll_ctrl ();
|
|
|
|
always #5 clk_i = ~clk_i;
|
|
|
|
nmi_sysctrl u_sysctrl (
|
|
.clk_i (clk_i),
|
|
.rst_n_i (rst_n_i),
|
|
.fault_valid_i (fault_valid_i),
|
|
.fault_addr_i (fault_addr_i),
|
|
.fault_wstrb_i (fault_wstrb_i),
|
|
.fault_reserved_i(fault_reserved_i),
|
|
.nmi (nmi),
|
|
.sysctrl (sysctrl),
|
|
.pll_ctrl (pll_ctrl)
|
|
);
|
|
|
|
task automatic read_register(input logic [31:0] address, output logic [31:0] data);
|
|
begin
|
|
@(negedge clk_i);
|
|
nmi.addr = address;
|
|
nmi.wdata = '0;
|
|
nmi.wstrb = '0;
|
|
nmi.valid = 1'b1;
|
|
while (!nmi.ready) @(posedge clk_i);
|
|
data = nmi.rdata;
|
|
@(negedge clk_i);
|
|
nmi.valid = 1'b0;
|
|
while (nmi.ready) @(posedge clk_i);
|
|
end
|
|
endtask
|
|
|
|
task automatic write_register(input logic [31:0] address, input logic [31:0] data);
|
|
begin
|
|
@(negedge clk_i);
|
|
nmi.addr = address;
|
|
nmi.wdata = data;
|
|
nmi.wstrb = 4'hF;
|
|
nmi.valid = 1'b1;
|
|
while (!nmi.ready) @(posedge clk_i);
|
|
@(negedge clk_i);
|
|
nmi.valid = 1'b0;
|
|
while (nmi.ready) @(posedge clk_i);
|
|
end
|
|
endtask
|
|
|
|
logic [31:0] read_data;
|
|
initial begin
|
|
nmi.valid = 1'b0;
|
|
nmi.addr = '0;
|
|
nmi.wdata = '0;
|
|
nmi.wstrb = '0;
|
|
sysctrl.core_sel_i = '0;
|
|
pll_ctrl.req_ready_i = 1'b1;
|
|
pll_ctrl.rsp_active_sel_i = '0;
|
|
pll_ctrl.rsp_active_valid_i = 1'b0;
|
|
pll_ctrl.rsp_safe_clk_i = 1'b1;
|
|
pll_ctrl.rsp_pll_lock_i = 1'b0;
|
|
pll_ctrl.rsp_error_i = '0;
|
|
pll_ctrl.rsp_valid_i = 1'b0;
|
|
pll_ctrl.capable_i = 1'b0;
|
|
repeat (2) @(posedge clk_i);
|
|
rst_n_i = 1'b1;
|
|
|
|
@(negedge clk_i);
|
|
fault_valid_i = 1'b1;
|
|
fault_addr_i = 32'h1000_F000;
|
|
fault_wstrb_i = 4'hF;
|
|
fault_reserved_i = 1'b1;
|
|
@(negedge clk_i);
|
|
fault_valid_i = 1'b0;
|
|
|
|
read_register(32'h1000_B010, read_data);
|
|
if (read_data !== 32'h0000_000B) $fatal(1, "fault status was not recorded");
|
|
read_register(32'h1000_B014, read_data);
|
|
if (read_data !== 32'h1000_F000) $fatal(1, "fault address was not recorded");
|
|
read_register(32'h1000_B018, read_data);
|
|
if (read_data !== 32'h0000_0001) $fatal(1, "fault count was not incremented");
|
|
write_register(32'h1000_B010, 32'h0000_0001);
|
|
read_register(32'h1000_B010, read_data);
|
|
if (read_data !== 32'h0000_000A) $fatal(1, "fault W1C did not clear pending");
|
|
|
|
$display("sysctrl fault registers test passed");
|
|
$finish;
|
|
end
|
|
endmodule
|