Skip to content

Commit 43f16ab

Browse files
committed
treewide: Simplify external interrupt routing
Use single array to make the wiring independent from EPI-specific naming conventions and integration-derived terminology
1 parent 812373c commit 43f16ab

File tree

9 files changed

+47
-117
lines changed

9 files changed

+47
-117
lines changed

hw/pkg/pms_top_pkg.sv

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ package pms_top_pkg;
3737
parameter int unsigned CLUST_NB_FPU = 8; // Number of FPUs in the cluster. Default to 8 private per-core FPUs
3838
parameter int unsigned CLUST_NB_EXT_DIVSQRT = 1; // Number of external DIVSQRT units in the cluster. Default to 1.
3939

40+
parameter int unsigned NUM_EXT_INTERRUPTS = 222; // Number of external interrupts to the pms. An interrupt is considered
41+
// external if the interrupt source is outside the pms, which routes the
42+
// generated line(s) only. It equals NUM_INTERRUPTS-32-2, where NUM_INTERRUPTS
43+
// defaults to 256. 32 are the default internal CLINT interrupts, while 2
44+
// are the manager domain's DMA interrupts.
45+
4046
import control_pulp_pkg::*;
4147

4248
// Export AXI parameters from control_pulp
@@ -58,5 +64,5 @@ package pms_top_pkg;
5864
export control_pulp_pkg::axi_data_oup_ext_t;
5965
export control_pulp_pkg::axi_strb_oup_ext_t;
6066
export control_pulp_pkg::axi_addr_ext_t;
61-
67+
6268
endpackage // pms_top_pkg

hw/pulp/control_pulp.sv

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ module control_pulp import control_pulp_pkg::*; #(
5858
parameter int unsigned D2D_NUM_LANES = 0,
5959
parameter int unsigned D2D_NUM_CREDITS = 0,
6060

61+
parameter int unsigned NUM_EXT_INTERRUPTS = 222,
62+
6163
// axi req and resp types
6264

6365
// nci_cp_top Master
@@ -114,12 +116,8 @@ module control_pulp import control_pulp_pkg::*; #(
114116
// wdt
115117
output logic [1:0] wdt_alert_o,
116118
input logic wdt_alert_clear_i,
117-
// interrupts
118-
input logic scg_irq_i,
119-
input logic scp_irq_i,
120-
input logic scp_secure_irq_i,
121-
input logic [71:0] mbox_irq_i,
122-
input logic [71:0] mbox_secure_irq_i,
119+
// external interrupts
120+
input logic [NUM_EXT_INTERRUPTS-1:0] irq_ext_i,
123121

124122
// inout signals are split into input, output and enables
125123
// spi/i2c/uart
@@ -730,11 +728,7 @@ module control_pulp import control_pulp_pkg::*; #(
730728
.wdt_alert_o,
731729
.wdt_alert_clear_i,
732730

733-
.scg_irq_i,
734-
.scp_irq_i,
735-
.scp_secure_irq_i,
736-
.mbox_irq_i,
737-
.mbox_secure_irq_i,
731+
.irq_ext_i,
738732

739733
.gpio_in_i,
740734
.gpio_out_o,

hw/pulp/control_pulp_fpga.sv

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,7 @@ module control_pulp_fpga import pms_top_pkg::*; #(
280280

281281
// Doorbell interrupts
282282
localparam int unsigned NUM_SCMI_CHANNELS = 64;
283-
logic scg_irq, scp_irq, scp_secure_irq;
284-
logic [60:0] mbox_irq;
285-
283+
logic [NUM_EXT_INTERRUPTS-1:0] s_irq_ext;
286284

287285
// Glue-logic for interfacing AXI ports between PS/PL (PL = control_pulp)
288286
// The needs of PS in terms of address range, address width, data width, id width and user width are here satisfied with converter modules
@@ -637,9 +635,11 @@ module control_pulp_fpga import pms_top_pkg::*; #(
637635
.axi_mbox_rsp (to_mailbox_resp),
638636

639637
.irq_completion_o (/*TODO*/), // completion irq platform->agent
640-
.irq_doorbell_o ({mbox_irq, scp_secure_irq, scp_irq, scg_irq}) // doorbell irq agent->platform
638+
.irq_doorbell_o (s_irq_ext[NUM_SCMI_CHANNELS-1:0]) // doorbell irq agent->platform
641639
);
642640

641+
// Tie unused external interrupts to 0
642+
assign s_irq_ext[NUM_EXT_INTERRUPTS-1:NUM_SCMI_CHANNELS] = '0;
643643

644644
// II. PL TO PS DIRECTION
645645

@@ -2000,11 +2000,7 @@ module control_pulp_fpga import pms_top_pkg::*; #(
20002000
.wdt_alert_o,
20012001
.wdt_alert_clear_i,
20022002

2003-
.scg_irq_i (scg_irq ),
2004-
.scp_irq_i (scp_irq ),
2005-
.scp_secure_irq_i (scp_secure_irq ),
2006-
.mbox_irq_i ({11'h0, mbox_irq} ),
2007-
.mbox_secure_irq_i ('0 ),
2003+
.irq_ext_i (s_irq_ext ),
20082004

20092005
.oe_qspi_sdio_o ( s_oe_qspi_sdio ),
20102006
.oe_qspi_csn_o ( s_oe_qspi_csn ),

hw/pulp/pms_top.sv

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ module pms_top import pms_top_pkg::*; #(
4949
parameter int unsigned N_SPI = 8,
5050
parameter int unsigned N_UART = 1,
5151

52+
parameter int unsigned NUM_EXT_INTERRUPTS = 222,
53+
5254
parameter int unsigned AXI_DATA_INP_WIDTH_EXT = 64, // External parameter from nci_cp_top
5355
localparam int unsigned AXI_STRB_INP_WIDTH_EXT = AXI_DATA_INP_WIDTH_EXT/8,
5456
parameter int unsigned AXI_DATA_OUP_WIDTH_EXT = 64, // External parameter from nci_cp_top
@@ -198,12 +200,8 @@ module pms_top import pms_top_pkg::*; #(
198200
// wdt
199201
output logic [1:0] wdt_alert_o,
200202
input logic wdt_alert_clear_i,
201-
// interrupts
202-
input logic scg_irq_i,
203-
input logic scp_irq_i,
204-
input logic scp_secure_irq_i,
205-
input logic [71:0] mbox_irq_i,
206-
input logic [71:0] mbox_secure_irq_i,
203+
// external interrupts
204+
input logic [NUM_EXT_INTERRUPTS-1:0] irq_ext_i,
207205

208206
// Inout signals are split into input, output and enables
209207

@@ -1176,6 +1174,8 @@ module pms_top import pms_top_pkg::*; #(
11761174
.D2D_NUM_CHANNELS (D2D_NUM_CHANNELS),
11771175
.D2D_NUM_LANES (D2D_NUM_LANES),
11781176
.D2D_NUM_CREDITS (D2D_NUM_CREDITS),
1177+
// External interrupts
1178+
.NUM_EXT_INTERRUPTS(NUM_EXT_INTERRUPTS),
11791179

11801180
// nci_cp_top Master
11811181
.axi_req_inp_ext_t (axi_req_inp_ext_t),
@@ -1226,11 +1226,7 @@ module pms_top import pms_top_pkg::*; #(
12261226
.wdt_alert_o,
12271227
.wdt_alert_clear_i,
12281228

1229-
.scg_irq_i,
1230-
.scp_irq_i,
1231-
.scp_secure_irq_i,
1232-
.mbox_irq_i,
1233-
.mbox_secure_irq_i,
1229+
.irq_ext_i,
12341230

12351231
.oe_qspi_sdio_o,
12361232
.oe_qspi_csn_o,

hw/pulp/soc_domain.sv

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ module soc_domain #(
6363
parameter int unsigned SIM_STDOUT = 0,
6464
parameter int unsigned MACRO_ROM = 0,
6565
parameter int unsigned USE_CLUSTER = 0,
66-
parameter int unsigned SDMA_RT_MIDEND = 0
66+
parameter int unsigned SDMA_RT_MIDEND = 0,
67+
parameter int unsigned NUM_EXT_INTERRUPTS = 222
6768
)(
6869

6970
input logic soc_clk_i,
@@ -93,11 +94,7 @@ module soc_domain #(
9394
output logic [1:0] wdt_alert_o,
9495
input logic wdt_alert_clear_i,
9596

96-
input logic scg_irq_i,
97-
input logic scp_irq_i,
98-
input logic scp_secure_irq_i,
99-
input logic [71:0] mbox_irq_i,
100-
input logic [71:0] mbox_secure_irq_i,
97+
input logic [NUM_EXT_INTERRUPTS-1:0] irq_ext_i,
10198

10299
output logic [NB_CL_CORES-1:0] dbg_irq_valid_o,
103100

@@ -404,11 +401,7 @@ module soc_domain #(
404401
.jtag_trst_ni (jtag_trst_ni),
405402
.jtag_tms_i (jtag_tms_i),
406403
.jtag_tdi_i (jtag_tdi_i),
407-
.scg_irq_i (scg_irq_i),
408-
.scp_irq_i (scp_irq_i),
409-
.scp_secure_irq_i (scp_secure_irq_i),
410-
.mbox_irq_i (mbox_irq_i),
411-
.mbox_secure_irq_i (mbox_secure_irq_i),
404+
.irq_ext_i,
412405
.wdt_alert_clear_i (wdt_alert_clear_i),
413406
.apb_serial_link_bus (apb_serial_link_bus),
414407
.apb_clk_ctrl_bus (apb_clk_ctrl_bus),

tb/fixture_pms_top.sv

Lines changed: 13 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -734,9 +734,7 @@ module fixture_pms_top;
734734
assign sclIm = w_i2c_slv_scl[0];
735735

736736
// Control external interrupts
737-
logic scg_irq, scp_irq, scp_secure_irq;
738-
logic [71:0] mbox_irq, mbox_secure_irq;
739-
737+
logic [pms_top_pkg::NUM_EXT_INTERRUPTS-1:0] s_irq_ext;
740738

741739
//
742740
// Simulation pad-frame
@@ -1212,6 +1210,7 @@ module fixture_pms_top;
12121210
.N_I2C_SLV(pms_top_pkg::N_I2C_SLV),
12131211
.N_SPI(pms_top_pkg::N_SPI),
12141212
.N_UART(pms_top_pkg::N_UART),
1213+
.NUM_EXT_INTERRUPTS(pms_top_pkg::NUM_EXT_INTERRUPTS),
12151214

12161215
// D2D link
12171216
.USE_D2D (USE_D2D),
@@ -1358,11 +1357,7 @@ module fixture_pms_top;
13581357
.wdt_alert_o (),
13591358
.wdt_alert_clear_i(1'b0),
13601359

1361-
.scg_irq_i (scg_irq),
1362-
.scp_irq_i (scp_irq),
1363-
.scp_secure_irq_i (scp_secure_irq),
1364-
.mbox_irq_i (mbox_irq),
1365-
.mbox_secure_irq_i(mbox_secure_irq),
1360+
.irq_ext_i(s_irq_ext),
13661361

13671362

13681363
// Inout signals are split into input, output and enables
@@ -1904,71 +1899,20 @@ module fixture_pms_top;
19041899
.mst_resp_i (to_sim_mem_resp)
19051900
);
19061901

1907-
// Very basic doorbell modules, one for each interrupt line (external + clint)
1908-
logic db_trigger_scg = 1'b0;
1909-
logic db_trigger_scp = 1'b0;
1910-
logic db_trigger_scp_secure = 1'b0;
1911-
logic db_scg_irq;
1912-
logic db_scp_irq;
1913-
logic db_scp_secure_irq;
1914-
logic [71:0] db_trigger_mbox = '0;
1915-
logic [71:0] db_trigger_mbox_secure = '0;
1916-
logic [71:0] db_mbox_irq;
1917-
logic [71:0] db_mbox_secure_irq;
1918-
// logic [31:0] db_trigger_clint;
1919-
// logic [31:0] db_clint_irq;
1920-
1921-
// Wrap trigger signals in one array
1922-
logic [255:0] db_trigger = {
1923-
{77{1'b0}}, // 77 (systemverilog has default:0 but that doesn't work reliably)
1924-
db_trigger_mbox_secure, // 72
1925-
db_trigger_mbox, // 72
1926-
db_trigger_scp_secure, // 1
1927-
db_trigger_scp, // 1
1928-
db_trigger_scg // 1
1929-
};
1902+
// Very basic doorbell modules, one for each interrupt line. This is for fast
1903+
// tracking if we can trigger hardware interrupt lines.
1904+
logic [pms_top_pkg::NUM_EXT_INTERRUPTS-1:0] db_trigger;
1905+
logic [pms_top_pkg::NUM_EXT_INTERRUPTS-1:0] db;
19301906

19311907
// Assign firing interrupt from doorbells to pms_top
1932-
assign scg_irq = db_scg_irq;
1933-
assign scp_irq = db_scp_irq;
1934-
assign scp_secure_irq = db_scp_secure_irq;
1935-
assign mbox_irq = db_mbox_irq;
1936-
assign mbox_secure_irq = db_mbox_secure_irq;
1937-
1938-
doorbell i_doorbell_scg (
1939-
.clk_i (s_clk_ref),
1940-
.rst_ni (s_rst_n),
1941-
.db_trigger_i(db_trigger[0]),
1942-
.irq_o (db_scg_irq)
1943-
);
1944-
1945-
doorbell i_doorbell_scp (
1946-
.clk_i (s_clk_ref),
1947-
.rst_ni (s_rst_n),
1948-
.db_trigger_i(db_trigger[1]),
1949-
.irq_o (db_scp_irq)
1950-
);
1951-
1952-
doorbell i_doorbell_scp_sec (
1953-
.clk_i (s_clk_ref),
1954-
.rst_ni (s_rst_n),
1955-
.db_trigger_i(db_trigger[2]),
1956-
.irq_o (db_scp_secure_irq)
1957-
);
1958-
1959-
for (genvar i = 0; i < 72; i++) begin : doorbell_mbox_irq
1960-
doorbell i_doorbell_mbox (
1961-
.clk_i (s_clk_ref),
1962-
.rst_ni (s_rst_n),
1963-
.db_trigger_i(db_trigger[i+3]),
1964-
.irq_o (db_mbox_irq[i])
1965-
);
1908+
assign s_irq_ext = db;
19661909

1967-
doorbell i_doorbell_mbox_sec (
1910+
for (genvar i = 0; i < pms_top_pkg::NUM_EXT_INTERRUPTS-1; i++) begin : doorbell_irq
1911+
doorbell i_doorbell (
19681912
.clk_i (s_clk_ref),
19691913
.rst_ni (s_rst_n),
1970-
.db_trigger_i(db_trigger[i+75]),
1971-
.irq_o (db_mbox_secure_irq[i])
1914+
.db_trigger_i(db_trigger[i]),
1915+
.irq_o (db[i])
19721916
);
19731917
end
19741918

@@ -2720,7 +2664,7 @@ module fixture_pms_top;
27202664
// Interrupts control: driver tasks
27212665
//
27222666

2723-
task db_trigger_irq(input logic [255:0] mask);
2667+
task db_trigger_irq(input logic [pms_top_pkg::NUM_EXT_INTERRUPTS-1:0] mask);
27242668
db_trigger &= '0; // make sure the irq array is zero
27252669
db_trigger |= mask;
27262670
endtask // ext_irq_trigger

tb/tb_scmi_doorbell_b2b.sv

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ module tb_scmi_doorbell_b2b;
2828
fixture_pms_top fixt_pms ();
2929

3030
logic [31:0] entry_point;
31-
int exit_status, msg_cnt;
32-
logic [255:0] irq_mask = {256{1'b0}};
31+
int exit_status;
32+
int msg_cnt = 0;
33+
logic [pms_top_pkg::NUM_EXT_INTERRUPTS-1:0] irq_mask = {(pms_top_pkg::NUM_EXT_INTERRUPTS){1'b0}};
3334

3435
// pms boot driver process (AXI)
3536
initial begin : axi_boot_process

tb/tb_scmi_doorbell_conc.sv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ module tb_scmi_doorbell_conc;
3030

3131
logic [31:0] entry_point;
3232
int exit_status;
33-
logic [255:0] irq_mask = {256{1'b0}};
33+
logic [pms_top_pkg::NUM_EXT_INTERRUPTS-1:0] irq_mask = {(pms_top_pkg::NUM_EXT_INTERRUPTS){1'b0}};
3434

3535
// pms boot driver process (AXI)
3636
initial begin : axi_boot_process
@@ -95,7 +95,7 @@ module tb_scmi_doorbell_conc;
9595
// Program has notified the tb, trigger interrupt lines
9696
if (notifier[0] == 1) begin
9797
$display("[TB] %t - Trigger interrupts", $realtime);
98-
irq_mask = {256{1'b1}};
98+
irq_mask = {(pms_top_pkg::NUM_EXT_INTERRUPTS){1'b1}};
9999
fixt_pms.db_trigger_irq(irq_mask);
100100

101101
#5ns fixt_pms.db_trigger_irq('0);

0 commit comments

Comments
 (0)