forked from chipsalliance/i3c-core
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathinterrupt.sv
More file actions
67 lines (53 loc) · 1.67 KB
/
Copy pathinterrupt.sv
File metadata and controls
67 lines (53 loc) · 1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
Single interrupt request handling logic
*/
module interrupt # (
parameter bit TriggerOnEdge = 1 // 1 - trigger on rising edge, 0 - trigger on high level
) (
input logic clk_i,
input logic rst_ni,
input logic irq_i, // IRQ input from source
input logic irq_force_i, // Force IRQ input
input logic clr_i, // Status clear from logic
output logic sts_o, // Status next state
output logic sts_we_o, // Status write enable
input logic sts_i, // Status state
input logic sts_ena_i, // IRQ status enable input
input logic sig_ena_i, // IRQ signal enable input
output logic irq_o // IRQ output
);
logic irq;
logic trg;
// Interrupt request input
assign irq = (irq_i | irq_force_i);
// Trigger on edge
generate if (TriggerOnEdge == 1'b1) begin : gen_edge_trigger
logic irq_r;
always_ff @(posedge clk_i or negedge rst_ni) begin
if (!rst_ni) begin
irq_r <= '0;
trg <= '0;
end else begin
irq_r <= irq;
trg <= irq & !irq_r;
end
end
// Trigger on level
end else begin : gen_level_trigger
assign trg = irq;
end endgenerate
// Status storage control
always_comb begin
sts_o = '0;
sts_we_o = '0;
if (trg & sts_ena_i) begin
sts_o = '1;
sts_we_o = '1;
end else if (clr_i) begin
sts_o = '0;
sts_we_o = '1;
end
end
// Interrupt request output
assign irq_o = sts_i & sig_ena_i;
endmodule