`timescale 1ns/1ps
//====================================================
//Author : pwy
//Date   : 2024-04-04
//Des    : async set & sync release management unit
//====================================================
module rst_gen_unit(
  //ext hardware async reset  -- low active
   input  async_rstn_i        
  //power-on reset -- low active
  ,input  por_rstn_i               
  //sys soft reset -- low active       
  ,input  sys_soft_resetn_i
  //ch0 soft reset -- low active  
  ,input  ch0_soft_rstn_i
  //ch1 soft reset -- low active  
  ,input  ch1_soft_rstn_i
  //ch2 soft reset -- low active  
  ,input  ch2_soft_rstn_i
  //ch3 soft reset -- low active
  ,input  ch3_soft_rstn_i
  //clock    
  ,input  clk
  //reset output -- low active           
  ,output ch0_rstn_o
  ,output ch1_rstn_o
  ,output ch2_rstn_o
  ,output ch3_rstn_o
  //Phase-locked loop reset -- low active 
  ,output pll_rstn_o 
);

//ch0 reset --> async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch0_soft_rstn_i
rst_sync ch0_rstn_sync (
   .clk_d              ( clk                                                             )
  ,.async_rstn         ( async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch0_soft_rstn_i )
  ,.sync_rstn          ( ch0_rstn_o                                                      )
);

//ch1 reset --> async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch1_soft_rstn_i
rst_sync ch1_rstn_sync (
   .clk_d              ( clk                                                             )
  ,.async_rstn         ( async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch1_soft_rstn_i )
  ,.sync_rstn          ( ch1_rstn_o                                                      )
);

//ch2 reset --> async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch2_soft_rstn_i
rst_sync ch2_rstn_sync (
   .clk_d              ( clk                                                             )
  ,.async_rstn         ( async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch2_soft_rstn_i )
  ,.sync_rstn          ( ch2_rstn_o                                                      )
);

//ch3 reset --> async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch3_soft_rstn_i
rst_sync ch3_rstn_sync (
   .clk_d              ( clk                                                             )
  ,.async_rstn         ( async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch3_soft_rstn_i )
  ,.sync_rstn          ( ch3_rstn_o                                                      )
);

//Phase-locked loop reset -- low active 
assign pll_rstn_o = async_rstn_i & por_rstn_i;

endmodule
