Skip to content

Commit bed98f8

Browse files
alex96295bluewww
authored andcommitted
src/gen: Add mnxti config register
1 parent 8ed76ff commit bed98f8

6 files changed

Lines changed: 92 additions & 18 deletions

File tree

src/clic.sv

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ module clic import mclic_reg_pkg::*; import clicint_reg_pkg::*; #(
5656
localparam logic [1:0] M_MODE = 2'b11;
5757

5858
localparam logic [15:0] MCLICCFG_START = 16'h0000;
59+
localparam logic [15:0] MCLICCFG_END = 16'h0800;
5960
localparam logic [15:0] MCLICINT_START = 16'h1000;
6061
localparam logic [15:0] MCLICINT_END = 16'h4fff;
6162

@@ -81,6 +82,7 @@ module clic import mclic_reg_pkg::*; import clicint_reg_pkg::*; #(
8182
logic [N_SOURCE-1:0] shv; // Handle per-irq SHV bits
8283

8384
logic [N_SOURCE-1:0] claim;
85+
logic mnxti_cfg;
8486

8587
// handle incoming interrupts
8688
clic_gateway #(
@@ -123,7 +125,9 @@ module clic import mclic_reg_pkg::*; import clicint_reg_pkg::*; #(
123125
.irq_mode_o (irq_mode),
124126

125127
.irq_kill_req_o,
126-
.irq_kill_ack_i
128+
.irq_kill_ack_i,
129+
130+
.mnxti_cfg_i (mnxti_cfg)
127131
);
128132

129133
// configuration registers
@@ -198,7 +202,7 @@ module clic import mclic_reg_pkg::*; import clicint_reg_pkg::*; #(
198202
reg_rsp_o = '0;
199203

200204
unique case(reg_req_i.addr[15:0]) inside
201-
MCLICCFG_START: begin
205+
[MCLICCFG_START:MCLICCFG_END]: begin
202206
reg_mclic_req = reg_req_i;
203207
reg_rsp_o = reg_mclic_rsp;
204208
end
@@ -261,7 +265,8 @@ module clic import mclic_reg_pkg::*; import clicint_reg_pkg::*; #(
261265
.ie_o (ie),
262266
.le_o (le),
263267

264-
.ip_i (ip)
268+
.ip_i (ip),
269+
.mnxti_cfg_o(mnxti_cfg)
265270
);
266271

267272
// Create level and prio signals with dynamic indexing (#bits are read from

src/clic_reg_adapter.sv

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ module clic_reg_adapter import mclic_reg_pkg::*; import clicint_reg_pkg::*; #(
3333
output logic [N_SOURCE-1:0] ie_o,
3434
output logic [N_SOURCE-1:0] le_o,
3535

36-
input logic [N_SOURCE-1:0] ip_i
36+
input logic [N_SOURCE-1:0] ip_i,
37+
output logic mnxti_cfg_o
3738
);
3839

3940
// We only support positive edge triggered and positive level triggered
@@ -50,4 +51,6 @@ module clic_reg_adapter import mclic_reg_pkg::*; import clicint_reg_pkg::*; #(
5051
assign le_o[i] = clicint_reg2hw[i].clicint.attr_trig.q[0];
5152
end
5253

54+
assign mnxti_cfg_o = mclic_reg2hw.clicmnxticonf.q;
55+
5356
endmodule // clic_reg_adapter

src/clic_target.sv

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ module clic_target #(
5555
output logic [ModeWidth-1:0] irq_mode_o,
5656

5757
output logic irq_kill_req_o,
58-
input logic irq_kill_ack_i
58+
input logic irq_kill_ack_i,
59+
input logic mnxti_cfg_i
5960
);
6061

6162
// this only works with 2 or more sources
@@ -185,9 +186,19 @@ module clic_target #(
185186
// wait for handshake
186187
ACK: begin
187188
irq_valid_d = 1'b1;
188-
irq_id_d = irq_id_q;
189-
irq_max_d = irq_max_q;
190-
irq_mode_d = irq_mode_q;
189+
if (!mnxti_cfg_i) begin
190+
irq_id_d = irq_id_q;
191+
irq_max_d = irq_max_q;
192+
irq_mode_d = irq_mode_q;
193+
end else begin
194+
if (irq_root_valid) begin
195+
irq_id_d = irq_root_id; // give irq_id_d the most updated value
196+
irq_max_d = max_tree[0]; // give irq_max_d the most updated value
197+
end else begin
198+
irq_id_d = '0;
199+
irq_max_d = '0;
200+
end
201+
end
191202
// level sensitive interrupts (le_i == 1'b0) can be cleared (ip_i goes
192203
// to 1'b0) and shouldn't fire anymore so we should get unstuck here
193204
if (!le_i[irq_id_q] && !ip_i[irq_id_q]) begin

src/gen/mclic.hjson

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@
3434
{ bits: "3:0", name: "mnlbits", desc: "number of interrupt level bits in machine mode" },
3535
],
3636
},
37+
{ name: "CLICMNXTICONF",
38+
desc: "CLIC enable mnxti irq forwarding logic",
39+
swaccess: "rw",
40+
hwaccess: "hro",
41+
fields: [
42+
{ bits: "0" }
43+
],
44+
},
3745
]
3846
}
3947

src/mclic_reg_pkg.sv

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
package mclic_reg_pkg;
88

99
// Address widths within the block
10-
parameter int BlockAw = 2;
10+
parameter int BlockAw = 3;
1111

1212
////////////////////////////
1313
// Typedefs for registers //
@@ -28,22 +28,30 @@ package mclic_reg_pkg;
2828
} unlbits;
2929
} mclic_reg2hw_mcliccfg_reg_t;
3030

31+
typedef struct packed {
32+
logic q;
33+
} mclic_reg2hw_clicmnxticonf_reg_t;
34+
3135
// Register -> HW type
3236
typedef struct packed {
33-
mclic_reg2hw_mcliccfg_reg_t mcliccfg; // [13:0]
37+
mclic_reg2hw_mcliccfg_reg_t mcliccfg; // [14:1]
38+
mclic_reg2hw_clicmnxticonf_reg_t clicmnxticonf; // [0:0]
3439
} mclic_reg2hw_t;
3540

3641
// Register offsets
37-
parameter logic [BlockAw-1:0] MCLIC_MCLICCFG_OFFSET = 2'h 0;
42+
parameter logic [BlockAw-1:0] MCLIC_MCLICCFG_OFFSET = 3'h 0;
43+
parameter logic [BlockAw-1:0] MCLIC_CLICMNXTICONF_OFFSET = 3'h 4;
3844

3945
// Register index
4046
typedef enum int {
41-
MCLIC_MCLICCFG
47+
MCLIC_MCLICCFG,
48+
MCLIC_CLICMNXTICONF
4249
} mclic_id_e;
4350

4451
// Register width information to check illegal writes
45-
parameter logic [3:0] MCLIC_PERMIT [1] = '{
46-
4'b 1111 // index[0] MCLIC_MCLICCFG
52+
parameter logic [3:0] MCLIC_PERMIT [2] = '{
53+
4'b 1111, // index[0] MCLIC_MCLICCFG
54+
4'b 0001 // index[1] MCLIC_CLICMNXTICONF
4755
};
4856

4957
endpackage

src/mclic_reg_top.sv

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
module mclic_reg_top #(
1111
parameter type reg_req_t = logic,
1212
parameter type reg_rsp_t = logic,
13-
parameter int AW = 2
13+
parameter int AW = 3
1414
) (
1515
input logic clk_i,
1616
input logic rst_ni,
@@ -80,6 +80,9 @@ module mclic_reg_top #(
8080
logic [3:0] mcliccfg_unlbits_wd;
8181
logic mcliccfg_unlbits_we;
8282
logic [3:0] mcliccfg_reserved_qs;
83+
logic clicmnxticonf_qs;
84+
logic clicmnxticonf_wd;
85+
logic clicmnxticonf_we;
8386

8487
// Register instances
8588
// R[mcliccfg]: V(False)
@@ -193,20 +196,49 @@ module mclic_reg_top #(
193196
assign mcliccfg_reserved_qs = 4'h0;
194197

195198

199+
// R[clicmnxticonf]: V(False)
200+
201+
prim_subreg #(
202+
.DW (1),
203+
.SWACCESS("RW"),
204+
.RESVAL (1'h0)
205+
) u_clicmnxticonf (
206+
.clk_i (clk_i ),
207+
.rst_ni (rst_ni ),
208+
209+
// from register interface
210+
.we (clicmnxticonf_we),
211+
.wd (clicmnxticonf_wd),
212+
213+
// from internal hardware
214+
.de (1'b0),
215+
.d ('0 ),
216+
217+
// to internal hardware
218+
.qe (),
219+
.q (reg2hw.clicmnxticonf.q ),
220+
221+
// to register interface (read)
222+
.qs (clicmnxticonf_qs)
223+
);
196224

197225

198-
logic [0:0] addr_hit;
226+
227+
228+
logic [1:0] addr_hit;
199229
always_comb begin
200230
addr_hit = '0;
201231
addr_hit[0] = (reg_addr == MCLIC_MCLICCFG_OFFSET);
232+
addr_hit[1] = (reg_addr == MCLIC_CLICMNXTICONF_OFFSET);
202233
end
203234

204235
assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
205236

206237
// Check sub-word write is permitted
207238
always_comb begin
208239
wr_err = (reg_we &
209-
((addr_hit[0] & (|(MCLIC_PERMIT[0] & ~reg_be)))));
240+
((addr_hit[0] & (|(MCLIC_PERMIT[0] & ~reg_be))) |
241+
(addr_hit[1] & (|(MCLIC_PERMIT[1] & ~reg_be)))));
210242
end
211243

212244
assign mcliccfg_mnlbits_we = addr_hit[0] & reg_we & !reg_error;
@@ -221,6 +253,9 @@ module mclic_reg_top #(
221253
assign mcliccfg_unlbits_we = addr_hit[0] & reg_we & !reg_error;
222254
assign mcliccfg_unlbits_wd = reg_wdata[27:24];
223255

256+
assign clicmnxticonf_we = addr_hit[1] & reg_we & !reg_error;
257+
assign clicmnxticonf_wd = reg_wdata[0];
258+
224259
// Read data return
225260
always_comb begin
226261
reg_rdata_next = '0;
@@ -233,6 +268,10 @@ module mclic_reg_top #(
233268
reg_rdata_next[31:28] = mcliccfg_reserved_qs;
234269
end
235270

271+
addr_hit[1]: begin
272+
reg_rdata_next[0] = clicmnxticonf_qs;
273+
end
274+
236275
default: begin
237276
reg_rdata_next = '1;
238277
end
@@ -255,7 +294,7 @@ endmodule
255294

256295
module mclic_reg_top_intf
257296
#(
258-
parameter int AW = 2,
297+
parameter int AW = 3,
259298
localparam int DW = 32
260299
) (
261300
input logic clk_i,

0 commit comments

Comments
 (0)