blob: 2631a79676abf8b5aa399b3cb2e0ef97a1ceefe2 [file] [log] [blame]
Eric Shiu747a23e2021-02-16 13:25:00 -08001// Copyright lowRISC contributors.
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4//
5// Description: DCD interrupt Module
6//
7module dcd_intr import dcd_reg_pkg::*; (
8 input clk_i,
9 input rst_ni,
10 input clk_aon_i,
11 input rst_slow_ni,
12
13 input [NumAdcFilter-1:0] cfg_wakeup_en,
14 input [NumAdcFilter-1:0] cfg_intr_en,
15 input cfg_oneshot_intr_en,
16 input [NumAdcFilter-1:0] dcd_match_pulse,
17 input cfg_oneshot_done,
18
19 input dcd_reg2hw_intr_state_reg_t intr_state_i,
20 input dcd_reg2hw_intr_enable_reg_t intr_enable_i,
21 input dcd_reg2hw_intr_test_reg_t intr_test_i,
22
23 output dcd_hw2reg_intr_state_reg_t intr_state_o,
24 output dcd_hw2reg_adc_intr_status_reg_t adc_intr_status_o,
25 output dcd_hw2reg_adc_wakeup_status_reg_t adc_wakeup_status_o,
26
27 output debug_cable_wakeup_o,
28 output intr_debug_cable_o
29);
30
31 logic [NumAdcFilter-1:0] cfg_dcd_match_done;
32 logic dcd_event;
33
34 //Synchronize from 200KHz always-onclock to 24MHz cfg clock
35 prim_pulse_sync i_cc_sink_det (
36 .clk_src_i (clk_aon_i),
37 .clk_dst_i (clk_i),
38 .rst_src_ni (rst_slow_ni),
39 .rst_dst_ni (rst_ni),
40 .src_pulse_i (dcd_match_pulse[0]),
41 .dst_pulse_o (cfg_dcd_match_done[0])
42 );
43
44 prim_pulse_sync i_cc_1a5_sink_det (
45 .clk_src_i (clk_aon_i),
46 .clk_dst_i (clk_i),
47 .rst_src_ni (rst_slow_ni),
48 .rst_dst_ni (rst_ni),
49 .src_pulse_i (dcd_match_pulse[1]),
50 .dst_pulse_o (cfg_dcd_match_done[1])
51 );
52
53 prim_pulse_sync i_cc_3a0_sink_det (
54 .clk_src_i (clk_aon_i),
55 .clk_dst_i (clk_i),
56 .rst_src_ni (rst_slow_ni),
57 .rst_dst_ni (rst_ni),
58 .src_pulse_i (dcd_match_pulse[2]),
59 .dst_pulse_o (cfg_dcd_match_done[2])
60 );
61
62 prim_pulse_sync i_cc_src_det (
63 .clk_src_i (clk_aon_i),
64 .clk_dst_i (clk_i),
65 .rst_src_ni (rst_slow_ni),
66 .rst_dst_ni (rst_ni),
67 .src_pulse_i (dcd_match_pulse[3]),
68 .dst_pulse_o (cfg_dcd_match_done[3])
69 );
70
71 prim_pulse_sync i_cc_1a5_src_det (
72 .clk_src_i (clk_aon_i),
73 .clk_dst_i (clk_i),
74 .rst_src_ni (rst_slow_ni),
75 .rst_dst_ni (rst_ni),
76 .src_pulse_i (dcd_match_pulse[4]),
77 .dst_pulse_o (cfg_dcd_match_done[4])
78 );
79
80 prim_pulse_sync i_cc_src_det_flip (
81 .clk_src_i (clk_aon_i),
82 .clk_dst_i (clk_i),
83 .rst_src_ni (rst_slow_ni),
84 .rst_dst_ni (rst_ni),
85 .src_pulse_i (dcd_match_pulse[5]),
86 .dst_pulse_o (cfg_dcd_match_done[5])
87 );
88
89 prim_pulse_sync i_cc_1a5_src_det_flip (
90 .clk_src_i (clk_aon_i),
91 .clk_dst_i (clk_i),
92 .rst_src_ni (rst_slow_ni),
93 .rst_dst_ni (rst_ni),
94 .src_pulse_i (dcd_match_pulse[6]),
95 .dst_pulse_o (cfg_dcd_match_done[6])
96 );
97
98 prim_pulse_sync i_cc_discon (
99 .clk_src_i (clk_aon_i),
100 .clk_dst_i (clk_i),
101 .rst_src_ni (rst_slow_ni),
102 .rst_dst_ni (rst_ni),
103 .src_pulse_i (dcd_match_pulse[7]),
104 .dst_pulse_o (cfg_dcd_match_done[7])
105 );
106
107 //To write into interrupt status register
108 assign adc_intr_status_o.cc_sink_det.de = cfg_dcd_match_done[0];
109 assign adc_intr_status_o.cc_1a5_sink_det.de = cfg_dcd_match_done[1];
110 assign adc_intr_status_o.cc_3a0_sink_det.de = cfg_dcd_match_done[2];
111 assign adc_intr_status_o.cc_src_det.de = cfg_dcd_match_done[3];
112 assign adc_intr_status_o.cc_1a5_src_det.de = cfg_dcd_match_done[4];
113 assign adc_intr_status_o.cc_src_det_flip.de = cfg_dcd_match_done[5];
114 assign adc_intr_status_o.cc_1a5_src_det_flip.de = cfg_dcd_match_done[6];
115 assign adc_intr_status_o.cc_discon.de = cfg_dcd_match_done[7];
116 assign adc_intr_status_o.oneshot.de = cfg_oneshot_done;
117
118 assign adc_intr_status_o.cc_sink_det.d = 1'b1;
119 assign adc_intr_status_o.cc_1a5_sink_det.d = 1'b1;
120 assign adc_intr_status_o.cc_3a0_sink_det.d = 1'b1;
121 assign adc_intr_status_o.cc_src_det.d = 1'b1;
122 assign adc_intr_status_o.cc_1a5_src_det.d = 1'b1;
123 assign adc_intr_status_o.cc_src_det_flip.d = 1'b1;
124 assign adc_intr_status_o.cc_1a5_src_det_flip.d = 1'b1;
125 assign adc_intr_status_o.cc_discon.d = 1'b1;
126 assign adc_intr_status_o.oneshot.d = 1'b1;
127
128 //Qualify each bit with intr_en
129 assign dcd_event = (|(cfg_dcd_match_done & cfg_intr_en)) ||
130 (cfg_oneshot_done & cfg_oneshot_intr_en);
131
132 // instantiate interrupt hardware primitive
133 prim_intr_hw #(.Width(1)) i_dcd_intr_o (
134 .clk_i(clk_i),
135 .rst_ni(rst_ni),
136 .event_intr_i (dcd_event),
137 .reg2hw_intr_enable_q_i (intr_enable_i.q),
138 .reg2hw_intr_test_q_i (intr_test_i.q),
139 .reg2hw_intr_test_qe_i (intr_test_i.qe),
140 .reg2hw_intr_state_q_i (intr_state_i.q),
141 .hw2reg_intr_state_de_o (intr_state_o.de),
142 .hw2reg_intr_state_d_o (intr_state_o.d),
143 .intr_o (intr_debug_cable_o)
144 );
145
146 //To write into wakeup status register
147 assign adc_wakeup_status_o.cc_sink_det.de = cfg_dcd_match_done[0];
148 assign adc_wakeup_status_o.cc_1a5_sink_det.de = cfg_dcd_match_done[1];
149 assign adc_wakeup_status_o.cc_3a0_sink_det.de = cfg_dcd_match_done[2];
150 assign adc_wakeup_status_o.cc_src_det.de = cfg_dcd_match_done[3];
151 assign adc_wakeup_status_o.cc_1a5_src_det.de = cfg_dcd_match_done[4];
152 assign adc_wakeup_status_o.cc_src_det_flip.de = cfg_dcd_match_done[5];
153 assign adc_wakeup_status_o.cc_1a5_src_det_flip.de = cfg_dcd_match_done[6];
154 assign adc_wakeup_status_o.cc_discon.de = cfg_dcd_match_done[7];
155
156 assign adc_wakeup_status_o.cc_sink_det.d = 1'b1;
157 assign adc_wakeup_status_o.cc_1a5_sink_det.d = 1'b1;
158 assign adc_wakeup_status_o.cc_3a0_sink_det.d = 1'b1;
159 assign adc_wakeup_status_o.cc_src_det.d = 1'b1;
160 assign adc_wakeup_status_o.cc_1a5_src_det.d = 1'b1;
161 assign adc_wakeup_status_o.cc_src_det_flip.d = 1'b1;
162 assign adc_wakeup_status_o.cc_1a5_src_det_flip.d = 1'b1;
163 assign adc_wakeup_status_o.cc_discon.d = 1'b1;
164
165 //Qualify each bit with wakeup_en
166 assign debug_cable_wakeup_o = |(cfg_dcd_match_done & cfg_wakeup_en);
167
168endmodule