blob: 2631a79676abf8b5aa399b3cb2e0ef97a1ceefe2 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// Description: DCD interrupt Module
//
module dcd_intr import dcd_reg_pkg::*; (
input clk_i,
input rst_ni,
input clk_aon_i,
input rst_slow_ni,
input [NumAdcFilter-1:0] cfg_wakeup_en,
input [NumAdcFilter-1:0] cfg_intr_en,
input cfg_oneshot_intr_en,
input [NumAdcFilter-1:0] dcd_match_pulse,
input cfg_oneshot_done,
input dcd_reg2hw_intr_state_reg_t intr_state_i,
input dcd_reg2hw_intr_enable_reg_t intr_enable_i,
input dcd_reg2hw_intr_test_reg_t intr_test_i,
output dcd_hw2reg_intr_state_reg_t intr_state_o,
output dcd_hw2reg_adc_intr_status_reg_t adc_intr_status_o,
output dcd_hw2reg_adc_wakeup_status_reg_t adc_wakeup_status_o,
output debug_cable_wakeup_o,
output intr_debug_cable_o
);
logic [NumAdcFilter-1:0] cfg_dcd_match_done;
logic dcd_event;
//Synchronize from 200KHz always-onclock to 24MHz cfg clock
prim_pulse_sync i_cc_sink_det (
.clk_src_i (clk_aon_i),
.clk_dst_i (clk_i),
.rst_src_ni (rst_slow_ni),
.rst_dst_ni (rst_ni),
.src_pulse_i (dcd_match_pulse[0]),
.dst_pulse_o (cfg_dcd_match_done[0])
);
prim_pulse_sync i_cc_1a5_sink_det (
.clk_src_i (clk_aon_i),
.clk_dst_i (clk_i),
.rst_src_ni (rst_slow_ni),
.rst_dst_ni (rst_ni),
.src_pulse_i (dcd_match_pulse[1]),
.dst_pulse_o (cfg_dcd_match_done[1])
);
prim_pulse_sync i_cc_3a0_sink_det (
.clk_src_i (clk_aon_i),
.clk_dst_i (clk_i),
.rst_src_ni (rst_slow_ni),
.rst_dst_ni (rst_ni),
.src_pulse_i (dcd_match_pulse[2]),
.dst_pulse_o (cfg_dcd_match_done[2])
);
prim_pulse_sync i_cc_src_det (
.clk_src_i (clk_aon_i),
.clk_dst_i (clk_i),
.rst_src_ni (rst_slow_ni),
.rst_dst_ni (rst_ni),
.src_pulse_i (dcd_match_pulse[3]),
.dst_pulse_o (cfg_dcd_match_done[3])
);
prim_pulse_sync i_cc_1a5_src_det (
.clk_src_i (clk_aon_i),
.clk_dst_i (clk_i),
.rst_src_ni (rst_slow_ni),
.rst_dst_ni (rst_ni),
.src_pulse_i (dcd_match_pulse[4]),
.dst_pulse_o (cfg_dcd_match_done[4])
);
prim_pulse_sync i_cc_src_det_flip (
.clk_src_i (clk_aon_i),
.clk_dst_i (clk_i),
.rst_src_ni (rst_slow_ni),
.rst_dst_ni (rst_ni),
.src_pulse_i (dcd_match_pulse[5]),
.dst_pulse_o (cfg_dcd_match_done[5])
);
prim_pulse_sync i_cc_1a5_src_det_flip (
.clk_src_i (clk_aon_i),
.clk_dst_i (clk_i),
.rst_src_ni (rst_slow_ni),
.rst_dst_ni (rst_ni),
.src_pulse_i (dcd_match_pulse[6]),
.dst_pulse_o (cfg_dcd_match_done[6])
);
prim_pulse_sync i_cc_discon (
.clk_src_i (clk_aon_i),
.clk_dst_i (clk_i),
.rst_src_ni (rst_slow_ni),
.rst_dst_ni (rst_ni),
.src_pulse_i (dcd_match_pulse[7]),
.dst_pulse_o (cfg_dcd_match_done[7])
);
//To write into interrupt status register
assign adc_intr_status_o.cc_sink_det.de = cfg_dcd_match_done[0];
assign adc_intr_status_o.cc_1a5_sink_det.de = cfg_dcd_match_done[1];
assign adc_intr_status_o.cc_3a0_sink_det.de = cfg_dcd_match_done[2];
assign adc_intr_status_o.cc_src_det.de = cfg_dcd_match_done[3];
assign adc_intr_status_o.cc_1a5_src_det.de = cfg_dcd_match_done[4];
assign adc_intr_status_o.cc_src_det_flip.de = cfg_dcd_match_done[5];
assign adc_intr_status_o.cc_1a5_src_det_flip.de = cfg_dcd_match_done[6];
assign adc_intr_status_o.cc_discon.de = cfg_dcd_match_done[7];
assign adc_intr_status_o.oneshot.de = cfg_oneshot_done;
assign adc_intr_status_o.cc_sink_det.d = 1'b1;
assign adc_intr_status_o.cc_1a5_sink_det.d = 1'b1;
assign adc_intr_status_o.cc_3a0_sink_det.d = 1'b1;
assign adc_intr_status_o.cc_src_det.d = 1'b1;
assign adc_intr_status_o.cc_1a5_src_det.d = 1'b1;
assign adc_intr_status_o.cc_src_det_flip.d = 1'b1;
assign adc_intr_status_o.cc_1a5_src_det_flip.d = 1'b1;
assign adc_intr_status_o.cc_discon.d = 1'b1;
assign adc_intr_status_o.oneshot.d = 1'b1;
//Qualify each bit with intr_en
assign dcd_event = (|(cfg_dcd_match_done & cfg_intr_en)) ||
(cfg_oneshot_done & cfg_oneshot_intr_en);
// instantiate interrupt hardware primitive
prim_intr_hw #(.Width(1)) i_dcd_intr_o (
.clk_i(clk_i),
.rst_ni(rst_ni),
.event_intr_i (dcd_event),
.reg2hw_intr_enable_q_i (intr_enable_i.q),
.reg2hw_intr_test_q_i (intr_test_i.q),
.reg2hw_intr_test_qe_i (intr_test_i.qe),
.reg2hw_intr_state_q_i (intr_state_i.q),
.hw2reg_intr_state_de_o (intr_state_o.de),
.hw2reg_intr_state_d_o (intr_state_o.d),
.intr_o (intr_debug_cable_o)
);
//To write into wakeup status register
assign adc_wakeup_status_o.cc_sink_det.de = cfg_dcd_match_done[0];
assign adc_wakeup_status_o.cc_1a5_sink_det.de = cfg_dcd_match_done[1];
assign adc_wakeup_status_o.cc_3a0_sink_det.de = cfg_dcd_match_done[2];
assign adc_wakeup_status_o.cc_src_det.de = cfg_dcd_match_done[3];
assign adc_wakeup_status_o.cc_1a5_src_det.de = cfg_dcd_match_done[4];
assign adc_wakeup_status_o.cc_src_det_flip.de = cfg_dcd_match_done[5];
assign adc_wakeup_status_o.cc_1a5_src_det_flip.de = cfg_dcd_match_done[6];
assign adc_wakeup_status_o.cc_discon.de = cfg_dcd_match_done[7];
assign adc_wakeup_status_o.cc_sink_det.d = 1'b1;
assign adc_wakeup_status_o.cc_1a5_sink_det.d = 1'b1;
assign adc_wakeup_status_o.cc_3a0_sink_det.d = 1'b1;
assign adc_wakeup_status_o.cc_src_det.d = 1'b1;
assign adc_wakeup_status_o.cc_1a5_src_det.d = 1'b1;
assign adc_wakeup_status_o.cc_src_det_flip.d = 1'b1;
assign adc_wakeup_status_o.cc_1a5_src_det_flip.d = 1'b1;
assign adc_wakeup_status_o.cc_discon.d = 1'b1;
//Qualify each bit with wakeup_en
assign debug_cable_wakeup_o = |(cfg_dcd_match_done & cfg_wakeup_en);
endmodule