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 |
Michael Schaffner | 7b0807d | 2020-10-27 19:54:52 -0700 | [diff] [blame] | 4 | ${gencmd} |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 5 | <% |
| 6 | import re |
| 7 | import topgen.lib as lib |
| 8 | |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 9 | num_mio_inputs = sum([x["width"] for x in top["pinmux"]["inputs"]]) |
| 10 | num_mio_outputs = sum([x["width"] for x in top["pinmux"]["outputs"]]) |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 11 | num_mio = top["pinmux"]["num_mio"] |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 12 | |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 13 | num_dio_inputs = sum([x["width"] if x["type"] == "input" else 0 for x in top["pinmux"]["dio"]]) |
| 14 | num_dio_outputs = sum([x["width"] if x["type"] == "output" else 0 for x in top["pinmux"]["dio"]]) |
| 15 | num_dio_inouts = sum([x["width"] if x["type"] == "inout" else 0 for x in top["pinmux"]["dio"]]) |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 16 | num_dio = sum([x["width"] if "width" in x else 1 for x in top["pinmux"]["dio"]]) |
| 17 | |
Eunchan Kim | 1d5bbcc | 2020-04-27 20:51:38 -0700 | [diff] [blame] | 18 | num_im = sum([x["width"] if "width" in x else 1 for x in top["inter_signal"]["external"]]) |
| 19 | |
Michael Schaffner | b5b8eba | 2021-02-09 20:07:04 -0800 | [diff] [blame] | 20 | max_miolength = max([len(x["name"]) for x in top["pinmux"]["inputs"] + top["pinmux"]["outputs"]]) |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 21 | max_diolength = max([len(x["name"]) for x in top["pinmux"]["dio"]]) |
| 22 | |
Michael Schaffner | b5b8eba | 2021-02-09 20:07:04 -0800 | [diff] [blame] | 23 | max_sigwidth = max([x["width"] if "width" in x else 1 for x in top["pinmux"]["inputs"] + top["pinmux"]["outputs"]]) |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 24 | max_sigwidth = len("{}".format(max_sigwidth)) |
| 25 | |
Timothy Chen | 0550d69 | 2020-04-20 17:19:35 -0700 | [diff] [blame] | 26 | clks_attr = top['clocks'] |
Timothy Chen | f56c1b5 | 2020-04-28 17:00:43 -0700 | [diff] [blame] | 27 | cpu_clk = top['clocks']['hier_paths']['top'] + "clk_proc_main" |
| 28 | cpu_rst = top["reset_paths"]["sys"] |
| 29 | dm_rst = top["reset_paths"]["lc"] |
Michael Schaffner | be5cb9c | 2020-11-19 19:53:47 -0800 | [diff] [blame] | 30 | esc_clk = top['clocks']['hier_paths']['top'] + "clk_io_div4_timers" |
| 31 | esc_rst = top["reset_paths"]["sys_io_div4"] |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 32 | |
| 33 | unused_resets = lib.get_unused_resets(top) |
Timothy Chen | 90b8242 | 2021-02-03 23:45:21 -0800 | [diff] [blame] | 34 | unused_im_defs, undriven_im_defs = lib.get_dangling_im_def(top["inter_signal"]["definitions"]) |
| 35 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 36 | %>\ |
Eunchan Kim | 632c6f7 | 2019-09-30 11:11:51 -0700 | [diff] [blame] | 37 | module top_${top["name"]} #( |
Pirmin Vogel | 15e1b91 | 2020-09-16 14:43:22 +0200 | [diff] [blame] | 38 | // Auto-inferred parameters |
| 39 | % for m in top["module"]: |
Timothy Chen | 9443221 | 2021-03-01 22:29:18 -0800 | [diff] [blame] | 40 | % if not lib.is_inst(m): |
| 41 | <% continue %> |
| 42 | % endif |
Rupert Swarbrick | 611a642 | 2021-02-12 11:56:48 +0000 | [diff] [blame] | 43 | % for p_exp in filter(lambda p: p.get("expose") == "true", m["param_list"]): |
Pirmin Vogel | c32adb3 | 2020-09-21 14:13:27 +0200 | [diff] [blame] | 44 | parameter ${p_exp["type"]} ${p_exp["name_top"]} = ${p_exp["default"]}, |
Pirmin Vogel | 15e1b91 | 2020-09-16 14:43:22 +0200 | [diff] [blame] | 45 | % endfor |
| 46 | % endfor |
| 47 | |
| 48 | // Manually defined parameters |
Pirmin Vogel | 4eb2502 | 2020-08-27 15:27:33 +0200 | [diff] [blame] | 49 | parameter ibex_pkg::regfile_e IbexRegFile = ibex_pkg::RegFileFF, |
Tom Roberts | 7824ccc | 2020-11-05 11:34:03 +0000 | [diff] [blame] | 50 | parameter bit IbexICache = 1, |
Philipp Wagner | a37bcfa | 2020-05-19 22:46:41 +0100 | [diff] [blame] | 51 | parameter bit IbexPipeLine = 0, |
| 52 | parameter BootRomInitFile = "" |
Timothy Chen | 7ff5312 | 2019-09-19 15:20:43 -0700 | [diff] [blame] | 53 | ) ( |
Timothy Chen | 79972ad | 2020-06-30 17:13:49 -0700 | [diff] [blame] | 54 | // Reset, clocks defined as part of intermodule |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 55 | input rst_ni, |
| 56 | |
| 57 | // JTAG interface |
| 58 | input jtag_tck_i, |
| 59 | input jtag_tms_i, |
| 60 | input jtag_trst_ni, |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 61 | input jtag_tdi_i, |
| 62 | output jtag_tdo_o, |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 63 | |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 64 | % if num_mio != 0: |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 65 | // Multiplexed I/O |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 66 | input ${lib.bitarray(num_mio, max_sigwidth)} mio_in_i, |
| 67 | output logic ${lib.bitarray(num_mio, max_sigwidth)} mio_out_o, |
| 68 | output logic ${lib.bitarray(num_mio, max_sigwidth)} mio_oe_o, |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 69 | % endif |
| 70 | % if num_dio != 0: |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 71 | // Dedicated I/O |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 72 | input ${lib.bitarray(num_dio, max_sigwidth)} dio_in_i, |
| 73 | output logic ${lib.bitarray(num_dio, max_sigwidth)} dio_out_o, |
| 74 | output logic ${lib.bitarray(num_dio, max_sigwidth)} dio_oe_o, |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 75 | % endif |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 76 | |
Michael Schaffner | 43ce8d5 | 2021-02-10 17:04:57 -0800 | [diff] [blame] | 77 | % if "pinmux" in top: |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 78 | // pad attributes to padring |
Michael Schaffner | 43ce8d5 | 2021-02-10 17:04:57 -0800 | [diff] [blame] | 79 | output logic[pinmux_reg_pkg::NMioPads-1:0] |
| 80 | [pinmux_reg_pkg::AttrDw-1:0] mio_attr_o, |
| 81 | output logic[pinmux_reg_pkg::NDioPads-1:0] |
| 82 | [pinmux_reg_pkg::AttrDw-1:0] dio_attr_o, |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 83 | % endif |
| 84 | |
Eunchan Kim | 1d5bbcc | 2020-04-27 20:51:38 -0700 | [diff] [blame] | 85 | % if num_im != 0: |
| 86 | |
| 87 | // Inter-module Signal External type |
| 88 | % for sig in top["inter_signal"]["external"]: |
| 89 | ${"input " if sig["direction"] == "in" else "output"} ${lib.im_defname(sig)} ${lib.bitarray(sig["width"],1)} ${sig["signame"]}, |
| 90 | % endfor |
| 91 | % endif |
Timothy Chen | 5649c2a | 2021-02-08 18:32:22 -0800 | [diff] [blame] | 92 | input scan_rst_ni, // reset used for test mode |
| 93 | input scan_en_i, |
Michael Schaffner | 8bf4fe6 | 2021-02-18 12:56:08 -0800 | [diff] [blame] | 94 | input lc_ctrl_pkg::lc_tx_t scanmode_i // lc_ctrl_pkg::On for Scan |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 95 | ); |
| 96 | |
Philipp Wagner | 086b703 | 2019-10-25 17:06:15 +0100 | [diff] [blame] | 97 | // JTAG IDCODE for development versions of this code. |
| 98 | // Manufacturers of OpenTitan chips must replace this code with one of their |
| 99 | // own IDs. |
| 100 | // Field structure as defined in the IEEE 1149.1 (JTAG) specification, |
| 101 | // section 12.1.1. |
Michael Schaffner | d4d5d2f | 2020-04-17 15:45:55 -0700 | [diff] [blame] | 102 | localparam logic [31:0] JTAG_IDCODE = { |
Philipp Wagner | 086b703 | 2019-10-25 17:06:15 +0100 | [diff] [blame] | 103 | 4'h0, // Version |
| 104 | 16'h4F54, // Part Number: "OT" |
Philipp Wagner | f57964e | 2019-11-04 17:57:06 +0000 | [diff] [blame] | 105 | 11'h426, // Manufacturer Identity: Google |
Philipp Wagner | 086b703 | 2019-10-25 17:06:15 +0100 | [diff] [blame] | 106 | 1'b1 // (fixed) |
| 107 | }; |
| 108 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 109 | import tlul_pkg::*; |
| 110 | import top_pkg::*; |
| 111 | import tl_main_pkg::*; |
Michael Schaffner | 7b0807d | 2020-10-27 19:54:52 -0700 | [diff] [blame] | 112 | // Compile-time random constants |
Pirmin Vogel | 9e508bd | 2020-12-10 13:59:48 +0100 | [diff] [blame] | 113 | import top_${top["name"]}_rnd_cnst_pkg::*; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 114 | |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 115 | // Signals |
Michael Schaffner | b5b8eba | 2021-02-09 20:07:04 -0800 | [diff] [blame] | 116 | logic [${num_mio_inputs - 1}:0] mio_p2d; |
| 117 | logic [${num_mio_outputs - 1}:0] mio_d2p; |
| 118 | logic [${num_mio_outputs - 1}:0] mio_d2p_en; |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 119 | logic [${num_dio - 1}:0] dio_p2d; |
| 120 | logic [${num_dio - 1}:0] dio_d2p; |
| 121 | logic [${num_dio - 1}:0] dio_d2p_en; |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 122 | % for m in top["module"]: |
Timothy Chen | 9443221 | 2021-03-01 22:29:18 -0800 | [diff] [blame] | 123 | % if not lib.is_inst(m): |
| 124 | <% continue %> |
| 125 | % endif |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 126 | <% |
| 127 | block = name_to_block[m['type']] |
| 128 | inouts, inputs, outputs = block.xputs |
| 129 | %>\ |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 130 | // ${m["name"]} |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 131 | % for p_in in inputs + inouts: |
| 132 | logic ${lib.bitarray(p_in.bits.width(), max_sigwidth)} cio_${m["name"]}_${p_in.name}_p2d; |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 133 | % endfor |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 134 | % for p_out in outputs + inouts: |
| 135 | logic ${lib.bitarray(p_out.bits.width(), max_sigwidth)} cio_${m["name"]}_${p_out.name}_d2p; |
| 136 | logic ${lib.bitarray(p_out.bits.width(), max_sigwidth)} cio_${m["name"]}_${p_out.name}_en_d2p; |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 137 | % endfor |
| 138 | % endfor |
| 139 | |
| 140 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 141 | <% |
Eunchan Kim | 88a8615 | 2020-04-13 16:12:08 -0700 | [diff] [blame] | 142 | # Interrupt source 0 is tied to 0 to conform RISC-V PLIC spec. |
| 143 | # So, total number of interrupts are the number of entries in the list + 1 |
| 144 | interrupt_num = sum([x["width"] if "width" in x else 1 for x in top["interrupt"]]) + 1 |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 145 | %>\ |
| 146 | logic [${interrupt_num-1}:0] intr_vector; |
| 147 | // Interrupt source list |
| 148 | % for m in top["module"]: |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 149 | <% |
| 150 | block = name_to_block[m['type']] |
| 151 | %>\ |
Timothy Chen | 9443221 | 2021-03-01 22:29:18 -0800 | [diff] [blame] | 152 | % if not lib.is_inst(m): |
| 153 | <% continue %> |
| 154 | % endif |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 155 | % for intr in block.interrupts: |
| 156 | % if intr.bits.width() != 1: |
| 157 | logic [${intr.bits.width()-1}:0] intr_${m["name"]}_${intr.name}; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 158 | % else: |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 159 | logic intr_${m["name"]}_${intr.name}; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 160 | % endif |
| 161 | % endfor |
| 162 | % endfor |
| 163 | |
Michael Schaffner | 666dde1 | 2019-10-25 11:57:54 -0700 | [diff] [blame] | 164 | |
Michael Schaffner | d4d5d2f | 2020-04-17 15:45:55 -0700 | [diff] [blame] | 165 | <% add_spaces = " " * len(str((interrupt_num-1).bit_length()-1)) %> |
Michael Schaffner | 1ba89b8 | 2019-11-03 14:25:54 -0800 | [diff] [blame] | 166 | logic [0:0]${add_spaces}irq_plic; |
| 167 | logic [0:0]${add_spaces}msip; |
Eunchan Kim | 88a8615 | 2020-04-13 16:12:08 -0700 | [diff] [blame] | 168 | logic [${(interrupt_num-1).bit_length()-1}:0] irq_id[1]; |
| 169 | logic [${(interrupt_num-1).bit_length()-1}:0] unused_irq_id[1]; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 170 | |
Michael Schaffner | 1ba89b8 | 2019-11-03 14:25:54 -0800 | [diff] [blame] | 171 | // this avoids lint errors |
| 172 | assign unused_irq_id = irq_id; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 173 | |
Michael Schaffner | 666dde1 | 2019-10-25 11:57:54 -0700 | [diff] [blame] | 174 | // Alert list |
Philipp Wagner | 79725e1 | 2020-03-03 23:34:38 +0000 | [diff] [blame] | 175 | prim_alert_pkg::alert_tx_t [alert_pkg::NAlerts-1:0] alert_tx; |
| 176 | prim_alert_pkg::alert_rx_t [alert_pkg::NAlerts-1:0] alert_rx; |
Michael Schaffner | 666dde1 | 2019-10-25 11:57:54 -0700 | [diff] [blame] | 177 | |
| 178 | % if not top["alert"]: |
| 179 | for (genvar k = 0; k < alert_pkg::NAlerts; k++) begin : gen_alert_tie_off |
| 180 | // tie off if no alerts present in the system |
| 181 | assign alert_tx[k].alert_p = 1'b0; |
| 182 | assign alert_tx[k].alert_n = 1'b1; |
| 183 | end |
| 184 | % endif |
| 185 | |
Eunchan Kim | 40098a9 | 2020-04-17 12:22:36 -0700 | [diff] [blame] | 186 | ## Inter-module Definitions |
| 187 | % if len(top["inter_signal"]["definitions"]) >= 1: |
| 188 | // define inter-module signals |
| 189 | % endif |
| 190 | % for sig in top["inter_signal"]["definitions"]: |
| 191 | ${lib.im_defname(sig)} ${lib.bitarray(sig["width"],1)} ${sig["signame"]}; |
| 192 | % endfor |
| 193 | |
Timothy Chen | 075ed37 | 2021-02-04 14:42:29 -0800 | [diff] [blame] | 194 | ## Mixed connection to port |
| 195 | ## Index greater than 0 means a port is assigned to an inter-module array |
| 196 | ## whereas an index of 0 means a port is directly driven by a module |
| 197 | // define mixed connection to port |
| 198 | % for port in top['inter_signal']['external']: |
| 199 | % if port['index'] > 0: |
| 200 | % if port['direction'] == 'in': |
| 201 | assign ${port['netname']}[${port['index']}] = ${port['signame']}; |
| 202 | % else: |
| 203 | assign ${port['signame']} = ${port['netname']}[${port['index']}]; |
| 204 | % endif |
| 205 | % endif |
| 206 | % endfor |
| 207 | |
Timothy Chen | 90b8242 | 2021-02-03 23:45:21 -0800 | [diff] [blame] | 208 | ## Partial inter-module definition tie-off |
| 209 | // define partial inter-module tie-off |
| 210 | % for sig in unused_im_defs: |
| 211 | % for idx in range(sig['end_idx'], sig['width']): |
| 212 | ${lib.im_defname(sig)} unused_${sig["signame"]}${idx}; |
| 213 | % endfor |
| 214 | % endfor |
| 215 | |
| 216 | // assign partial inter-module tie-off |
| 217 | % for sig in unused_im_defs: |
| 218 | % for idx in range(sig['end_idx'], sig['width']): |
| 219 | assign unused_${sig["signame"]}${idx} = ${sig["signame"]}[${idx}]; |
| 220 | % endfor |
| 221 | % endfor |
| 222 | % for sig in undriven_im_defs: |
| 223 | % for idx in range(sig['end_idx'], sig['width']): |
| 224 | assign ${sig["signame"]}[${idx}] = ${lib.im_netname(sig, sig['suffix'], True)}; |
| 225 | % endfor |
| 226 | % endfor |
| 227 | |
Pirmin Vogel | a2d411d | 2020-07-13 17:33:42 +0200 | [diff] [blame] | 228 | ## Inter-module signal collection |
Pirmin Vogel | a2d411d | 2020-07-13 17:33:42 +0200 | [diff] [blame] | 229 | |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 230 | // Unused reset signals |
| 231 | % for k, v in unused_resets.items(): |
| 232 | logic unused_d${v.lower()}_rst_${k}; |
| 233 | % endfor |
| 234 | % for k, v in unused_resets.items(): |
| 235 | assign unused_d${v.lower()}_rst_${k} = ${lib.get_reset_path(k, v, top['resets'])}; |
| 236 | % endfor |
| 237 | |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 238 | // Non-debug module reset == reset for everything except for the debug module |
| 239 | logic ndmreset_req; |
| 240 | |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 241 | // debug request from rv_dm to core |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 242 | logic debug_req; |
| 243 | |
| 244 | // processor core |
| 245 | rv_core_ibex #( |
Philipp Wagner | 25d88922 | 2020-04-03 11:52:41 +0100 | [diff] [blame] | 246 | .PMPEnable (1), |
| 247 | .PMPGranularity (0), // 2^(PMPGranularity+2) == 4 byte granularity |
| 248 | .PMPNumRegions (16), |
Pirmin Vogel | 185d1bf | 2020-08-27 13:30:10 +0200 | [diff] [blame] | 249 | .MHPMCounterNum (10), |
| 250 | .MHPMCounterWidth (32), |
Greg Chadwick | dadb1af | 2020-04-16 17:10:23 +0100 | [diff] [blame] | 251 | .RV32E (0), |
Pirmin Vogel | e381464 | 2020-08-27 12:44:23 +0200 | [diff] [blame] | 252 | .RV32M (ibex_pkg::RV32MSingleCycle), |
| 253 | .RV32B (ibex_pkg::RV32BNone), |
Pirmin Vogel | 4eb2502 | 2020-08-27 15:27:33 +0200 | [diff] [blame] | 254 | .RegFile (IbexRegFile), |
Greg Chadwick | dadb1af | 2020-04-16 17:10:23 +0100 | [diff] [blame] | 255 | .BranchTargetALU (1), |
| 256 | .WritebackStage (1), |
Tom Roberts | 7824ccc | 2020-11-05 11:34:03 +0000 | [diff] [blame] | 257 | .ICache (IbexICache), |
| 258 | .ICacheECC (1), |
Pirmin Vogel | e381464 | 2020-08-27 12:44:23 +0200 | [diff] [blame] | 259 | .BranchPredictor (0), |
Greg Chadwick | dadb1af | 2020-04-16 17:10:23 +0100 | [diff] [blame] | 260 | .DbgTriggerEn (1), |
Tom Roberts | 78bb2ae | 2020-06-03 15:24:22 +0100 | [diff] [blame] | 261 | .SecureIbex (0), |
Rupert Swarbrick | da341bf | 2021-03-10 15:45:25 +0000 | [diff] [blame^] | 262 | .DmHaltAddr (ADDR_SPACE_DEBUG_MEM + dm::HaltAddress[31:0]), |
| 263 | .DmExceptionAddr (ADDR_SPACE_DEBUG_MEM + dm::ExceptionAddress[31:0]), |
Greg Chadwick | dadb1af | 2020-04-16 17:10:23 +0100 | [diff] [blame] | 264 | .PipeLine (IbexPipeLine) |
Michael Schaffner | a39557e | 2020-03-17 18:30:21 -0700 | [diff] [blame] | 265 | ) u_rv_core_ibex ( |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 266 | // clock and reset |
Timothy Chen | f56c1b5 | 2020-04-28 17:00:43 -0700 | [diff] [blame] | 267 | .clk_i (${cpu_clk}), |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 268 | .rst_ni (${cpu_rst}[rstmgr_pkg::Domain0Sel]), |
Michael Schaffner | be5cb9c | 2020-11-19 19:53:47 -0800 | [diff] [blame] | 269 | .clk_esc_i (${esc_clk}), |
| 270 | .rst_esc_ni (${esc_rst}[rstmgr_pkg::Domain0Sel]), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 271 | .test_en_i (1'b0), |
| 272 | // static pinning |
Greg Chadwick | 53ef2ec | 2019-09-03 14:53:54 +0100 | [diff] [blame] | 273 | .hart_id_i (32'b0), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 274 | .boot_addr_i (ADDR_SPACE_ROM), |
| 275 | // TL-UL buses |
Eunchan Kim | e0d37fe | 2020-08-03 12:05:21 -0700 | [diff] [blame] | 276 | .tl_i_o (main_tl_corei_req), |
| 277 | .tl_i_i (main_tl_corei_rsp), |
| 278 | .tl_d_o (main_tl_cored_req), |
| 279 | .tl_d_i (main_tl_cored_rsp), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 280 | // interrupts |
| 281 | .irq_software_i (msip), |
| 282 | .irq_timer_i (intr_rv_timer_timer_expired_0_0), |
| 283 | .irq_external_i (irq_plic), |
Michael Schaffner | bdcbd20 | 2020-07-27 12:18:21 -0700 | [diff] [blame] | 284 | // escalation input from alert handler (NMI) |
Timothy Chen | e4e857d | 2020-12-16 18:00:01 -0800 | [diff] [blame] | 285 | .esc_tx_i (alert_handler_esc_tx[0]), |
| 286 | .esc_rx_o (alert_handler_esc_rx[0]), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 287 | // debug interface |
| 288 | .debug_req_i (debug_req), |
Timothy Chen | f524c21 | 2020-12-17 14:08:45 -0800 | [diff] [blame] | 289 | // crash dump interface |
Tom Roberts | c88e97f | 2021-03-04 13:38:20 +0000 | [diff] [blame] | 290 | .crash_dump_o (rv_core_ibex_crash_dump), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 291 | // CPU control signals |
Michael Schaffner | dc0c1e9 | 2021-03-02 14:41:31 -0800 | [diff] [blame] | 292 | .lc_cpu_en_i (lc_ctrl_lc_cpu_en), |
Timothy Chen | 92b526e | 2021-02-01 21:23:42 -0800 | [diff] [blame] | 293 | .core_sleep_o (pwrmgr_aon_pwr_cpu.core_sleeping) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 294 | ); |
| 295 | |
| 296 | // Debug Module (RISC-V Debug Spec 0.13) |
| 297 | // |
| 298 | |
Michael Schaffner | a03f158 | 2020-11-19 22:16:27 -0800 | [diff] [blame] | 299 | // TODO: this will be routed to the pinmux for TAP selection |
| 300 | // based on straps and LC control signals. |
Michael Schaffner | 382210d | 2020-12-07 12:18:42 -0800 | [diff] [blame] | 301 | jtag_pkg::jtag_req_t jtag_req; |
| 302 | jtag_pkg::jtag_rsp_t jtag_rsp; |
Michael Schaffner | a03f158 | 2020-11-19 22:16:27 -0800 | [diff] [blame] | 303 | logic unused_jtag_tdo_oe_o; |
| 304 | |
| 305 | assign jtag_req.tck = jtag_tck_i; |
| 306 | assign jtag_req.tms = jtag_tms_i; |
| 307 | assign jtag_req.trst_n = jtag_trst_ni; |
| 308 | assign jtag_req.tdi = jtag_tdi_i; |
| 309 | assign jtag_tdo_o = jtag_rsp.tdo; |
| 310 | assign unused_jtag_tdo_oe_o = jtag_rsp.tdo_oe; |
| 311 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 312 | rv_dm #( |
Philipp Wagner | 086b703 | 2019-10-25 17:06:15 +0100 | [diff] [blame] | 313 | .NrHarts (1), |
| 314 | .IdcodeValue (JTAG_IDCODE) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 315 | ) u_dm_top ( |
Timothy Chen | f56c1b5 | 2020-04-28 17:00:43 -0700 | [diff] [blame] | 316 | .clk_i (${cpu_clk}), |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 317 | .rst_ni (${dm_rst}[rstmgr_pkg::Domain0Sel]), |
Michael Schaffner | 7ce0e52 | 2021-02-25 16:39:42 -0800 | [diff] [blame] | 318 | .hw_debug_en_i (lc_ctrl_lc_hw_debug_en), |
Michael Schaffner | 8bf4fe6 | 2021-02-18 12:56:08 -0800 | [diff] [blame] | 319 | .scanmode_i, |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 320 | .ndmreset_o (ndmreset_req), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 321 | .dmactive_o (), |
| 322 | .debug_req_o (debug_req), |
| 323 | .unavailable_i (1'b0), |
| 324 | |
| 325 | // bus device with debug memory (for execution-based debug) |
Eunchan Kim | e0d37fe | 2020-08-03 12:05:21 -0700 | [diff] [blame] | 326 | .tl_d_i (main_tl_debug_mem_req), |
| 327 | .tl_d_o (main_tl_debug_mem_rsp), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 328 | |
| 329 | // bus host (for system bus accesses, SBA) |
Eunchan Kim | e0d37fe | 2020-08-03 12:05:21 -0700 | [diff] [blame] | 330 | .tl_h_o (main_tl_dm_sba_req), |
| 331 | .tl_h_i (main_tl_dm_sba_rsp), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 332 | |
| 333 | //JTAG |
Michael Schaffner | a03f158 | 2020-11-19 22:16:27 -0800 | [diff] [blame] | 334 | .jtag_req_i (jtag_req), |
| 335 | .jtag_rsp_o (jtag_rsp) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 336 | ); |
| 337 | |
Timothy Chen | 92b526e | 2021-02-01 21:23:42 -0800 | [diff] [blame] | 338 | assign rstmgr_aon_cpu.ndmreset_req = ndmreset_req; |
| 339 | assign rstmgr_aon_cpu.rst_cpu_n = ${top["reset_paths"]["sys"]}[rstmgr_pkg::Domain0Sel]; |
Timothy Chen | c59f701 | 2020-04-16 19:11:42 -0700 | [diff] [blame] | 340 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 341 | ## Memory Instantiation |
| 342 | % for m in top["memory"]: |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 343 | <% |
| 344 | resets = m['reset_connections'] |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 345 | clocks = m['clock_connections'] |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 346 | %>\ |
Michael Schaffner | bd9a354 | 2020-12-21 13:08:32 -0800 | [diff] [blame] | 347 | % if m["type"] == "ram_1p_scr": |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 348 | <% |
| 349 | data_width = int(top["datawidth"]) |
Timothy Chen | 466585e | 2021-03-01 15:06:01 -0800 | [diff] [blame] | 350 | full_data_width = data_width + int(m["integ_width"]) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 351 | dw_byte = data_width // 8 |
| 352 | addr_width = ((int(m["size"], 0) // dw_byte) -1).bit_length() |
| 353 | sram_depth = (int(m["size"], 0) // dw_byte) |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 354 | max_char = len(str(max(data_width, addr_width))) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 355 | %>\ |
| 356 | // sram device |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 357 | logic ${lib.bitarray(1, max_char)} ${m["name"]}_req; |
Michael Schaffner | bd9a354 | 2020-12-21 13:08:32 -0800 | [diff] [blame] | 358 | logic ${lib.bitarray(1, max_char)} ${m["name"]}_gnt; |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 359 | logic ${lib.bitarray(1, max_char)} ${m["name"]}_we; |
Timothy Chen | 12cce14 | 2021-03-02 18:11:01 -0800 | [diff] [blame] | 360 | logic ${lib.bitarray(1, max_char)} ${m["name"]}_intg_err; |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 361 | logic ${lib.bitarray(addr_width, max_char)} ${m["name"]}_addr; |
Timothy Chen | a6833b1 | 2021-03-03 14:58:38 -0800 | [diff] [blame] | 362 | logic ${lib.bitarray(data_width, max_char)} ${m["name"]}_wdata; |
| 363 | logic ${lib.bitarray(data_width, max_char)} ${m["name"]}_wmask; |
Timothy Chen | 466585e | 2021-03-01 15:06:01 -0800 | [diff] [blame] | 364 | logic ${lib.bitarray(full_data_width, max_char)} ${m["name"]}_rdata; |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 365 | logic ${lib.bitarray(1, max_char)} ${m["name"]}_rvalid; |
Philipp Wagner | e1efc18 | 2020-05-21 18:26:17 +0100 | [diff] [blame] | 366 | logic ${lib.bitarray(2, max_char)} ${m["name"]}_rerror; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 367 | |
| 368 | tlul_adapter_sram #( |
| 369 | .SramAw(${addr_width}), |
| 370 | .SramDw(${data_width}), |
Timothy Chen | 12cce14 | 2021-03-02 18:11:01 -0800 | [diff] [blame] | 371 | .Outstanding(2), |
| 372 | .CmdIntgCheck(1), |
| 373 | .EnableRspIntgGen(1), |
| 374 | .EnableDataIntgGen(1) // TODO: Needs to be updated for integrity passthrough |
Michael Schaffner | a39557e | 2020-03-17 18:30:21 -0700 | [diff] [blame] | 375 | ) u_tl_adapter_${m["name"]} ( |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 376 | % for key in clocks: |
Timothy Chen | 0550d69 | 2020-04-20 17:19:35 -0700 | [diff] [blame] | 377 | .${key} (${clocks[key]}), |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 378 | % endfor |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 379 | % for key, value in resets.items(): |
| 380 | .${key} (${value}), |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 381 | % endfor |
Timothy Chen | 1a9a60f | 2021-02-10 18:04:39 -0800 | [diff] [blame] | 382 | .tl_i (${m["name"]}_tl_req), |
| 383 | .tl_o (${m["name"]}_tl_rsp), |
Timothy Chen | 15d98b7 | 2021-02-10 20:58:34 -0800 | [diff] [blame] | 384 | .en_ifetch_i (${m["inter_signal_list"][2]["top_signame"]}), |
Timothy Chen | 1a9a60f | 2021-02-10 18:04:39 -0800 | [diff] [blame] | 385 | .req_o (${m["name"]}_req), |
| 386 | .gnt_i (${m["name"]}_gnt), |
| 387 | .we_o (${m["name"]}_we), |
| 388 | .addr_o (${m["name"]}_addr), |
| 389 | .wdata_o (${m["name"]}_wdata), |
| 390 | .wmask_o (${m["name"]}_wmask), |
Timothy Chen | 12cce14 | 2021-03-02 18:11:01 -0800 | [diff] [blame] | 391 | .intg_error_o(${m["name"]}_intg_err), |
Timothy Chen | 466585e | 2021-03-01 15:06:01 -0800 | [diff] [blame] | 392 | .rdata_i (${m["name"]}_rdata[${data_width-1}:0]), |
Timothy Chen | 1a9a60f | 2021-02-10 18:04:39 -0800 | [diff] [blame] | 393 | .rvalid_i (${m["name"]}_rvalid), |
| 394 | .rerror_i (${m["name"]}_rerror) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 395 | ); |
| 396 | |
Michael Schaffner | bec47c7 | 2020-11-06 14:03:54 -0800 | [diff] [blame] | 397 | prim_ram_1p_scr #( |
Timothy Chen | 466585e | 2021-03-01 15:06:01 -0800 | [diff] [blame] | 398 | .Width(${full_data_width}), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 399 | .Depth(${sram_depth}), |
Timothy Chen | 466585e | 2021-03-01 15:06:01 -0800 | [diff] [blame] | 400 | .EnableParity(0), |
Michael Schaffner | bec47c7 | 2020-11-06 14:03:54 -0800 | [diff] [blame] | 401 | .CfgWidth(8) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 402 | ) u_ram1p_${m["name"]} ( |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 403 | % for key in clocks: |
Timothy Chen | 0550d69 | 2020-04-20 17:19:35 -0700 | [diff] [blame] | 404 | .${key} (${clocks[key]}), |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 405 | % endfor |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 406 | % for key, value in resets.items(): |
| 407 | .${key} (${value}), |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 408 | % endfor |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 409 | |
Timothy Chen | 12cce14 | 2021-03-02 18:11:01 -0800 | [diff] [blame] | 410 | .key_valid_i (${m["inter_signal_list"][1]["top_signame"]}_req.valid), |
| 411 | .key_i (${m["inter_signal_list"][1]["top_signame"]}_req.key), |
| 412 | .nonce_i (${m["inter_signal_list"][1]["top_signame"]}_req.nonce), |
Michael Schaffner | bec47c7 | 2020-11-06 14:03:54 -0800 | [diff] [blame] | 413 | |
Timothy Chen | 12cce14 | 2021-03-02 18:11:01 -0800 | [diff] [blame] | 414 | .req_i (${m["name"]}_req), |
| 415 | .intg_error_i(${m["name"]}_intg_err), |
| 416 | .gnt_o (${m["name"]}_gnt), |
| 417 | .write_i (${m["name"]}_we), |
| 418 | .addr_i (${m["name"]}_addr), |
| 419 | .wdata_i (${full_data_width}'(${m["name"]}_wdata)), |
| 420 | .wmask_i (${full_data_width}'(${m["name"]}_wmask)), |
| 421 | .rdata_o (${m["name"]}_rdata), |
| 422 | .rvalid_o (${m["name"]}_rvalid), |
| 423 | .rerror_o (${m["name"]}_rerror), |
| 424 | .raddr_o (${m["inter_signal_list"][1]["top_signame"]}_rsp.raddr), |
| 425 | .intg_error_o(${m["inter_signal_list"][3]["top_signame"]}), |
| 426 | .cfg_i ( '0 ) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 427 | ); |
Michael Schaffner | bec47c7 | 2020-11-06 14:03:54 -0800 | [diff] [blame] | 428 | |
Michael Schaffner | bd9a354 | 2020-12-21 13:08:32 -0800 | [diff] [blame] | 429 | assign ${m["inter_signal_list"][1]["top_signame"]}_rsp.rerror = ${m["name"]}_rerror; |
| 430 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 431 | % elif m["type"] == "rom": |
| 432 | <% |
| 433 | data_width = int(top["datawidth"]) |
Timothy Chen | 466585e | 2021-03-01 15:06:01 -0800 | [diff] [blame] | 434 | full_data_width = data_width + int(m['integ_width']) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 435 | dw_byte = data_width // 8 |
| 436 | addr_width = ((int(m["size"], 0) // dw_byte) -1).bit_length() |
| 437 | rom_depth = (int(m["size"], 0) // dw_byte) |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 438 | max_char = len(str(max(data_width, addr_width))) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 439 | %>\ |
| 440 | // ROM device |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 441 | logic ${lib.bitarray(1, max_char)} ${m["name"]}_req; |
| 442 | logic ${lib.bitarray(addr_width, max_char)} ${m["name"]}_addr; |
Timothy Chen | 466585e | 2021-03-01 15:06:01 -0800 | [diff] [blame] | 443 | logic ${lib.bitarray(full_data_width, max_char)} ${m["name"]}_rdata; |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 444 | logic ${lib.bitarray(1, max_char)} ${m["name"]}_rvalid; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 445 | |
| 446 | tlul_adapter_sram #( |
| 447 | .SramAw(${addr_width}), |
| 448 | .SramDw(${data_width}), |
Eunchan Kim | 6c731a8 | 2020-03-04 14:48:52 -0800 | [diff] [blame] | 449 | .Outstanding(2), |
Timothy Chen | 12cce14 | 2021-03-02 18:11:01 -0800 | [diff] [blame] | 450 | .ErrOnWrite(1), |
| 451 | .CmdIntgCheck(1), |
| 452 | .EnableRspIntgGen(1), |
| 453 | .EnableDataIntgGen(1) // TODO: Needs to be updated for intgerity passthrough |
Michael Schaffner | a39557e | 2020-03-17 18:30:21 -0700 | [diff] [blame] | 454 | ) u_tl_adapter_${m["name"]} ( |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 455 | % for key in clocks: |
Timothy Chen | 0550d69 | 2020-04-20 17:19:35 -0700 | [diff] [blame] | 456 | .${key} (${clocks[key]}), |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 457 | % endfor |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 458 | % for key, value in resets.items(): |
| 459 | .${key} (${value}), |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 460 | % endfor |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 461 | |
Timothy Chen | 1a9a60f | 2021-02-10 18:04:39 -0800 | [diff] [blame] | 462 | .tl_i (${m["name"]}_tl_req), |
| 463 | .tl_o (${m["name"]}_tl_rsp), |
Timothy Chen | 15d98b7 | 2021-02-10 20:58:34 -0800 | [diff] [blame] | 464 | .en_ifetch_i (tlul_pkg::InstrEn), |
Timothy Chen | 1a9a60f | 2021-02-10 18:04:39 -0800 | [diff] [blame] | 465 | .req_o (${m["name"]}_req), |
| 466 | .gnt_i (1'b1), // Always grant as only one requester exists |
| 467 | .we_o (), |
| 468 | .addr_o (${m["name"]}_addr), |
| 469 | .wdata_o (), |
| 470 | .wmask_o (), |
Timothy Chen | 12cce14 | 2021-03-02 18:11:01 -0800 | [diff] [blame] | 471 | .intg_error_o(), // Connect to ROM checker and ROM scramble later |
Timothy Chen | 466585e | 2021-03-01 15:06:01 -0800 | [diff] [blame] | 472 | .rdata_i (${m["name"]}_rdata[${data_width-1}:0]), |
Timothy Chen | 1a9a60f | 2021-02-10 18:04:39 -0800 | [diff] [blame] | 473 | .rvalid_i (${m["name"]}_rvalid), |
| 474 | .rerror_i (2'b00) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 475 | ); |
| 476 | |
Michael Schaffner | 0beb8a4 | 2020-06-05 23:17:40 -0700 | [diff] [blame] | 477 | prim_rom_adv #( |
Timothy Chen | 466585e | 2021-03-01 15:06:01 -0800 | [diff] [blame] | 478 | .Width(${full_data_width}), |
Philipp Wagner | a37bcfa | 2020-05-19 22:46:41 +0100 | [diff] [blame] | 479 | .Depth(${rom_depth}), |
| 480 | .MemInitFile(BootRomInitFile) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 481 | ) u_rom_${m["name"]} ( |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 482 | % for key in clocks: |
Timothy Chen | 0550d69 | 2020-04-20 17:19:35 -0700 | [diff] [blame] | 483 | .${key} (${clocks[key]}), |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 484 | % endfor |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 485 | % for key, value in resets.items(): |
| 486 | .${key} (${value}), |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 487 | % endfor |
Michael Schaffner | 0beb8a4 | 2020-06-05 23:17:40 -0700 | [diff] [blame] | 488 | .req_i (${m["name"]}_req), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 489 | .addr_i (${m["name"]}_addr), |
Michael Schaffner | 0beb8a4 | 2020-06-05 23:17:40 -0700 | [diff] [blame] | 490 | .rdata_o (${m["name"]}_rdata), |
| 491 | .rvalid_o (${m["name"]}_rvalid), |
| 492 | .cfg_i ('0) // tied off for now |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 493 | ); |
| 494 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 495 | % elif m["type"] == "eflash": |
| 496 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 497 | // host to flash communication |
| 498 | logic flash_host_req; |
| 499 | logic flash_host_req_rdy; |
| 500 | logic flash_host_req_done; |
Timothy Chen | e96730f | 2020-09-14 23:10:42 -0700 | [diff] [blame] | 501 | logic flash_host_rderr; |
Timothy Chen | 1451840 | 2020-04-13 15:25:22 -0700 | [diff] [blame] | 502 | logic [flash_ctrl_pkg::BusWidth-1:0] flash_host_rdata; |
Timothy Chen | b35a340 | 2020-06-23 00:14:11 -0700 | [diff] [blame] | 503 | logic [flash_ctrl_pkg::BusAddrW-1:0] flash_host_addr; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 504 | |
Timothy Chen | 5aec528 | 2019-09-10 21:10:56 -0700 | [diff] [blame] | 505 | tlul_adapter_sram #( |
Timothy Chen | b35a340 | 2020-06-23 00:14:11 -0700 | [diff] [blame] | 506 | .SramAw(flash_ctrl_pkg::BusAddrW), |
Timothy Chen | 1451840 | 2020-04-13 15:25:22 -0700 | [diff] [blame] | 507 | .SramDw(flash_ctrl_pkg::BusWidth), |
Eunchan Kim | 6c731a8 | 2020-03-04 14:48:52 -0800 | [diff] [blame] | 508 | .Outstanding(2), |
Timothy Chen | 5aec528 | 2019-09-10 21:10:56 -0700 | [diff] [blame] | 509 | .ByteAccess(0), |
Timothy Chen | 12cce14 | 2021-03-02 18:11:01 -0800 | [diff] [blame] | 510 | .ErrOnWrite(1), |
| 511 | .CmdIntgCheck(1), |
| 512 | .EnableRspIntgGen(1), |
| 513 | .EnableDataIntgGen(1) |
Michael Schaffner | a39557e | 2020-03-17 18:30:21 -0700 | [diff] [blame] | 514 | ) u_tl_adapter_${m["name"]} ( |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 515 | % for key in clocks: |
Timothy Chen | 0550d69 | 2020-04-20 17:19:35 -0700 | [diff] [blame] | 516 | .${key} (${clocks[key]}), |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 517 | % endfor |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 518 | % for key, value in resets.items(): |
| 519 | .${key} (${value}), |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 520 | % endfor |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 521 | |
Timothy Chen | 1a9a60f | 2021-02-10 18:04:39 -0800 | [diff] [blame] | 522 | .tl_i (${m["name"]}_tl_req), |
| 523 | .tl_o (${m["name"]}_tl_rsp), |
Timothy Chen | 15d98b7 | 2021-02-10 20:58:34 -0800 | [diff] [blame] | 524 | .en_ifetch_i (tlul_pkg::InstrEn), // tie this to secure boot somehow |
Timothy Chen | 1a9a60f | 2021-02-10 18:04:39 -0800 | [diff] [blame] | 525 | .req_o (flash_host_req), |
| 526 | .gnt_i (flash_host_req_rdy), |
| 527 | .we_o (), |
| 528 | .addr_o (flash_host_addr), |
| 529 | .wdata_o (), |
| 530 | .wmask_o (), |
Timothy Chen | 12cce14 | 2021-03-02 18:11:01 -0800 | [diff] [blame] | 531 | .intg_error_o(), // TODO: connect to flash controller and flash scramble later |
Timothy Chen | 1a9a60f | 2021-02-10 18:04:39 -0800 | [diff] [blame] | 532 | .rdata_i (flash_host_rdata), |
| 533 | .rvalid_i (flash_host_req_done), |
| 534 | .rerror_i ({flash_host_rderr,1'b0}) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 535 | ); |
| 536 | |
Timothy Chen | 1451840 | 2020-04-13 15:25:22 -0700 | [diff] [blame] | 537 | flash_phy u_flash_${m["name"]} ( |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 538 | % for key in clocks: |
Timothy Chen | 0550d69 | 2020-04-20 17:19:35 -0700 | [diff] [blame] | 539 | .${key} (${clocks[key]}), |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 540 | % endfor |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 541 | % for key, value in resets.items(): |
| 542 | .${key} (${value}), |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 543 | % endfor |
Timothy Chen | b1ba59b | 2021-01-07 12:18:11 -0800 | [diff] [blame] | 544 | .host_req_i (flash_host_req), |
| 545 | .host_addr_i (flash_host_addr), |
| 546 | .host_req_rdy_o (flash_host_req_rdy), |
| 547 | .host_req_done_o (flash_host_req_done), |
| 548 | .host_rderr_o (flash_host_rderr), |
| 549 | .host_rdata_o (flash_host_rdata), |
| 550 | .flash_ctrl_i (${m["inter_signal_list"][0]["top_signame"]}_req), |
| 551 | .flash_ctrl_o (${m["inter_signal_list"][0]["top_signame"]}_rsp), |
| 552 | .lc_nvm_debug_en_i (${m["inter_signal_list"][2]["top_signame"]}), |
Timothy Chen | b1ba59b | 2021-01-07 12:18:11 -0800 | [diff] [blame] | 553 | .flash_bist_enable_i, |
Timothy Chen | d2c9ff4 | 2020-11-19 16:03:54 -0800 | [diff] [blame] | 554 | .flash_power_down_h_i, |
| 555 | .flash_power_ready_h_i, |
| 556 | .flash_test_mode_a_i, |
| 557 | .flash_test_voltage_h_i, |
| 558 | .scanmode_i, |
Timothy Chen | 010e3cc | 2021-02-02 14:55:09 -0800 | [diff] [blame] | 559 | .scan_en_i, |
Timothy Chen | d2c9ff4 | 2020-11-19 16:03:54 -0800 | [diff] [blame] | 560 | .scan_rst_ni |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 561 | ); |
| 562 | |
| 563 | % else: |
| 564 | // flash memory is embedded within controller |
| 565 | % endif |
| 566 | % endfor |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 567 | ## Peripheral Instantiation |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 568 | |
Michael Schaffner | 666dde1 | 2019-10-25 11:57:54 -0700 | [diff] [blame] | 569 | <% alert_idx = 0 %> |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 570 | % for m in top["module"]: |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 571 | <% |
Timothy Chen | 9443221 | 2021-03-01 22:29:18 -0800 | [diff] [blame] | 572 | if not lib.is_inst(m): |
| 573 | continue |
| 574 | |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 575 | block = name_to_block[m['type']] |
| 576 | inouts, inputs, outputs = block.xputs |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 577 | |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 578 | port_list = inputs + outputs + inouts |
| 579 | max_sigwidth = max(len(x.name) for x in port_list) if port_list else 0 |
| 580 | max_intrwidth = (max(len(x.name) for x in block.interrupts) |
| 581 | if block.interrupts else 0) |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 582 | %>\ |
Pirmin Vogel | 15e1b91 | 2020-09-16 14:43:22 +0200 | [diff] [blame] | 583 | % if m["param_list"]: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 584 | ${m["type"]} #( |
Pirmin Vogel | 15e1b91 | 2020-09-16 14:43:22 +0200 | [diff] [blame] | 585 | % for i in m["param_list"]: |
Rupert Swarbrick | 611a642 | 2021-02-12 11:56:48 +0000 | [diff] [blame] | 586 | .${i["name"]}(${i["name_top" if i.get("expose") == "true" or i.get("randtype", "none") != "none" else "default"]})${"," if not loop.last else ""} |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 587 | % endfor |
Michael Schaffner | a39557e | 2020-03-17 18:30:21 -0700 | [diff] [blame] | 588 | ) u_${m["name"]} ( |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 589 | % else: |
Michael Schaffner | a39557e | 2020-03-17 18:30:21 -0700 | [diff] [blame] | 590 | ${m["type"]} u_${m["name"]} ( |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 591 | % endif |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 592 | % for p_in in inputs + inouts: |
Pirmin Vogel | b054fc0 | 2020-03-11 11:23:03 +0100 | [diff] [blame] | 593 | % if loop.first: |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 594 | |
| 595 | // Input |
Pirmin Vogel | b054fc0 | 2020-03-11 11:23:03 +0100 | [diff] [blame] | 596 | % endif |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 597 | .${lib.ljust("cio_"+p_in.name+"_i",max_sigwidth+9)} (cio_${m["name"]}_${p_in.name}_p2d), |
Pirmin Vogel | b054fc0 | 2020-03-11 11:23:03 +0100 | [diff] [blame] | 598 | % endfor |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 599 | % for p_out in outputs + inouts: |
Pirmin Vogel | b054fc0 | 2020-03-11 11:23:03 +0100 | [diff] [blame] | 600 | % if loop.first: |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 601 | |
| 602 | // Output |
Pirmin Vogel | b054fc0 | 2020-03-11 11:23:03 +0100 | [diff] [blame] | 603 | % endif |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 604 | .${lib.ljust("cio_"+p_out.name+"_o", max_sigwidth+9)} (cio_${m["name"]}_${p_out.name}_d2p), |
| 605 | .${lib.ljust("cio_"+p_out.name+"_en_o",max_sigwidth+9)} (cio_${m["name"]}_${p_out.name}_en_d2p), |
Pirmin Vogel | b054fc0 | 2020-03-11 11:23:03 +0100 | [diff] [blame] | 606 | % endfor |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 607 | % for intr in block.interrupts: |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 608 | % if loop.first: |
| 609 | |
| 610 | // Interrupt |
| 611 | % endif |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 612 | .${lib.ljust("intr_"+intr.name+"_o",max_intrwidth+7)} (intr_${m["name"]}_${intr.name}), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 613 | % endfor |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 614 | % if block.alerts: |
Michael Schaffner | d4d5d2f | 2020-04-17 15:45:55 -0700 | [diff] [blame] | 615 | <% |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 616 | w = len(block.alerts) |
Michael Schaffner | d4d5d2f | 2020-04-17 15:45:55 -0700 | [diff] [blame] | 617 | slice = str(alert_idx+w-1) + ":" + str(alert_idx) |
| 618 | %> |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 619 | % for alert in block.alerts: |
| 620 | // [${alert_idx}]: ${alert.name}<% alert_idx += 1 %> |
Michael Schaffner | 666dde1 | 2019-10-25 11:57:54 -0700 | [diff] [blame] | 621 | % endfor |
| 622 | .alert_tx_o ( alert_tx[${slice}] ), |
| 623 | .alert_rx_i ( alert_rx[${slice}] ), |
| 624 | % endif |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 625 | ## TODO: Inter-module Connection |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 626 | % if m.get('inter_signal_list'): |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 627 | |
Eunchan Kim | e4a8507 | 2020-02-05 16:00:00 -0800 | [diff] [blame] | 628 | // Inter-module signals |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 629 | % for sig in m['inter_signal_list']: |
Eunchan Kim | b7d7231 | 2020-03-30 10:51:55 -0700 | [diff] [blame] | 630 | ## TODO: handle below condition in lib.py |
Rupert Swarbrick | b650026 | 2021-02-23 15:16:16 +0000 | [diff] [blame] | 631 | % if sig['type'] == "req_rsp": |
Eunchan Kim | 40098a9 | 2020-04-17 12:22:36 -0700 | [diff] [blame] | 632 | .${lib.im_portname(sig,"req")}(${lib.im_netname(sig, "req")}), |
| 633 | .${lib.im_portname(sig,"rsp")}(${lib.im_netname(sig, "rsp")}), |
Rupert Swarbrick | b650026 | 2021-02-23 15:16:16 +0000 | [diff] [blame] | 634 | % elif sig['type'] == "uni": |
Eunchan Kim | 40098a9 | 2020-04-17 12:22:36 -0700 | [diff] [blame] | 635 | ## TODO: Broadcast type |
| 636 | ## TODO: default for logic type |
| 637 | .${lib.im_portname(sig)}(${lib.im_netname(sig)}), |
Eunchan Kim | e4a8507 | 2020-02-05 16:00:00 -0800 | [diff] [blame] | 638 | % endif |
| 639 | % endfor |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 640 | % endif |
| 641 | % if m["type"] == "rv_plic": |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 642 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 643 | .intr_src_i (intr_vector), |
| 644 | .irq_o (irq_plic), |
| 645 | .irq_id_o (irq_id), |
| 646 | .msip_o (msip), |
| 647 | % endif |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 648 | % if m["type"] == "pinmux": |
| 649 | |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 650 | .periph_to_mio_i (mio_d2p ), |
| 651 | .periph_to_mio_oe_i (mio_d2p_en ), |
| 652 | .mio_to_periph_o (mio_p2d ), |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 653 | |
Michael Schaffner | 43ce8d5 | 2021-02-10 17:04:57 -0800 | [diff] [blame] | 654 | .mio_attr_o, |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 655 | .mio_out_o, |
| 656 | .mio_oe_o, |
| 657 | .mio_in_i, |
| 658 | |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 659 | .periph_to_dio_i (dio_d2p ), |
| 660 | .periph_to_dio_oe_i (dio_d2p_en ), |
| 661 | .dio_to_periph_o (dio_p2d ), |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 662 | |
Michael Schaffner | 43ce8d5 | 2021-02-10 17:04:57 -0800 | [diff] [blame] | 663 | .dio_attr_o, |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 664 | .dio_out_o, |
| 665 | .dio_oe_o, |
| 666 | .dio_in_i, |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 667 | |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 668 | % endif |
Michael Schaffner | 666dde1 | 2019-10-25 11:57:54 -0700 | [diff] [blame] | 669 | % if m["type"] == "alert_handler": |
Michael Schaffner | 666dde1 | 2019-10-25 11:57:54 -0700 | [diff] [blame] | 670 | // alert signals |
| 671 | .alert_rx_o ( alert_rx ), |
| 672 | .alert_tx_i ( alert_tx ), |
Michael Schaffner | 666dde1 | 2019-10-25 11:57:54 -0700 | [diff] [blame] | 673 | % endif |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 674 | % if block.scan: |
Michael Schaffner | 8bf4fe6 | 2021-02-18 12:56:08 -0800 | [diff] [blame] | 675 | .scanmode_i, |
Eunchan Kim | 2cfadab | 2019-10-02 12:41:11 -0700 | [diff] [blame] | 676 | % endif |
Rupert Swarbrick | eb619e6 | 2021-03-05 15:01:54 +0000 | [diff] [blame] | 677 | % if block.scan_reset: |
Timothy Chen | 9d5b5b6 | 2020-06-29 17:55:48 -0700 | [diff] [blame] | 678 | .scan_rst_ni (scan_rst_ni), |
| 679 | % endif |
Timothy Chen | b0f5577 | 2021-02-01 15:43:47 -0800 | [diff] [blame] | 680 | |
| 681 | // Clock and reset connections |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 682 | % for k, v in m["clock_connections"].items(): |
Timothy Chen | 0550d69 | 2020-04-20 17:19:35 -0700 | [diff] [blame] | 683 | .${k} (${v}), |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 684 | % endfor |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 685 | % for k, v in m["reset_connections"].items(): |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 686 | .${k} (${v})${"," if not loop.last else ""} |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 687 | % endfor |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 688 | ); |
| 689 | |
| 690 | % endfor |
| 691 | // interrupt assignments |
| 692 | assign intr_vector = { |
Michael Schaffner | b5b8eba | 2021-02-09 20:07:04 -0800 | [diff] [blame] | 693 | % for k, intr in enumerate(top["interrupt"][::-1]): |
| 694 | intr_${intr["name"]}, // ID ${len(top["interrupt"])-k} |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 695 | % endfor |
Michael Schaffner | b5b8eba | 2021-02-09 20:07:04 -0800 | [diff] [blame] | 696 | 1'b 0 // ID 0 is a special case and tied to zero. |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 697 | }; |
| 698 | |
| 699 | // TL-UL Crossbar |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 700 | % for xbar in top["xbar"]: |
| 701 | <% |
| 702 | name_len = max([len(x["name"]) for x in xbar["nodes"]]); |
| 703 | %>\ |
| 704 | xbar_${xbar["name"]} u_xbar_${xbar["name"]} ( |
Timothy Chen | 80bd8aa | 2019-10-04 15:57:11 -0700 | [diff] [blame] | 705 | % for k, v in xbar["clock_connections"].items(): |
Timothy Chen | 0550d69 | 2020-04-20 17:19:35 -0700 | [diff] [blame] | 706 | .${k} (${v}), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 707 | % endfor |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 708 | % for k, v in xbar["reset_connections"].items(): |
Timothy Chen | 7f8cc8e | 2020-11-11 13:15:57 -0800 | [diff] [blame] | 709 | .${k} (${v}), |
Timothy Chen | 3193b00 | 2019-10-04 16:56:05 -0700 | [diff] [blame] | 710 | % endfor |
Eunchan Kim | e0d37fe | 2020-08-03 12:05:21 -0700 | [diff] [blame] | 711 | |
| 712 | ## Inter-module signal |
| 713 | % for sig in xbar["inter_signal_list"]: |
Rupert Swarbrick | b650026 | 2021-02-23 15:16:16 +0000 | [diff] [blame] | 714 | <% assert sig['type'] == "req_rsp" %>\ |
Eunchan Kim | e0d37fe | 2020-08-03 12:05:21 -0700 | [diff] [blame] | 715 | // port: ${sig['name']} |
| 716 | .${lib.im_portname(sig,"req")}(${lib.im_netname(sig, "req")}), |
| 717 | .${lib.im_portname(sig,"rsp")}(${lib.im_netname(sig, "rsp")}), |
| 718 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 719 | % endfor |
| 720 | |
| 721 | .scanmode_i |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 722 | ); |
Eunchan Kim | c745294 | 2019-12-19 17:04:37 -0800 | [diff] [blame] | 723 | % endfor |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 724 | |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 725 | % if "pinmux" in top: |
| 726 | // Pinmux connections |
Michael Schaffner | b5b8eba | 2021-02-09 20:07:04 -0800 | [diff] [blame] | 727 | % if num_mio_outputs != 0: |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 728 | assign mio_d2p = { |
Michael Schaffner | b5b8eba | 2021-02-09 20:07:04 -0800 | [diff] [blame] | 729 | % for sig in list(reversed(top["pinmux"]["outputs"])): |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 730 | cio_${sig["name"]}_d2p${"" if loop.last else ","} |
| 731 | % endfor |
| 732 | }; |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 733 | assign mio_d2p_en = { |
Michael Schaffner | b5b8eba | 2021-02-09 20:07:04 -0800 | [diff] [blame] | 734 | % for sig in list(reversed(top["pinmux"]["outputs"])): |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 735 | cio_${sig["name"]}_en_d2p${"" if loop.last else ","} |
| 736 | % endfor |
| 737 | }; |
| 738 | % endif |
Michael Schaffner | b5b8eba | 2021-02-09 20:07:04 -0800 | [diff] [blame] | 739 | % if num_mio_inputs != 0: |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 740 | assign { |
Michael Schaffner | b5b8eba | 2021-02-09 20:07:04 -0800 | [diff] [blame] | 741 | % for sig in list(reversed(top["pinmux"]["inputs"])): |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 742 | cio_${sig["name"]}_p2d${"" if loop.last else ","} |
| 743 | % endfor |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 744 | } = mio_p2d; |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 745 | % endif |
| 746 | % endif |
| 747 | |
| 748 | % if num_dio != 0: |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 749 | // Dedicated IO connections |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 750 | // Input-only DIOs have no d2p signals |
Michael Schaffner | dbd087e | 2021-02-12 17:58:30 -0800 | [diff] [blame] | 751 | assign dio_d2p = {<% vector_idx = num_dio - 1 %> |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 752 | % for sig in top["pinmux"]["dio"]: |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 753 | % if sig["type"] in ["output", "inout"]: |
Michael Schaffner | dbd087e | 2021-02-12 17:58:30 -0800 | [diff] [blame] | 754 | % if sig["width"] > 1: |
| 755 | % for i in range(sig["width"]-1,-1,-1): |
| 756 | cio_${sig["name"]}_d2p[${i}]${"" if vector_idx - sig["width"] + 1 == 0 else ","} // DIO${vector_idx}<% vector_idx -= 1 %> |
| 757 | % endfor |
| 758 | % else: |
| 759 | cio_${sig["name"]}_d2p${"" if vector_idx == 0 else ","} // DIO${vector_idx}<% vector_idx -= 1 %> |
| 760 | % endif |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 761 | % else: |
Michael Schaffner | dbd087e | 2021-02-12 17:58:30 -0800 | [diff] [blame] | 762 | % if sig["width"] > 1: |
| 763 | ${sig["width"]}'b0${"" if vector_idx - sig["width"] + 1 == 0 else ","} // DIO${vector_idx} - DIO${vector_idx-sig["width"] + 1}: cio_${sig["name"]}<% vector_idx -= sig["width"] %> |
| 764 | % else: |
| 765 | ${sig["width"]}'b0${"" if vector_idx == 0 else ","} // DIO${vector_idx}: cio_${sig["name"]}<% vector_idx -= 1 %> |
| 766 | % endif |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 767 | % endif |
| 768 | % endfor |
| 769 | }; |
| 770 | |
Michael Schaffner | dbd087e | 2021-02-12 17:58:30 -0800 | [diff] [blame] | 771 | assign dio_d2p_en = {<% vector_idx = num_dio - 1 %> |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 772 | % for sig in top["pinmux"]["dio"]: |
| 773 | % if sig["type"] in ["output", "inout"]: |
Michael Schaffner | dbd087e | 2021-02-12 17:58:30 -0800 | [diff] [blame] | 774 | % if sig["width"] > 1: |
| 775 | % for i in range(sig["width"]-1,-1,-1): |
| 776 | cio_${sig["name"]}_en_d2p[${i}]${"" if vector_idx - sig["width"] + 1 == 0 else ","} // DIO${vector_idx}<% vector_idx -= 1 %> |
| 777 | % endfor |
| 778 | % else: |
| 779 | cio_${sig["name"]}_en_d2p${"" if vector_idx == 0 else ","} // DIO${vector_idx}<% vector_idx -= 1 %> |
| 780 | % endif |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 781 | % else: |
Michael Schaffner | dbd087e | 2021-02-12 17:58:30 -0800 | [diff] [blame] | 782 | % if sig["width"] > 1: |
| 783 | ${sig["width"]}'b0${"" if vector_idx - sig["width"] + 1 == 0 else ","} // DIO${vector_idx} - DIO${vector_idx-sig["width"] + 1}: cio_${sig["name"]}<% vector_idx -= sig["width"] %> |
| 784 | % else: |
| 785 | ${sig["width"]}'b0${"" if vector_idx == 0 else ","} // DIO${vector_idx}: cio_${sig["name"]}<% vector_idx -= 1 %> |
| 786 | % endif |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 787 | % endif |
| 788 | % endfor |
| 789 | }; |
| 790 | |
Michael Schaffner | dbd087e | 2021-02-12 17:58:30 -0800 | [diff] [blame] | 791 | // Output-only DIOs have no p2d signal<% vector_idx = num_dio - 1 %> |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 792 | % for sig in top["pinmux"]["dio"]: |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 793 | % if sig["type"] in ["input", "inout"]: |
Michael Schaffner | dbd087e | 2021-02-12 17:58:30 -0800 | [diff] [blame] | 794 | % if sig["width"] > 1: |
| 795 | % for i in range(sig["width"]-1,-1,-1): |
| 796 | assign cio_${sig["name"]}_p2d[${i}]${" " * (max_diolength - len(str(i)) - 2 - len(sig["name"]))} = dio_p2d[${vector_idx}]; // DIO${vector_idx}<% vector_idx -= 1 %> |
| 797 | % endfor |
| 798 | % else: |
| 799 | assign cio_${sig["name"]}_p2d${" " * (max_diolength - len(sig["name"]))} = dio_p2d[${vector_idx}]; // DIO${vector_idx}<% vector_idx -= 1 %> |
| 800 | % endif |
Michael Schaffner | 6015796 | 2020-05-01 19:11:28 -0700 | [diff] [blame] | 801 | % else: |
Michael Schaffner | dbd087e | 2021-02-12 17:58:30 -0800 | [diff] [blame] | 802 | % if sig["width"] > 1: |
| 803 | % for i in range(sig["width"]-1,-1,-1): |
| 804 | // DIO${vector_idx}: cio_${sig["name"]}[${i}] // DIO${vector_idx}<% vector_idx -= 1 %> |
| 805 | % endfor |
| 806 | % else: |
| 807 | // DIO${vector_idx}: cio_${sig["name"]} // DIO${vector_idx}<% vector_idx -= 1 %> |
| 808 | % endif |
Michael Schaffner | 57c490d | 2020-04-29 15:08:55 -0700 | [diff] [blame] | 809 | % endif |
Eunchan Kim | 436d224 | 2019-10-29 17:25:51 -0700 | [diff] [blame] | 810 | % endfor |
| 811 | % endif |
| 812 | |
Nils Graf | 78607aa | 2019-09-16 15:47:23 -0700 | [diff] [blame] | 813 | // make sure scanmode_i is never X (including during reset) |
Eunchan Kim | 57071c0 | 2020-08-07 13:59:05 -0700 | [diff] [blame] | 814 | `ASSERT_KNOWN(scanmodeKnown, scanmode_i, clk_main_i, 0) |
Nils Graf | 78607aa | 2019-09-16 15:47:23 -0700 | [diff] [blame] | 815 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 816 | endmodule |