blob: d020a4a47adc3d35dceec95cab03c473cb307a54 [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: adc_ctrl interrupt Module
//
module adc_ctrl_intr import adc_ctrl_reg_pkg::*; (
input clk_i,
input rst_ni,
input [NumAdcFilter-1:0] aon_filter_status_i,
input [8:0] cfg_intr_en_i,
input cfg_oneshot_done_i,
input adc_ctrl_reg2hw_intr_state_reg_t intr_state_i,
input adc_ctrl_reg2hw_intr_enable_reg_t intr_enable_i,
input adc_ctrl_reg2hw_intr_test_reg_t intr_test_i,
output adc_ctrl_hw2reg_intr_state_reg_t intr_state_o,
output adc_ctrl_hw2reg_adc_intr_status_reg_t adc_intr_status_o,
output intr_debug_cable_o
);
// synchronize status into appropriate interrupts
logic [NumAdcFilter-1:0] cfg_filter_status;
logic [NumAdcFilter-1:0] filter_match_event;
for (genvar i = 0; i < NumAdcFilter; i++) begin : gen_filter_status_sync
prim_flop_2sync #(
.Width(1),
.ResetValue('0)
) u_sync (
.clk_i,
.rst_ni,
.d_i(aon_filter_status_i[i]),
.q_o(cfg_filter_status[i])
);
logic cfg_filter_status_q;
always_ff @(posedge clk_i or negedge rst_ni) begin
if (!rst_ni) begin
cfg_filter_status_q <= '0;
end else begin
cfg_filter_status_q <= cfg_filter_status[i];
end
end
// rising detection is captured as interrupt
assign filter_match_event[i] = cfg_filter_status[i] & ~cfg_filter_status_q;
end
//To write into interrupt status register
assign adc_intr_status_o.cc_sink_det.de = filter_match_event[0];
assign adc_intr_status_o.cc_1a5_sink_det.de = filter_match_event[1];
assign adc_intr_status_o.cc_3a0_sink_det.de = filter_match_event[2];
assign adc_intr_status_o.cc_src_det.de = filter_match_event[3];
assign adc_intr_status_o.cc_1a5_src_det.de = filter_match_event[4];
assign adc_intr_status_o.cc_src_det_flip.de = filter_match_event[5];
assign adc_intr_status_o.cc_1a5_src_det_flip.de = filter_match_event[6];
assign adc_intr_status_o.cc_discon.de = filter_match_event[7];
assign adc_intr_status_o.oneshot.de = cfg_oneshot_done_i;
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
logic [8:0] intr_events;
logic adc_ctrl_event;
assign intr_events = {cfg_oneshot_done_i, filter_match_event};
assign adc_ctrl_event = |(intr_events & cfg_intr_en_i);
// instantiate interrupt hardware primitive
prim_intr_hw #(.Width(1)) i_adc_ctrl_intr_o (
.clk_i(clk_i),
.rst_ni(rst_ni),
.event_intr_i (adc_ctrl_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)
);
endmodule