Skip to content

Commit a92a9f0

Browse files
add pzcorebus_xbar_switch
1 parent b9a0302 commit a92a9f0

File tree

5 files changed

+375
-0
lines changed

5 files changed

+375
-0
lines changed

pzcorebus_common/pzcorebus_transposer.sv

+34
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,37 @@ module pzcorebus_transposer #(
2020
end
2121
end
2222
endmodule
23+
24+
module pzcorebus_request_transposer #(
25+
parameter int M = 1,
26+
parameter int N = 1
27+
)(
28+
interface.request_slave slave_if[M*N],
29+
interface.request_master master_if[N*M]
30+
);
31+
for (genvar i = 0;i < M;++i) begin : g
32+
for (genvar j = 0;j < N;++j) begin : g
33+
pzcorebus_request_connector u_connector (
34+
.slave_if (slave_if[N*i+j] ),
35+
.master_if (master_if[M*j+i] )
36+
);
37+
end
38+
end
39+
endmodule
40+
41+
module pzcorebus_response_transposer #(
42+
parameter int M = 1,
43+
parameter int N = 1
44+
)(
45+
interface.response_slave slave_if[M*N],
46+
interface.response_master master_if[N*M]
47+
);
48+
for (genvar i = 0;i < M;++i) begin : g
49+
for (genvar j = 0;j < N;++j) begin : g
50+
pzcorebus_response_connector u_connector (
51+
.slave_if (slave_if[N*i+j] ),
52+
.master_if (master_if[M*j+i] )
53+
);
54+
end
55+
en
56+
endmodule
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
//========================================
2+
//
3+
// Copyright (c) 2024 PEZY Computing, K.K.
4+
// All Rights Reserved.
5+
//
6+
//========================================
7+
module pzcorebus_request_xbar_switch
8+
import pzcorebus_pkg::*,
9+
pzbcm_arbiter_pkg::*,
10+
pzbcm_selector_pkg::*;
11+
#(
12+
parameter pzcorebus_config BUS_CONFIG = '0,
13+
parameter int SLAVES = 2,
14+
parameter int MASTERS = 2,
15+
parameter bit EXTERNAL_DECODE = 0,
16+
parameter pzbcm_selector_type SELECTOR_TYPE = PZBCM_SELECTOR_BINARY,
17+
parameter int SELECT_WIDTH = calc_select_width(SELECTOR_TYPE, MASTERS),
18+
parameter int SELECT_LSB = BUS_CONFIG.address_width - SELECT_WIDTH,
19+
parameter bit [1:0] ENABLE_ARBITER = 2'b01,
20+
parameter int PRIORITY_WIDTH = 0,
21+
parameter int WEIGHT_WIDTH = 0,
22+
parameter pzbcm_arbiter_weight_list WEIGHT = '1,
23+
parameter bit WAIT_FOR_DATA = 0,
24+
parameter bit WAIT_FOR_DATA_LAST = 0,
25+
parameter bit ENABLE_BROADCAST = 0
26+
parameter bit SLAVE_FIFO = 0,
27+
parameter bit MASTER_FIFO = 0,
28+
parameter int COMMAND_DEPTH = 2,
29+
parameter int DATA_DEPTH = 2,
30+
parameter bit ALIGN_OUT = 0,
31+
parameter bit SVA_CHECKER = 1
32+
)(
33+
input var i_clk,
34+
input var i_rst_n,
35+
output var pzcorebus_command [SLAVES-1:0] o_mcmd,
36+
input var [SLAVES-1:0][SELECT_WIDTH-1:0] i_select,
37+
input var pzbcm_arbiter_config i_arbiter_config,
38+
interface.request_slave slave_if[SLAVES],
39+
interface.request_master master_if[MASTERS]
40+
);
41+
localparam int TOTAL = SLAVES * MASTERS;
42+
43+
pzcorebus_request_if #(BUS_CONFIG) slave_switch_if[TOTAL]();
44+
pzcorebus_request_if #(BUS_CONFIG) master_switch_if[TOTAL]();
45+
46+
for (genvar i = 0;i < SLAVES;++i) begin : g_slave_switch
47+
pzcorebus_request_1_to_m_switch #(
48+
.BUS_CONFIG (BUS_CONFIG ),
49+
.MASTERS (MASTERS ),
50+
.EXTERNAL_DECODE (EXTERNAL_DECODE ),
51+
.SELECTOR_TYPE (SELECTOR_TYPE ),
52+
.SELECT_WIDTH (SELECT_WIDTH ),
53+
.SELECT_LSB (SELECT_LSB ),
54+
.WAIT_FOR_DATA (WAIT_FOR_DATA ),
55+
.WAIT_FOR_DATA_LAST (WAIT_FOR_DATA_LAST ),
56+
.ENABLE_BROADCAST (ENABLE_BROADCAST ),
57+
.SLAVE_FIFO (SLAVE_FIFO ),
58+
.MASTER_FIFO (0 )
59+
.COMMAND_DEPTH (COMMAND_DEPTH ),
60+
.DATA_DEPTH (DATA_DEPTH ),
61+
.SVA_CHECKER (SVA_CHECKER )
62+
) u_switch (
63+
.i_clk (i_clk ),
64+
.i_rst_n (i_rst_n ),
65+
.o_mcmd (o_mcmd[i] ),
66+
.i_select (i_select[i] ),
67+
.slave_if (slave_if[i] ),
68+
.master_if (master_if[MASTERS*i:MASTERS*(i+1)-1] )
69+
);
70+
end
71+
72+
pzcorebus_request_transposer #(
73+
.M (SLAVES ),
74+
.N (MASTERS )
75+
) u_transposer (
76+
.slave_if (slave_switch_if ),
77+
.master_if (master_switch_if )
78+
);
79+
80+
for (genvar i = 0;i < MASTERS;++i) begin : g_master_switch
81+
pzcorebus_request_m_to_1_switch #(
82+
.BUS_CONFIG (BUS_CONFIG ),
83+
.SLAVES (SLAVES ),
84+
.ENABLE_ARBITER (ENABLE_ARBITER ),
85+
.PRIORITY_WIDTH (PRIORITY_WIDTH ),
86+
.WEIGHT_WIDTH (WEIGHT_WIDTH ),
87+
.WEIGHT (WEIGHT ),
88+
.WAIT_FOR_DATA (0 ),
89+
.WAIT_FOR_RESPONSE (0 ),
90+
.SLAVE_FIFO (0 ),
91+
.MASTER_FIFO (MASTER_FIFO ),
92+
.COMMAND_DEPTH (COMMAND_DEPTH ),
93+
.DATA_DEPTH (DATA_DEPTH ),
94+
.ALIGN_OUT (ALIGN_OUT ),
95+
.SVA_CHECKER (0 )
96+
) u_switch (
97+
.i_clk (i_clk ),
98+
.i_rst_n (i_rst_n ),
99+
.i_arbiter_config (i_arbiter_config ),
100+
.o_response_select (),
101+
.i_response_ack ('0 ),
102+
.slave_if (master_switch_if[SLAVES:SLAVES*(i+1)-1] ),
103+
.master_if (master_if[i] )
104+
);
105+
end
106+
endmodule
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
//========================================
2+
//
3+
// Copyright (c) 2024 PEZY Computing, K.K.
4+
// All Rights Reserved.
5+
//
6+
//========================================
7+
module pzcorebus_response_xbar_switch
8+
import pzcorebus_pkg::*,
9+
pzbcm_arbiter_pkg::*,
10+
pzbcm_selector_pkg::*;
11+
#(
12+
parameter pzcorebus_config BUS_CONFIG = '0,
13+
parameter int SLAVES = 2,
14+
parameter int MASTERS = 2,
15+
parameter bit [1:0] ENABLE_ARBITER = 2'b01,
16+
parameter int PRIORITY_WIDTH = 0,
17+
parameter int WEIGHT_WIDTH = 0,
18+
parameter pzbcm_arbiter_weight_list WEIGHT = '1,
19+
parameter bit EXTERNAL_DECODE = 0,
20+
parameter pzbcm_selector_type SELECTOR_TYPE = PZBCM_SELECTOR_BINARY,
21+
parameter int SELECT_WIDTH = calc_select_width(SELECTOR_TYPE, SLAVES),
22+
parameter int SELECT_LSB = BUS_CONFIG.id_width - SELECT_WIDTH,
23+
parameter bit SLAVE_FIFO = 0,
24+
parameter bit MASTER_FIFO = 0,
25+
parameter int RESPONSE_DEPTH = 2,
26+
parameter bit SVA_CHECKER = 1
27+
)(
28+
input var i_clk,
29+
input var i_rst_n,
30+
input var pzbcm_arbiter_config i_arbiter_config,
31+
output var [MASTERS-1:0][BUS_CONFIG.id_width-1:0] o_sid,
32+
output var [MASTERS-1:0][SELECT_WIDTH-1:0] i_select,
33+
interface.response_slave slave_if[SLAVES],
34+
interface.response_master master_if[MASTERS]
35+
);
36+
localparam int TOTAL = SLAVES * MASTERS;
37+
38+
pzcorebus_response_if #(BUS_CONFIG) slave_switch_if[TOTAL]();
39+
pzcorebus_response_if #(BUS_CONFIG) master_switch_if[TOTAL]();
40+
41+
for (genvar i = 0;i < SLAVES;++i) begin : g_slave_switch
42+
pzcorebus_response_1_to_m_switch #(
43+
.BUS_CONFIG (BUS_CONFIG ),
44+
.MASTERS (MASTERS ),
45+
.ENABLE_ARBITER (ENABLE_ARBITER ),
46+
.PRIORITY_WIDTH (PRIORITY_WIDTH ),
47+
.WEIGHT_WIDTH (WEIGHT_WIDTH ),
48+
.WEIGHT (WEIGHT ),
49+
.SLAVE_FIFO (SLAVE_FIFO ),
50+
.MASTER_FIFO (0 )
51+
.RESPONSE_DEPTH (RESPONSE_DEPTH ),
52+
.SVA_CHECKER (0 )
53+
) u_switch (
54+
.i_clk (i_clk ),
55+
.i_rst_n (i_rst_n ),
56+
.i_arbiter_config (i_arbiter_config ),
57+
.slave_if (slave_if[i] ),
58+
.master_if (slave_switch_if[MASTERS*i:MASTERS*(i+1)-1] )
59+
);
60+
end
61+
62+
pzcorebus_response_transposer #(
63+
.M (SLAVES ),
64+
.N (MASTERS )
65+
) u_transposer (
66+
.slave_if (slave_switch_if ),
67+
.master_if (master_switch_if )
68+
);
69+
70+
for (genvar i = 0;i < MASTERS;++i) begin : g_master_switch
71+
pzcorebus_response_m_to_1_switch #(
72+
.BUS_CONFIG (BUS_CONFIG ),
73+
.SLAVES (SLAVES ),
74+
.EXTERNAL_DECODE (EXTERNAL_DECODE ),
75+
.SELECTOR_TYPE (SELECTOR_TYPE ),
76+
.SELECT_WIDTH (SELECT_WIDTH ),
77+
.SELECT_LSB (SELECT_LSB ),
78+
.SLAVE_FIFO (0 ),
79+
.MASTER_FIFO (MASTER_FIFO ),
80+
.RESPONSE_DEPTH (RESPONSE_DEPTH ),
81+
.SVA_CHECKER (SVA_CHECKER )
82+
) u_switch (
83+
.i_clk (i_clk ),
84+
.i_rst_n (i_rst_n ),
85+
.o_sid (o_sid[i] ),
86+
.i_select (i_select[i] ),
87+
.o_response_ack (),
88+
.slave_if (master_switch_if[SLAVES*i:SLAVES*(i+1)-1] ),
89+
.master_if (master_if[i] )
90+
);
91+
end
92+
endmodule
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
##========================================
2+
##
3+
## Copyright (c) 2024 PEZY Computing, K.K.
4+
## All Rights Reserved.
5+
##
6+
##========================================
7+
file_list 'pzcorebus_common/pzcorebus_common.list.rb'
8+
file_list 'pzcorebus_1_to_m_switch/pzcorebus_1_to_m_switch.list.rb'
9+
file_list 'pzcorebus_m_to_1_switch/pzcorebus_m_to_1_switch.list.rb'
10+
source_file 'pzcorebus_request_xbar_switch.sv'
11+
source_file 'pzcorebus_response_xbar_switch.sv'
12+
source_file 'pzcorebus_xbar_switch.sv'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
//========================================
2+
//
3+
// Copyright (c) 2024 PEZY Computing, K.K.
4+
// All Rights Reserved.
5+
//
6+
//========================================
7+
module pzcorebus_xbar_switch
8+
import pzcorebus_pkg::,
9+
pzbcm_arbiter_pkg::*,
10+
pzbcm_selector_pkg::*;
11+
#(
12+
parameter pzcorebus_config BUS_CONFIG = 0,
13+
parameter int SLAVES = 2,
14+
parameter int MASTERS = 2,
15+
parameter bit EXTERNAL_DECODE = 0,
16+
parameter pzbcm_selector_type SELECTOR_TYPE = PZBCM_SELECTOR_BINARY,
17+
parameter bit REQUEST_EXTERNAL_DECODE = EXTERNAL_DECODE,
18+
parameter pzbcm_selector_type REQUEST_SELECTOR_TYPE = SELECTOR_TYPE,
19+
parameter int REQUEST_SELECT_WIDTH = calc_select_width(REQUEST_SELECTOR_TYPE, MASTERS),
20+
parameter int REQUEST_SELECT_LSB = BUS_CONFIG.address_width - REQUEST_SELECT_WIDTH,
21+
parameter bit RESPONSE_EXTERNAL_DECODE = EXTERNAL_DECODE,
22+
parameter pzbcm_selector_type RESPONSE_SELECTOR_TYPE = SELECTOR_TYPE,
23+
parameter int RESPONSE_SELECT_WIDTH = calc_select_width(RESPONSE_SELECTOR_TYPE, SLAVES),
24+
parameter int RESPONSE_SELECT_LSB = BUS_CONFIG.id_width - RESPONSE_SELECT_WIDTH,
25+
parameter bit [1:0] ENABLE_ARBITER = 2'b01,
26+
parameter bit [1:0] REQUEST_ENABLE_ARBITER = ENABLE_ARBITER,
27+
parameter int REQUEST_PRIORITY_WIDTH = 0,
28+
parameter int REQUEST_WEIGHT_WIDTH = 0,
29+
parameter pzbcm_arbiter_weight_list REQUEST_WEIGHT = '1,
30+
parameter bit [1:0] RESPONSE_ENABLE_ARBITER = ENABLE_ARBITER,
31+
parameter int RESPONSE_PRIORITY_WIDTH = 0,
32+
parameter int RESPONSE_WEIGHT_WIDTH = 0,
33+
parameter pzbcm_arbiter_weight_list RESPONSE_WEIGHT = '1,
34+
parameter bit WAIT_FOR_DATA = 0,
35+
parameter bit WAIT_FOR_DATA_LAST = 0,
36+
parameter bit ENABLE_BROADCAST = 0,
37+
parameter bit ALIGN_OUT = 0,
38+
parameter bit [1:0] SLAVE_FIFO = '0,
39+
parameter bit [1:0] MASTER_FIFO = '0,
40+
parameter int COMMAND_DEPTH = 2,
41+
parameter int DATA_DEPTH = 2,
42+
parameter int RESPONSE_DEPTH = 2,
43+
parameter bit SVA_CHECKER = 1,
44+
parameter bit REQUEST_SVA_CHECKER = SVA_CHECKER,
45+
parameter bit RESPONSE_SVA_CHECKER = SVA_CHECKER
46+
)(
47+
input var i_clk,
48+
input var i_rst_n,
49+
output var pzcorebus_command [SLAVES-1:0] o_mcmd,
50+
input var [SLAVES-1:0][REQUEST_SELECT_WIDTH-1:0] i_request_select,
51+
input var pzbcm_arbiter_config i_request_arbiter_config,
52+
output var [MASTERS-1:0][BUS_CONFIG.id_width-1:0] o_sid,
53+
input var [MASTERS-1:0][RESPONSE_SELECT_WIDTH-1:0] i_response_select,
54+
input var pzbcm_arbiter_config i_response_arbiter_config,
55+
pzcorebus_if.slave slave_if[SLAVES],
56+
pzcorebus_if.master master_if[MASTERS]
57+
);
58+
pzcorebus_if #(BUS_CONFIG) slave_bus_if[SLAVES]();
59+
pzcorebus_if #(BUS_CONFIG) master_bus_if[MASTERS]();
60+
61+
pzcorebus_array_connector #(
62+
.N (SLAVES )
63+
) u_slave_connector (
64+
.slave_if (slave_if ),
65+
.master_if (slave_bus_if )
66+
);
67+
68+
pzcorebus_request_xbar_switch #(
69+
.BUS_CONFIG (BUS_CONFIG ),
70+
.SLAVES (SLAVES ),
71+
.MASTERS (MASTERS ),
72+
.EXTERNAL_DECODE (REQUEST_EXTERNAL_DECODE ),
73+
.SELECTOR_TYPE (REQUEST_SELECTOR_TYPE ),
74+
.SELECT_WIDTH (REQUEST_SELECT_WIDTH ),
75+
.SELECT_LSB (REQUEST_SELECT_LSB ),
76+
.ENABLE_ARBITER (REQUEST_ENABLE_ARBITER ),
77+
.PRIORITY_WIDTH (REQUEST_PRIORITY_WIDTH ),
78+
.WEIGHT_WIDTH (REQUEST_WEIGHT_WIDTH ),
79+
.WEIGHT (REQUEST_WEIGHT ),
80+
.WAIT_FOR_DATA (WAIT_FOR_DATA ),
81+
.WAIT_FOR_DATA_LAST (WAIT_FOR_DATA_LAST ),
82+
.ENABLE_BROADCAST (ENABLE_BROADCAST ),
83+
.SLAVE_FIFO (SLAVE_FIFO[0] ),
84+
.MASTER_FIFO (MASTER_FIFO[0] ),
85+
.COMMAND_DEPTH (COMMAND_DEPTH ),
86+
.DATA_DEPTH (DATA_DEPTH ),
87+
.ALIGN_OUT (ALIGN_OUT ),
88+
.SVA_CHECKER (REQUEST_SVA_CHECKER )
89+
) u_request_xbar_switch (
90+
.i_clk (i_clk ),
91+
.i_rst_n (i_rst_n ),
92+
.o_mcmd (o_mcmd ),
93+
.i_select (i_request_select ),
94+
.i_arbiter_config (i_request_arbiter_config ),
95+
.slave_if (slave_bus_if ),
96+
.master_if (master_bus_if )
97+
);
98+
99+
pzcorebus_response_xbar_switch #(
100+
.BUS_CONFIG (BUS_CONFIG ),
101+
.SLAVES (SLAVES ),
102+
.MASTERS (MASTERS ),
103+
.ENABLE_ARBITER (RESPONSE_ENABLE_ARBITER ),
104+
.PRIORITY_WIDTH (RESPONSE_PRIORITY_WIDTH ),
105+
.WEIGHT_WIDTH (RESPONSE_WEIGHT_WIDTH ),
106+
.WEIGHT (RESPONSE_WEIGHT ),
107+
.EXTERNAL_DECODE (RESPONSE_EXTERNAL_DECODE ),
108+
.SELECTOR_TYPE (RESPONSE_SELECTOR_TYPE ),
109+
.SELECT_WIDTH (RESPONSE_SELECT_WIDTH ),
110+
.SELECT_LSB (RESPONSE_SELECT_LSB ),
111+
.SLAVE_FIFO (SLAVE_FIFO[1] ),
112+
.MASTER_FIFO (MASTER_FIFO[1] ),
113+
.RESPONSE_DEPTH (RESPONSE_DEPTH ),
114+
.SVA_CHECKER (RESPONSE_SVA_CHECKER )
115+
) u_response_xbar_switch (
116+
.i_clk (i_clk ),
117+
.i_rst_n (i_rst_n ),
118+
.i_arbiter_config (i_response_arbiter_config ),
119+
.o_sid (o_sid ),
120+
.i_select (i_response_select ),
121+
.slave_if (slave_bus_if ),
122+
.master_if (master_bus_if )
123+
);
124+
125+
pzcorebus_array_connector #(
126+
.N (MASTERS )
127+
) u_master_connector (
128+
.slave_if (master_bus_if ),
129+
.master_if (master_if )
130+
);
131+
endmodule

0 commit comments

Comments
 (0)