mirror of
https://github.com/retroSoC/retroSoC.git
synced 2026-11-04 22:32:36 +00:00
- Implemented a new TCL script for Tiny R2 feasibility checks, reporting clock properties, path delays, and reset loads. - Created a SystemVerilog module for the Tiny R2 reset tree, managing multiple reset signals for the system and its leaves. - Developed a Python script for capturing and analyzing feasibility metrics, ensuring compliance with reset-load and clock frequency requirements. - Added testbenches for the Tiny R2 reset tree and FIFO, validating reset behavior and timing contracts. - Introduced unit tests for feasibility analysis, ensuring correct handling of clock rates and reset load conditions.
78 lines
1.9 KiB
Systemverilog
78 lines
1.9 KiB
Systemverilog
`timescale 1ns / 1ps
|
|
|
|
module mgmt_debug_reset_tb #(
|
|
parameter int ResetSyncStages = 3
|
|
);
|
|
logic s_clk;
|
|
logic s_rst_n;
|
|
logic s_reset_req;
|
|
logic s_bridge_idle;
|
|
logic s_core_rst_n;
|
|
logic s_reset_done;
|
|
|
|
always #5 s_clk = ~s_clk;
|
|
|
|
mgmt_debug_reset #(
|
|
.ResetSyncStages(ResetSyncStages)
|
|
) u_mgmt_debug_reset (
|
|
.clk_i (s_clk),
|
|
.rst_n_i (s_rst_n),
|
|
.reset_req_i (s_reset_req),
|
|
.bridge_idle_i(s_bridge_idle),
|
|
.core_rst_n_o (s_core_rst_n),
|
|
.reset_done_o (s_reset_done)
|
|
);
|
|
|
|
initial begin
|
|
s_clk = 1'b0;
|
|
s_rst_n = 1'b0;
|
|
s_reset_req = 1'b0;
|
|
s_bridge_idle = 1'b1;
|
|
|
|
repeat (2) @(posedge s_clk);
|
|
s_rst_n = 1'b1;
|
|
repeat (ResetSyncStages + 1) @(posedge s_clk);
|
|
#1;
|
|
assert (s_core_rst_n && s_reset_done)
|
|
else $fatal(1, "initial reset release failed");
|
|
|
|
s_bridge_idle = 1'b0;
|
|
s_reset_req = 1'b1;
|
|
@(posedge s_clk);
|
|
s_reset_req = 1'b0;
|
|
repeat (2) @(posedge s_clk);
|
|
#1;
|
|
assert (s_core_rst_n && !s_reset_done)
|
|
else $fatal(1, "request did not wait for idle");
|
|
|
|
s_bridge_idle = 1'b1;
|
|
@(posedge s_clk);
|
|
#1;
|
|
assert (!s_core_rst_n && !s_reset_done)
|
|
else $fatal(1, "core reset did not assert");
|
|
repeat (ResetSyncStages + 1) @(posedge s_clk);
|
|
#1;
|
|
assert (s_core_rst_n && s_reset_done)
|
|
else $fatal(1, "core reset did not release");
|
|
|
|
s_reset_req = 1'b1;
|
|
repeat (2) @(posedge s_clk);
|
|
#1;
|
|
assert (!s_core_rst_n && !s_reset_done)
|
|
else $fatal(1, "held reset did not assert");
|
|
repeat (3) @(posedge s_clk);
|
|
#1;
|
|
assert (!s_core_rst_n && !s_reset_done)
|
|
else $fatal(1, "held reset released too early");
|
|
|
|
s_reset_req = 1'b0;
|
|
repeat (ResetSyncStages + 1) @(posedge s_clk);
|
|
#1;
|
|
assert (s_core_rst_n && s_reset_done)
|
|
else $fatal(1, "held reset did not release");
|
|
|
|
$display("management debug reset test passed");
|
|
$finish;
|
|
end
|
|
endmodule
|