|
| 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