lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 1 | // Copyright lowRISC contributors. |
| 2 | // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| 3 | // SPDX-License-Identifier: Apache-2.0 |
| 4 | // |
| 5 | // xbar_${xbar.name} module generated by `tlgen.py` tool |
| 6 | // all reset signals should be generated from one reset signal to not make any deadlock |
| 7 | // |
| 8 | // Interconnect |
Eunchan Kim | c745294 | 2019-12-19 17:04:37 -0800 | [diff] [blame] | 9 | <% |
| 10 | import tlgen.lib as lib |
| 11 | %>\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 12 | % for host in xbar.hosts: |
| 13 | ${xbar.repr_tree(host, 0)} |
| 14 | % endfor |
| 15 | |
| 16 | module xbar_${xbar.name} ( |
Timothy Chen | 09d859b | 2019-11-08 14:01:12 -0800 | [diff] [blame] | 17 | % for c in xbar.clocks: |
| 18 | input ${c}, |
| 19 | % endfor |
| 20 | % for r in xbar.resets: |
| 21 | input ${r}, |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 22 | % endfor |
| 23 | |
| 24 | // Host interfaces |
| 25 | % for node in xbar.hosts: |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 26 | input tlul_pkg::tl_h2d_t tl_${node.name.replace('.', '__')}_i, |
| 27 | output tlul_pkg::tl_d2h_t tl_${node.name.replace('.', '__')}_o, |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 28 | % endfor |
| 29 | |
| 30 | // Device interfaces |
| 31 | % for node in xbar.devices: |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 32 | output tlul_pkg::tl_h2d_t tl_${node.name.replace('.', '__')}_o, |
| 33 | input tlul_pkg::tl_d2h_t tl_${node.name.replace('.', '__')}_i, |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 34 | % endfor |
| 35 | |
Timothy Chen | f4d5e9a | 2021-11-09 13:41:04 -0800 | [diff] [blame] | 36 | input prim_mubi_pkg::mubi4_t scanmode_i |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 37 | ); |
| 38 | |
| 39 | import tlul_pkg::*; |
| 40 | import tl_${xbar.name}_pkg::*; |
| 41 | |
Michael Schaffner | 1ba89b8 | 2019-11-03 14:25:54 -0800 | [diff] [blame] | 42 | // scanmode_i is currently not used, but provisioned for future use |
| 43 | // this assignment prevents lint warnings |
Timothy Chen | f4d5e9a | 2021-11-09 13:41:04 -0800 | [diff] [blame] | 44 | logic unused_scanmode; |
| 45 | assign unused_scanmode = ^scanmode_i; |
Michael Schaffner | 1ba89b8 | 2019-11-03 14:25:54 -0800 | [diff] [blame] | 46 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 47 | % for block in xbar.nodes: |
| 48 | ## Create enum type for Upstream and Downstream ports connection |
| 49 | % if block.node_type.name == "ASYNC_FIFO": |
| 50 | ## One US, one DS |
| 51 | tl_h2d_t tl_${block.name}_us_h2d ; |
| 52 | tl_d2h_t tl_${block.name}_us_d2h ; |
| 53 | tl_h2d_t tl_${block.name}_ds_h2d ; |
| 54 | tl_d2h_t tl_${block.name}_ds_d2h ; |
| 55 | |
| 56 | % elif block.node_type.name == "SOCKET_1N": |
| 57 | ## One US, multiple DS |
| 58 | tl_h2d_t tl_${block.name}_us_h2d ; |
| 59 | tl_d2h_t tl_${block.name}_us_d2h ; |
| 60 | |
| 61 | ##typedef enum int { |
| 62 | ## % for port in block.ds: |
| 63 | ## % if loop.last: |
| 64 | ## % else: |
| 65 | ## % endif |
| 66 | ## % endfor |
| 67 | ##} socket_${block.name}_ds_e; |
| 68 | |
| 69 | tl_h2d_t tl_${block.name}_ds_h2d [${len(block.ds)}]; |
| 70 | tl_d2h_t tl_${block.name}_ds_d2h [${len(block.ds)}]; |
| 71 | |
| 72 | // Create steering signal |
| 73 | logic [${len(block.ds).bit_length()-1}:0] dev_sel_${block.name}; |
| 74 | |
| 75 | % elif block.node_type.name == "SOCKET_M1": |
| 76 | ## Multiple US, one DS |
| 77 | ## typedef enum int { |
| 78 | ## % for port in block.us: |
| 79 | ## % if loop.last: |
| 80 | ## % else: |
| 81 | ## % endif |
| 82 | ## % endfor |
| 83 | ## } socket_${block.name}_us_e; |
| 84 | |
| 85 | tl_h2d_t tl_${block.name}_us_h2d [${len(block.us)}]; |
| 86 | tl_d2h_t tl_${block.name}_us_d2h [${len(block.us)}]; |
| 87 | |
| 88 | tl_h2d_t tl_${block.name}_ds_h2d ; |
| 89 | tl_d2h_t tl_${block.name}_ds_d2h ; |
| 90 | |
| 91 | % else: |
| 92 | ## block is either HOST or DEVICE. Ignore |
| 93 | % endif |
| 94 | % endfor |
| 95 | |
| 96 | % for conn in xbar.edges: |
| 97 | ## sweep each entry of edges and find each end (us, ds) then connect between |
| 98 | ## Connect upstream |
| 99 | <% |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 100 | ds_name = conn.ds.name.replace('.', '__') |
| 101 | us_name = conn.us.name.replace('.', '__') |
| 102 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 103 | if conn.ds.node_type.name == "ASYNC_FIFO": |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 104 | ds_h2d_name = 'tl_' + ds_name + '_us_h2d' |
| 105 | ds_d2h_name = 'tl_' + ds_name + '_us_d2h' |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 106 | ds_index = -1 |
| 107 | elif conn.ds.node_type.name == "SOCKET_1N": |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 108 | ds_h2d_name = 'tl_' + ds_name + '_us_h2d' |
| 109 | ds_d2h_name = 'tl_' + ds_name + '_us_d2h' |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 110 | ds_index = -1 |
| 111 | elif conn.ds.node_type.name == "SOCKET_M1": |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 112 | ds_h2d_name = 'tl_' + ds_name + '_us_h2d' |
| 113 | ds_d2h_name = 'tl_' + ds_name + '_us_d2h' |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 114 | ds_index = conn.ds.us.index(conn) |
| 115 | elif conn.ds.node_type.name == "DEVICE": |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 116 | ds_h2d_name = 'tl_' + ds_name + '_o' |
| 117 | ds_d2h_name = 'tl_' + ds_name + '_i' |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 118 | ds_index = -1 |
| 119 | |
| 120 | if conn.us.node_type.name == "ASYNC_FIFO": |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 121 | us_h2d_name = 'tl_' + us_name + '_ds_h2d' |
| 122 | us_d2h_name = 'tl_' + us_name + '_ds_d2h' |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 123 | us_index = -1 |
| 124 | elif conn.us.node_type.name == "SOCKET_1N": |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 125 | us_h2d_name = 'tl_' + us_name + '_ds_h2d' |
| 126 | us_d2h_name = 'tl_' + us_name + '_ds_d2h' |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 127 | us_index = conn.us.ds.index(conn) |
| 128 | elif conn.us.node_type.name == "SOCKET_M1": |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 129 | us_h2d_name = 'tl_' + us_name + '_ds_h2d' |
| 130 | us_d2h_name = 'tl_' + us_name + '_ds_d2h' |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 131 | us_index = -1 |
| 132 | elif conn.us.node_type.name == "HOST": |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 133 | us_h2d_name = 'tl_' + us_name + '_i' |
| 134 | us_d2h_name = 'tl_' + us_name + '_o' |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 135 | us_index = -1 |
| 136 | %>\ |
| 137 | |
| 138 | % if us_index == -1 and ds_index == -1: |
| 139 | assign ${ds_h2d_name} = ${us_h2d_name}; |
| 140 | assign ${us_d2h_name} = ${ds_d2h_name}; |
| 141 | % elif us_index == -1 and ds_index != -1: |
| 142 | assign ${ds_h2d_name}[${ds_index}] = ${us_h2d_name}; |
| 143 | assign ${us_d2h_name} = ${ds_d2h_name}[${ds_index}]; |
| 144 | % elif us_index != -1 and ds_index == -1: |
| 145 | assign ${ds_h2d_name} = ${us_h2d_name}[${us_index}]; |
| 146 | assign ${us_d2h_name}[${us_index}] = ${ds_d2h_name}; |
| 147 | % else: |
| 148 | assign ${ds_h2d_name}[${ds_index}] = ${us_h2d_name}[${us_index}]; |
| 149 | assign ${us_d2h_name}[${us_index}] = ${ds_d2h_name}[${ds_index}]; |
| 150 | % endif |
| 151 | % endfor |
| 152 | |
| 153 | % for block in xbar.socket_1ns: |
| 154 | <% |
| 155 | addr_sig = "tl_" + block.name + "_us_h2d.a_address" |
| 156 | sel_len = len(block.ds).bit_length() |
| 157 | %>\ |
| 158 | always_comb begin |
| 159 | // default steering to generate error response if address is not within the range |
| 160 | dev_sel_${block.name} = ${"%d'd%d" % (sel_len, len(block.ds))}; |
| 161 | % for i in block.ds: |
| 162 | <% |
| 163 | leaf = xbar.get_leaf_from_s1n(block, loop.index); |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 164 | leaf_name = leaf.name.upper().replace('.', '__') |
| 165 | |
| 166 | name_space = "ADDR_SPACE_" + leaf_name; |
| 167 | name_mask = "ADDR_MASK_" + leaf_name; |
Eunchan Kim | c745294 | 2019-12-19 17:04:37 -0800 | [diff] [blame] | 168 | prefix = "if (" if loop.first else "end else if (" |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 169 | %>\ |
Eunchan Kim | c745294 | 2019-12-19 17:04:37 -0800 | [diff] [blame] | 170 | % if len(leaf.addr_range) == 1: |
| 171 | % if lib.is_pow2((leaf.addr_range[0][1]-leaf.addr_range[0][0])+1): |
Michael Schaffner | dcb0de1 | 2021-03-08 10:58:29 -0800 | [diff] [blame] | 172 | ${prefix}(${addr_sig} & |
| 173 | ${" " * len(prefix)} ~(${name_mask})) == ${name_space}) begin |
Eunchan Kim | c745294 | 2019-12-19 17:04:37 -0800 | [diff] [blame] | 174 | % else: |
Timothy Chen | 3b81284 | 2020-01-09 10:38:02 -0800 | [diff] [blame] | 175 | ${prefix}((${addr_sig} <= (${name_mask} + ${name_space})) && |
| 176 | (${addr_sig} >= ${name_space}))) begin |
Eunchan Kim | c745294 | 2019-12-19 17:04:37 -0800 | [diff] [blame] | 177 | % endif |
Timothy Chen | 3b81284 | 2020-01-09 10:38:02 -0800 | [diff] [blame] | 178 | dev_sel_${block.name} = ${"%d'd%d" % (sel_len, loop.index)}; |
Michael Schaffner | d4d5d2f | 2020-04-17 15:45:55 -0700 | [diff] [blame] | 179 | ${"end" if loop.last else ""} |
Eunchan Kim | c745294 | 2019-12-19 17:04:37 -0800 | [diff] [blame] | 180 | % else: |
| 181 | ## Xbar device port |
| 182 | <% |
| 183 | num_range = len(leaf.addr_range) |
| 184 | %>\ |
| 185 | ${prefix} |
| 186 | % for i in range(num_range): |
| 187 | % if lib.is_pow2(leaf.addr_range[i][1]-leaf.addr_range[0][0]+1): |
| 188 | ((${addr_sig} & ~(${name_mask}[${i}])) == ${name_space}[${i}])${" ||" if not loop.last else ""} |
| 189 | % else: |
| 190 | ((${addr_sig} <= (${name_mask}[${i}] + ${name_space}[${i}])) && |
| 191 | (${addr_sig} >= ${name_space}[${i}]))${" ||" if not loop.last else ""} |
| 192 | % endif |
| 193 | % endfor |
| 194 | ) begin |
| 195 | dev_sel_${block.name} = ${"%d'd%d" % (sel_len, loop.index)}; |
Michael Schaffner | d4d5d2f | 2020-04-17 15:45:55 -0700 | [diff] [blame] | 196 | ${"end" if loop.last else ""} |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 197 | % endif |
| 198 | % endfor |
| 199 | end |
| 200 | |
| 201 | % endfor |
| 202 | |
| 203 | // Instantiation phase |
| 204 | % for block in xbar.nodes: |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 205 | <% |
| 206 | stripped_name = block.name.replace('.', '__') |
| 207 | %>\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 208 | % if block.node_type.name == "ASYNC_FIFO": |
| 209 | tlul_fifo_async #( |
Tom Roberts | a8bbb2e | 2021-01-22 15:19:14 +0000 | [diff] [blame] | 210 | .ReqDepth (4),// At least 4 to make async work |
| 211 | .RspDepth (4) // At least 4 to make async work |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 212 | ) u_${stripped_name} ( |
Timothy Chen | 09d859b | 2019-11-08 14:01:12 -0800 | [diff] [blame] | 213 | .clk_h_i (${block.clocks[0]}), |
| 214 | .rst_h_ni (${block.resets[0]}), |
| 215 | .clk_d_i (${block.clocks[1]}), |
| 216 | .rst_d_ni (${block.resets[1]}), |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 217 | .tl_h_i (tl_${stripped_name}_us_h2d), |
| 218 | .tl_h_o (tl_${stripped_name}_us_d2h), |
| 219 | .tl_d_o (tl_${stripped_name}_ds_h2d), |
| 220 | .tl_d_i (tl_${stripped_name}_ds_d2h) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 221 | ); |
| 222 | % elif block.node_type.name == "SOCKET_1N": |
| 223 | tlul_socket_1n #( |
Timothy Chen | 1299fa1 | 2022-03-22 18:21:02 -0700 | [diff] [blame] | 224 | % if block.hreq_pass != 1: |
| 225 | .HReqPass (1'b${block.hreq_pass}), |
| 226 | % endif |
| 227 | % if block.hrsp_pass != 1: |
| 228 | .HRspPass (1'b${block.hrsp_pass}), |
Timothy Chen | 61e25e8 | 2019-09-13 14:04:10 -0700 | [diff] [blame] | 229 | % endif |
| 230 | % if block.hdepth != 2: |
| 231 | .HReqDepth (4'h${block.hdepth}), |
| 232 | .HRspDepth (4'h${block.hdepth}), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 233 | % endif |
Timothy Chen | 1299fa1 | 2022-03-22 18:21:02 -0700 | [diff] [blame] | 234 | % if block.dreq_pass != 2**(len(block.ds)) -1: |
| 235 | .DReqPass (${len(block.ds)}'h${"%x" % block.dreq_pass}), |
| 236 | % endif |
| 237 | % if block.drsp_pass != 2**(len(block.ds)) -1: |
| 238 | .DRspPass (${len(block.ds)}'h${"%x" % block.drsp_pass}), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 239 | % endif |
Timothy Chen | a37d6e4 | 2020-06-18 11:43:20 -0700 | [diff] [blame] | 240 | % if block.ddepth != 2: |
| 241 | .DReqDepth (${len(block.ds)*4}'h${"%x" % block.ddepth}), |
| 242 | .DRspDepth (${len(block.ds)*4}'h${"%x" % block.ddepth}), |
Timothy Chen | 61e25e8 | 2019-09-13 14:04:10 -0700 | [diff] [blame] | 243 | % endif |
| 244 | .N (${len(block.ds)}) |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 245 | ) u_${stripped_name} ( |
Timothy Chen | 09d859b | 2019-11-08 14:01:12 -0800 | [diff] [blame] | 246 | .clk_i (${block.clocks[0]}), |
| 247 | .rst_ni (${block.resets[0]}), |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 248 | .tl_h_i (tl_${stripped_name}_us_h2d), |
| 249 | .tl_h_o (tl_${stripped_name}_us_d2h), |
| 250 | .tl_d_o (tl_${stripped_name}_ds_h2d), |
| 251 | .tl_d_i (tl_${stripped_name}_ds_d2h), |
| 252 | .dev_select_i (dev_sel_${stripped_name}) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 253 | ); |
| 254 | % elif block.node_type.name == "SOCKET_M1": |
| 255 | tlul_socket_m1 #( |
Timothy Chen | 1299fa1 | 2022-03-22 18:21:02 -0700 | [diff] [blame] | 256 | % if block.hreq_pass != 2**(len(block.us)) - 1: |
| 257 | .HReqPass (${len(block.us)}'h${"%x" % block.hreq_pass}), |
| 258 | % endif |
| 259 | % if block.hrsp_pass != 2**(len(block.us)) - 1: |
| 260 | .HRspPass (${len(block.us)}'h${"%x" % block.hrsp_pass}), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 261 | % endif |
Timothy Chen | 61e25e8 | 2019-09-13 14:04:10 -0700 | [diff] [blame] | 262 | % if block.hdepth != 2: |
Timothy Chen | a37d6e4 | 2020-06-18 11:43:20 -0700 | [diff] [blame] | 263 | .HReqDepth (${len(block.us)*4}'h${"%x" % block.hdepth}), |
| 264 | .HRspDepth (${len(block.us)*4}'h${"%x" % block.hdepth}), |
Timothy Chen | 61e25e8 | 2019-09-13 14:04:10 -0700 | [diff] [blame] | 265 | % endif |
Timothy Chen | 1299fa1 | 2022-03-22 18:21:02 -0700 | [diff] [blame] | 266 | % if block.dreq_pass != 1: |
| 267 | .DReqPass (1'b${block.dreq_pass}), |
| 268 | % endif |
| 269 | % if block.drsp_pass != 1: |
| 270 | .DRspPass (1'b${block.drsp_pass}), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 271 | % endif |
Timothy Chen | a37d6e4 | 2020-06-18 11:43:20 -0700 | [diff] [blame] | 272 | % if block.ddepth != 2: |
| 273 | .DReqDepth (4'h${block.ddepth}), |
| 274 | .DRspDepth (4'h${block.ddepth}), |
| 275 | % endif |
Timothy Chen | 61e25e8 | 2019-09-13 14:04:10 -0700 | [diff] [blame] | 276 | .M (${len(block.us)}) |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 277 | ) u_${stripped_name} ( |
Timothy Chen | 09d859b | 2019-11-08 14:01:12 -0800 | [diff] [blame] | 278 | .clk_i (${block.clocks[0]}), |
| 279 | .rst_ni (${block.resets[0]}), |
Rupert Swarbrick | a5e687f | 2021-03-01 11:51:41 +0000 | [diff] [blame] | 280 | .tl_h_i (tl_${stripped_name}_us_h2d), |
| 281 | .tl_h_o (tl_${stripped_name}_us_d2h), |
| 282 | .tl_d_o (tl_${stripped_name}_ds_h2d), |
| 283 | .tl_d_i (tl_${stripped_name}_ds_d2h) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 284 | ); |
| 285 | % endif |
| 286 | % endfor |
| 287 | |
| 288 | endmodule |