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 | // Register Top module auto-generated by `reggen` |
| 6 | <% |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 7 | from reggen import gen_rtl |
| 8 | from reggen.access import HwAccess, SwRdAccess, SwWrAccess |
Rupert Swarbrick | 269bb3d | 2021-02-23 15:41:56 +0000 | [diff] [blame] | 9 | from reggen.lib import get_basename |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 10 | from reggen.register import Register |
| 11 | from reggen.multi_register import MultiRegister |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 12 | |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 13 | num_wins = len(rb.windows) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 14 | num_wins_width = ((num_wins+1).bit_length()) - 1 |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 15 | num_reg_dsp = 1 if rb.all_regs else 0 |
| 16 | num_dsp = num_wins + num_reg_dsp |
| 17 | regs_flat = rb.flat_regs |
Rupert Swarbrick | 1db6fcd | 2021-02-11 14:56:20 +0000 | [diff] [blame] | 18 | max_regs_char = len("{}".format(len(regs_flat) - 1)) |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 19 | addr_width = rb.get_addr_width() |
Rupert Swarbrick | 269bb3d | 2021-02-23 15:41:56 +0000 | [diff] [blame] | 20 | |
| 21 | lblock = block.name.lower() |
| 22 | ublock = lblock.upper() |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 23 | |
| 24 | u_mod_base = mod_base.upper() |
| 25 | |
| 26 | reg2hw_t = gen_rtl.get_iface_tx_type(block, if_name, False) |
| 27 | hw2reg_t = gen_rtl.get_iface_tx_type(block, if_name, True) |
| 28 | |
| 29 | # Calculate whether we're going to need an AW parameter. We use it if there |
| 30 | # are any registers (obviously). We also use it if there are any windows that |
| 31 | # don't start at zero and end at 1 << addr_width (see the "addr_checks" |
| 32 | # calculation below for where that comes from). |
| 33 | needs_aw = (bool(regs_flat) or |
| 34 | num_wins > 1 or |
| 35 | rb.windows and ( |
| 36 | rb.windows[0].offset != 0 or |
| 37 | rb.windows[0].size_in_bytes != (1 << addr_width))) |
| 38 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 39 | %> |
Greg Chadwick | cf42308 | 2020-02-05 16:52:23 +0000 | [diff] [blame] | 40 | `include "prim_assert.sv" |
| 41 | |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 42 | module ${mod_name} ( |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 43 | input clk_i, |
| 44 | input rst_ni, |
| 45 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 46 | input tlul_pkg::tl_h2d_t tl_i, |
| 47 | output tlul_pkg::tl_d2h_t tl_o, |
| 48 | % if num_wins != 0: |
| 49 | |
| 50 | // Output port for window |
| 51 | output tlul_pkg::tl_h2d_t tl_win_o [${num_wins}], |
| 52 | input tlul_pkg::tl_d2h_t tl_win_i [${num_wins}], |
| 53 | |
| 54 | % endif |
| 55 | // To HW |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 56 | % if rb.get_n_bits(["q","qe","re"]): |
| 57 | output ${lblock}_reg_pkg::${reg2hw_t} reg2hw, // Write |
Michael Schaffner | 9a92bea | 2019-09-30 18:13:14 -0700 | [diff] [blame] | 58 | % endif |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 59 | % if rb.get_n_bits(["d","de"]): |
| 60 | input ${lblock}_reg_pkg::${hw2reg_t} hw2reg, // Read |
Michael Schaffner | 9a92bea | 2019-09-30 18:13:14 -0700 | [diff] [blame] | 61 | % endif |
Eunchan Kim | de88e3a | 2019-09-23 11:06:41 -0700 | [diff] [blame] | 62 | |
Timothy Chen | aa6c1ed | 2021-03-01 16:20:11 -0800 | [diff] [blame] | 63 | // Integrity check errors |
| 64 | output logic intg_err_o, |
| 65 | |
Eunchan Kim | de88e3a | 2019-09-23 11:06:41 -0700 | [diff] [blame] | 66 | // Config |
| 67 | input devmode_i // If 1, explicit error return for unmapped register access |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 68 | ); |
| 69 | |
Rupert Swarbrick | 269bb3d | 2021-02-23 15:41:56 +0000 | [diff] [blame] | 70 | import ${lblock}_reg_pkg::* ; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 71 | |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 72 | % if needs_aw: |
Rupert Swarbrick | 269bb3d | 2021-02-23 15:41:56 +0000 | [diff] [blame] | 73 | localparam int AW = ${addr_width}; |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 74 | % endif |
| 75 | % if rb.all_regs: |
Rupert Swarbrick | 269bb3d | 2021-02-23 15:41:56 +0000 | [diff] [blame] | 76 | localparam int DW = ${block.regwidth}; |
Michael Schaffner | 1b5fa9f | 2020-01-17 17:43:42 -0800 | [diff] [blame] | 77 | localparam int DBW = DW/8; // Byte Width |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 78 | |
| 79 | // register signals |
Eunchan Kim | 819a466 | 2019-09-04 21:44:36 -0700 | [diff] [blame] | 80 | logic reg_we; |
| 81 | logic reg_re; |
| 82 | logic [AW-1:0] reg_addr; |
| 83 | logic [DW-1:0] reg_wdata; |
| 84 | logic [DBW-1:0] reg_be; |
| 85 | logic [DW-1:0] reg_rdata; |
| 86 | logic reg_error; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 87 | |
Eunchan Kim | 51461cd | 2019-09-18 14:00:49 -0700 | [diff] [blame] | 88 | logic addrmiss, wr_err; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 89 | |
Eunchan Kim | 819a466 | 2019-09-04 21:44:36 -0700 | [diff] [blame] | 90 | logic [DW-1:0] reg_rdata_next; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 91 | |
| 92 | tlul_pkg::tl_h2d_t tl_reg_h2d; |
| 93 | tlul_pkg::tl_d2h_t tl_reg_d2h; |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 94 | % endif |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 95 | |
Timothy Chen | d12569f | 2021-02-12 15:28:12 -0800 | [diff] [blame] | 96 | // incoming payload check |
Timothy Chen | aa6c1ed | 2021-03-01 16:20:11 -0800 | [diff] [blame] | 97 | logic intg_err; |
| 98 | tlul_cmd_intg_chk u_chk ( |
Timothy Chen | d12569f | 2021-02-12 15:28:12 -0800 | [diff] [blame] | 99 | .tl_i, |
Timothy Chen | 915df69 | 2021-03-05 13:16:36 -0800 | [diff] [blame] | 100 | .err_o(intg_err) |
Timothy Chen | d12569f | 2021-02-12 15:28:12 -0800 | [diff] [blame] | 101 | ); |
| 102 | |
Timothy Chen | 915df69 | 2021-03-05 13:16:36 -0800 | [diff] [blame] | 103 | logic intg_err_q; |
Timothy Chen | aa6c1ed | 2021-03-01 16:20:11 -0800 | [diff] [blame] | 104 | always_ff @(posedge clk_i or negedge rst_ni) begin |
| 105 | if (!rst_ni) begin |
Timothy Chen | 915df69 | 2021-03-05 13:16:36 -0800 | [diff] [blame] | 106 | intg_err_q <= '0; |
Timothy Chen | aa6c1ed | 2021-03-01 16:20:11 -0800 | [diff] [blame] | 107 | end else if (intg_err) begin |
Timothy Chen | 915df69 | 2021-03-05 13:16:36 -0800 | [diff] [blame] | 108 | intg_err_q <= 1'b1; |
Timothy Chen | aa6c1ed | 2021-03-01 16:20:11 -0800 | [diff] [blame] | 109 | end |
| 110 | end |
| 111 | |
Timothy Chen | 915df69 | 2021-03-05 13:16:36 -0800 | [diff] [blame] | 112 | // integrity error output is permanent and should be used for alert generation |
| 113 | // register errors are transactional |
| 114 | assign intg_err_o = intg_err_q | intg_err; |
| 115 | |
Timothy Chen | aa6c1ed | 2021-03-01 16:20:11 -0800 | [diff] [blame] | 116 | // outgoing integrity generation |
Timothy Chen | d12569f | 2021-02-12 15:28:12 -0800 | [diff] [blame] | 117 | tlul_pkg::tl_d2h_t tl_o_pre; |
Timothy Chen | aa6c1ed | 2021-03-01 16:20:11 -0800 | [diff] [blame] | 118 | tlul_rsp_intg_gen u_rsp_intg_gen ( |
Timothy Chen | d12569f | 2021-02-12 15:28:12 -0800 | [diff] [blame] | 119 | .tl_i(tl_o_pre), |
| 120 | .tl_o |
| 121 | ); |
| 122 | |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 123 | % if num_dsp == 1: |
| 124 | ## Either no windows (and just registers) or no registers and only |
| 125 | ## one window. |
| 126 | % if num_wins == 0: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 127 | assign tl_reg_h2d = tl_i; |
Timothy Chen | d12569f | 2021-02-12 15:28:12 -0800 | [diff] [blame] | 128 | assign tl_o_pre = tl_reg_d2h; |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 129 | % else: |
| 130 | assign tl_win_o[0] = tl_i; |
| 131 | assign tl_o_pre = tl_win_i[0]; |
| 132 | % endif |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 133 | % else: |
| 134 | tlul_pkg::tl_h2d_t tl_socket_h2d [${num_dsp}]; |
| 135 | tlul_pkg::tl_d2h_t tl_socket_d2h [${num_dsp}]; |
| 136 | |
| 137 | logic [${num_wins_width}:0] reg_steer; |
| 138 | |
| 139 | // socket_1n connection |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 140 | % if rb.all_regs: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 141 | assign tl_reg_h2d = tl_socket_h2d[${num_wins}]; |
| 142 | assign tl_socket_d2h[${num_wins}] = tl_reg_d2h; |
| 143 | |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 144 | % endif |
| 145 | % for i,t in enumerate(rb.windows): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 146 | assign tl_win_o[${i}] = tl_socket_h2d[${i}]; |
| 147 | assign tl_socket_d2h[${i}] = tl_win_i[${i}]; |
| 148 | % endfor |
| 149 | |
| 150 | // Create Socket_1n |
| 151 | tlul_socket_1n #( |
| 152 | .N (${num_dsp}), |
| 153 | .HReqPass (1'b1), |
| 154 | .HRspPass (1'b1), |
| 155 | .DReqPass ({${num_dsp}{1'b1}}), |
| 156 | .DRspPass ({${num_dsp}{1'b1}}), |
Eunchan Kim | 32dd11b | 2019-11-05 15:15:33 -0800 | [diff] [blame] | 157 | .HReqDepth (4'h0), |
| 158 | .HRspDepth (4'h0), |
| 159 | .DReqDepth ({${num_dsp}{4'h0}}), |
| 160 | .DRspDepth ({${num_dsp}{4'h0}}) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 161 | ) u_socket ( |
| 162 | .clk_i, |
| 163 | .rst_ni, |
| 164 | .tl_h_i (tl_i), |
Timothy Chen | d12569f | 2021-02-12 15:28:12 -0800 | [diff] [blame] | 165 | .tl_h_o (tl_o_pre), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 166 | .tl_d_o (tl_socket_h2d), |
| 167 | .tl_d_i (tl_socket_d2h), |
Scott Johnson | 204d98d | 2020-07-17 12:06:05 -0700 | [diff] [blame] | 168 | .dev_select_i (reg_steer) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 169 | ); |
| 170 | |
| 171 | // Create steering logic |
| 172 | always_comb begin |
| 173 | reg_steer = ${num_dsp-1}; // Default set to register |
| 174 | |
| 175 | // TODO: Can below codes be unique case () inside ? |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 176 | % for i,w in enumerate(rb.windows): |
Rupert Swarbrick | bc2bc58 | 2021-02-09 13:30:37 +0000 | [diff] [blame] | 177 | <% |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 178 | base_addr = w.offset |
| 179 | limit_addr = w.offset + w.size_in_bytes |
| 180 | |
| 181 | hi_check = 'tl_i.a_address[AW-1:0] < {}'.format(limit_addr) |
| 182 | addr_checks = [] |
| 183 | if base_addr > 0: |
| 184 | addr_checks.append('tl_i.a_address[AW-1:0] >= {}'.format(base_addr)) |
| 185 | if limit_addr < 2**addr_width: |
| 186 | addr_checks.append('tl_i.a_address[AW-1:0] < {}'.format(limit_addr)) |
| 187 | |
| 188 | addr_test = ' && '.join(addr_checks) |
Rupert Swarbrick | bc2bc58 | 2021-02-09 13:30:37 +0000 | [diff] [blame] | 189 | %>\ |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 190 | % if addr_test: |
| 191 | if (${addr_test}) begin |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 192 | % endif |
| 193 | reg_steer = ${i}; |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 194 | % if addr_test: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 195 | end |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 196 | % endif |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 197 | % endfor |
Timothy Chen | aa6c1ed | 2021-03-01 16:20:11 -0800 | [diff] [blame] | 198 | if (intg_err) begin |
Timothy Chen | d12569f | 2021-02-12 15:28:12 -0800 | [diff] [blame] | 199 | reg_steer = ${num_dsp-1}; |
| 200 | end |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 201 | end |
| 202 | % endif |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 203 | % if rb.all_regs: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 204 | |
Eunchan Kim | 819a466 | 2019-09-04 21:44:36 -0700 | [diff] [blame] | 205 | tlul_adapter_reg #( |
| 206 | .RegAw(AW), |
| 207 | .RegDw(DW) |
| 208 | ) u_reg_if ( |
| 209 | .clk_i, |
| 210 | .rst_ni, |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 211 | |
Eunchan Kim | 819a466 | 2019-09-04 21:44:36 -0700 | [diff] [blame] | 212 | .tl_i (tl_reg_h2d), |
| 213 | .tl_o (tl_reg_d2h), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 214 | |
Eunchan Kim | 819a466 | 2019-09-04 21:44:36 -0700 | [diff] [blame] | 215 | .we_o (reg_we), |
| 216 | .re_o (reg_re), |
| 217 | .addr_o (reg_addr), |
| 218 | .wdata_o (reg_wdata), |
| 219 | .be_o (reg_be), |
| 220 | .rdata_i (reg_rdata), |
| 221 | .error_i (reg_error) |
| 222 | ); |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 223 | |
Eunchan Kim | 819a466 | 2019-09-04 21:44:36 -0700 | [diff] [blame] | 224 | assign reg_rdata = reg_rdata_next ; |
Timothy Chen | aa6c1ed | 2021-03-01 16:20:11 -0800 | [diff] [blame] | 225 | assign reg_error = (devmode_i & addrmiss) | wr_err | intg_err; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 226 | |
| 227 | // Define SW related signals |
| 228 | // Format: <reg>_<field>_{wd|we|qs} |
| 229 | // or <reg>_{wd|we|qs} if field == 1 or 0 |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 230 | % for r in regs_flat: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 231 | % if len(r.fields) == 1: |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 232 | ${sig_gen(r.fields[0], r.name.lower(), r.hwext, r.shadowed)}\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 233 | % else: |
| 234 | % for f in r.fields: |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 235 | ${sig_gen(f, r.name.lower() + "_" + f.name.lower(), r.hwext, r.shadowed)}\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 236 | % endfor |
| 237 | % endif |
| 238 | % endfor |
| 239 | |
| 240 | // Register instances |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 241 | % for r in rb.all_regs: |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 242 | ######################## multiregister ########################### |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 243 | % if isinstance(r, MultiRegister): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 244 | <% |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 245 | k = 0 |
| 246 | %> |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 247 | % for sr in r.regs: |
| 248 | // Subregister ${k} of Multireg ${r.reg.name.lower()} |
| 249 | // R[${sr.name.lower()}]: V(${str(sr.hwext)}) |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 250 | % if len(sr.fields) == 1: |
| 251 | <% |
| 252 | f = sr.fields[0] |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 253 | finst_name = sr.name.lower() |
| 254 | fsig_name = r.reg.name.lower() + "[%d]" % k |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 255 | k = k + 1 |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 256 | %> |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 257 | ${finst_gen(f, finst_name, fsig_name, sr.hwext, sr.regwen, sr.shadowed)} |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 258 | % else: |
| 259 | % for f in sr.fields: |
| 260 | <% |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 261 | finst_name = sr.name.lower() + "_" + f.name.lower() |
| 262 | if r.is_homogeneous(): |
| 263 | fsig_name = r.reg.name.lower() + "[%d]" % k |
Michael Schaffner | a2c51d9 | 2019-09-27 16:38:24 -0700 | [diff] [blame] | 264 | k = k + 1 |
| 265 | else: |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 266 | fsig_name = r.reg.name.lower() + "[%d]" % k + "." + get_basename(f.name.lower()) |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 267 | %> |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 268 | // F[${f.name.lower()}]: ${f.bits.msb}:${f.bits.lsb} |
| 269 | ${finst_gen(f, finst_name, fsig_name, sr.hwext, sr.regwen, sr.shadowed)} |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 270 | % endfor |
Michael Schaffner | a2c51d9 | 2019-09-27 16:38:24 -0700 | [diff] [blame] | 271 | <% |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 272 | if not r.is_homogeneous(): |
Michael Schaffner | a2c51d9 | 2019-09-27 16:38:24 -0700 | [diff] [blame] | 273 | k += 1 |
| 274 | %> |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 275 | % endif |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 276 | ## for: mreg_flat |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 277 | % endfor |
| 278 | ######################## register with single field ########################### |
| 279 | % elif len(r.fields) == 1: |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 280 | // R[${r.name.lower()}]: V(${str(r.hwext)}) |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 281 | <% |
| 282 | f = r.fields[0] |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 283 | finst_name = r.name.lower() |
| 284 | fsig_name = r.name.lower() |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 285 | %> |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 286 | ${finst_gen(f, finst_name, fsig_name, r.hwext, r.regwen, r.shadowed)} |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 287 | ######################## register with multiple fields ########################### |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 288 | % else: |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 289 | // R[${r.name.lower()}]: V(${str(r.hwext)}) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 290 | % for f in r.fields: |
| 291 | <% |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 292 | finst_name = r.name.lower() + "_" + f.name.lower() |
| 293 | fsig_name = r.name.lower() + "." + f.name.lower() |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 294 | %> |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 295 | // F[${f.name.lower()}]: ${f.bits.msb}:${f.bits.lsb} |
| 296 | ${finst_gen(f, finst_name, fsig_name, r.hwext, r.regwen, r.shadowed)} |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 297 | % endfor |
| 298 | % endif |
| 299 | |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 300 | ## for: rb.all_regs |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 301 | % endfor |
| 302 | |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 303 | |
| 304 | logic [${len(regs_flat)-1}:0] addr_hit; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 305 | always_comb begin |
| 306 | addr_hit = '0; |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 307 | % for i,r in enumerate(regs_flat): |
Rupert Swarbrick | 269bb3d | 2021-02-23 15:41:56 +0000 | [diff] [blame] | 308 | addr_hit[${"{}".format(i).rjust(max_regs_char)}] = (reg_addr == ${ublock}_${r.name.upper()}_OFFSET); |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 309 | % endfor |
| 310 | end |
| 311 | |
Eunchan Kim | 244a1d5 | 2019-09-23 15:46:43 -0700 | [diff] [blame] | 312 | assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 313 | |
Eunchan Kim | 51461cd | 2019-09-18 14:00:49 -0700 | [diff] [blame] | 314 | // Check sub-word write is permitted |
| 315 | always_comb begin |
| 316 | wr_err = 1'b0; |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 317 | % for i,r in enumerate(regs_flat): |
Eunchan Kim | 51461cd | 2019-09-18 14:00:49 -0700 | [diff] [blame] | 318 | <% index_str = "{}".format(i).rjust(max_regs_char) %>\ |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 319 | if (addr_hit[${index_str}] && reg_we && (${u_mod_base}_PERMIT[${index_str}] != (${u_mod_base}_PERMIT[${index_str}] & reg_be))) wr_err = 1'b1 ; |
Eunchan Kim | 51461cd | 2019-09-18 14:00:49 -0700 | [diff] [blame] | 320 | % endfor |
| 321 | end |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 322 | % for i, r in enumerate(regs_flat): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 323 | % if len(r.fields) == 1: |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 324 | ${we_gen(r.fields[0], r.name.lower(), r.hwext, r.shadowed, i)}\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 325 | % else: |
| 326 | % for f in r.fields: |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 327 | ${we_gen(f, r.name.lower() + "_" + f.name.lower(), r.hwext, r.shadowed, i)}\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 328 | % endfor |
| 329 | % endif |
| 330 | % endfor |
| 331 | |
| 332 | // Read data return |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 333 | always_comb begin |
| 334 | reg_rdata_next = '0; |
| 335 | unique case (1'b1) |
Michael Schaffner | 9a94b6c | 2019-09-25 16:17:35 -0700 | [diff] [blame] | 336 | % for i, r in enumerate(regs_flat): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 337 | % if len(r.fields) == 1: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 338 | addr_hit[${i}]: begin |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 339 | ${rdata_gen(r.fields[0], r.name.lower())}\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 340 | end |
| 341 | |
| 342 | % else: |
| 343 | addr_hit[${i}]: begin |
| 344 | % for f in r.fields: |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 345 | ${rdata_gen(f, r.name.lower() + "_" + f.name.lower())}\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 346 | % endfor |
| 347 | end |
| 348 | |
| 349 | % endif |
| 350 | % endfor |
| 351 | default: begin |
| 352 | reg_rdata_next = '1; |
| 353 | end |
| 354 | endcase |
| 355 | end |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 356 | % endif |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 357 | |
Timothy Chen | ac6af87 | 2021-02-22 17:17:52 -0800 | [diff] [blame] | 358 | // Unused signal tieoff |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 359 | % if rb.all_regs: |
Timothy Chen | ac6af87 | 2021-02-22 17:17:52 -0800 | [diff] [blame] | 360 | |
| 361 | // wdata / byte enable are not always fully used |
| 362 | // add a blanket unused statement to handle lint waivers |
| 363 | logic unused_wdata; |
| 364 | logic unused_be; |
| 365 | assign unused_wdata = ^reg_wdata; |
| 366 | assign unused_be = ^reg_be; |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 367 | % else: |
| 368 | // devmode_i is not used if there are no registers |
| 369 | logic unused_devmode; |
| 370 | assign unused_devmode = ^devmode_i; |
| 371 | % endif |
| 372 | % if rb.all_regs: |
Timothy Chen | ac6af87 | 2021-02-22 17:17:52 -0800 | [diff] [blame] | 373 | |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 374 | // Assertions for Register Interface |
Greg Chadwick | 46ede4b | 2020-01-14 12:46:39 +0000 | [diff] [blame] | 375 | `ASSERT_PULSE(wePulse, reg_we) |
| 376 | `ASSERT_PULSE(rePulse, reg_re) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 377 | |
Greg Chadwick | 46ede4b | 2020-01-14 12:46:39 +0000 | [diff] [blame] | 378 | `ASSERT(reAfterRv, $rose(reg_re || reg_we) |=> tl_o.d_valid) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 379 | |
Greg Chadwick | 46ede4b | 2020-01-14 12:46:39 +0000 | [diff] [blame] | 380 | `ASSERT(en2addrHit, (reg_we || reg_re) |-> $onehot0(addr_hit)) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 381 | |
Michael Schaffner | ee9e8db | 2019-10-22 17:49:51 -0700 | [diff] [blame] | 382 | // this is formulated as an assumption such that the FPV testbenches do disprove this |
| 383 | // property by mistake |
Timothy Chen | 27b0a64 | 2021-02-16 14:02:08 -0800 | [diff] [blame] | 384 | //`ASSUME(reqParity, tl_reg_h2d.a_valid |-> tl_reg_h2d.a_user.chk_en == tlul_pkg::CheckDis) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 385 | |
Rupert Swarbrick | 200d8b4 | 2021-03-08 12:32:11 +0000 | [diff] [blame] | 386 | % endif |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 387 | endmodule |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 388 | <%def name="str_bits_sv(bits)">\ |
| 389 | % if bits.msb != bits.lsb: |
| 390 | ${bits.msb}:${bits.lsb}\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 391 | % else: |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 392 | ${bits.msb}\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 393 | % endif |
| 394 | </%def>\ |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 395 | <%def name="str_arr_sv(bits)">\ |
| 396 | % if bits.msb != bits.lsb: |
| 397 | [${bits.msb-bits.lsb}:0] \ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 398 | % endif |
| 399 | </%def>\ |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 400 | <%def name="sig_gen(field, sig_name, hwext, shadowed)">\ |
| 401 | % if field.swaccess.allows_read(): |
| 402 | logic ${str_arr_sv(field.bits)}${sig_name}_qs; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 403 | % endif |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 404 | % if field.swaccess.allows_write(): |
| 405 | logic ${str_arr_sv(field.bits)}${sig_name}_wd; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 406 | logic ${sig_name}_we; |
| 407 | % endif |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 408 | % if (field.swaccess.allows_read() and hwext) or shadowed: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 409 | logic ${sig_name}_re; |
| 410 | % endif |
| 411 | </%def>\ |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 412 | <%def name="finst_gen(field, finst_name, fsig_name, hwext, regwen, shadowed)">\ |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 413 | % if hwext: ## if hwext, instantiate prim_subreg_ext |
| 414 | prim_subreg_ext #( |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 415 | .DW (${field.bits.width()}) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 416 | ) u_${finst_name} ( |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 417 | % if field.swaccess.allows_read(): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 418 | .re (${finst_name}_re), |
| 419 | % else: |
| 420 | .re (1'b0), |
| 421 | % endif |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 422 | % if field.swaccess.allows_write(): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 423 | % if regwen: |
| 424 | // qualified with register enable |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 425 | .we (${finst_name}_we & ${regwen.lower()}_qs), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 426 | % else: |
| 427 | .we (${finst_name}_we), |
| 428 | % endif |
| 429 | .wd (${finst_name}_wd), |
| 430 | % else: |
| 431 | .we (1'b0), |
| 432 | .wd ('0), |
| 433 | % endif |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 434 | % if field.hwaccess.allows_write(): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 435 | .d (hw2reg.${fsig_name}.d), |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 436 | % else: |
| 437 | .d ('0), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 438 | % endif |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 439 | % if field.hwre or shadowed: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 440 | .qre (reg2hw.${fsig_name}.re), |
| 441 | % else: |
| 442 | .qre (), |
| 443 | % endif |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 444 | % if not field.hwaccess.allows_read(): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 445 | .qe (), |
| 446 | .q (), |
| 447 | % else: |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 448 | % if field.hwqe: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 449 | .qe (reg2hw.${fsig_name}.qe), |
| 450 | % else: |
| 451 | .qe (), |
| 452 | % endif |
| 453 | .q (reg2hw.${fsig_name}.q ), |
| 454 | % endif |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 455 | % if field.swaccess.allows_read(): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 456 | .qs (${finst_name}_qs) |
| 457 | % else: |
| 458 | .qs () |
| 459 | % endif |
| 460 | ); |
Pirmin Vogel | ab9d1ca | 2020-05-25 14:52:55 +0200 | [diff] [blame] | 461 | % else: ## if not hwext, instantiate prim_subreg, prim_subreg_shadow or constant assign |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 462 | % if ((not field.hwaccess.allows_read() and\ |
| 463 | not field.hwaccess.allows_write() and\ |
| 464 | field.swaccess.swrd() == SwRdAccess.RD and\ |
| 465 | not field.swaccess.allows_write())): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 466 | // constant-only read |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 467 | assign ${finst_name}_qs = ${field.bits.width()}'h${"%x" % (field.resval or 0)}; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 468 | % else: ## not hwext not constant |
Pirmin Vogel | ab9d1ca | 2020-05-25 14:52:55 +0200 | [diff] [blame] | 469 | % if not shadowed: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 470 | prim_subreg #( |
Pirmin Vogel | ab9d1ca | 2020-05-25 14:52:55 +0200 | [diff] [blame] | 471 | % else: |
| 472 | prim_subreg_shadow #( |
| 473 | % endif |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 474 | .DW (${field.bits.width()}), |
| 475 | .SWACCESS("${field.swaccess.value[1].name.upper()}"), |
| 476 | .RESVAL (${field.bits.width()}'h${"%x" % (field.resval or 0)}) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 477 | ) u_${finst_name} ( |
| 478 | .clk_i (clk_i ), |
| 479 | .rst_ni (rst_ni ), |
| 480 | |
Pirmin Vogel | ab9d1ca | 2020-05-25 14:52:55 +0200 | [diff] [blame] | 481 | % if shadowed: |
| 482 | .re (${finst_name}_re), |
| 483 | % endif |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 484 | % if field.swaccess.allows_write(): ## non-RO types |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 485 | % if regwen: |
| 486 | // from register interface (qualified with register enable) |
Rupert Swarbrick | 4d64536 | 2021-02-08 17:17:05 +0000 | [diff] [blame] | 487 | .we (${finst_name}_we & ${regwen.lower()}_qs), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 488 | % else: |
| 489 | // from register interface |
| 490 | .we (${finst_name}_we), |
| 491 | % endif |
| 492 | .wd (${finst_name}_wd), |
| 493 | % else: ## RO types |
| 494 | .we (1'b0), |
| 495 | .wd ('0 ), |
| 496 | % endif |
| 497 | |
| 498 | // from internal hardware |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 499 | % if field.hwaccess.allows_write(): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 500 | .de (hw2reg.${fsig_name}.de), |
| 501 | .d (hw2reg.${fsig_name}.d ), |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 502 | % else: |
| 503 | .de (1'b0), |
| 504 | .d ('0 ), |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 505 | % endif |
| 506 | |
| 507 | // to internal hardware |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 508 | % if not field.hwaccess.allows_read(): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 509 | .qe (), |
| 510 | .q (), |
| 511 | % else: |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 512 | % if field.hwqe: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 513 | .qe (reg2hw.${fsig_name}.qe), |
| 514 | % else: |
| 515 | .qe (), |
| 516 | % endif |
| 517 | .q (reg2hw.${fsig_name}.q ), |
| 518 | % endif |
| 519 | |
Pirmin Vogel | ab9d1ca | 2020-05-25 14:52:55 +0200 | [diff] [blame] | 520 | % if not shadowed: |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 521 | % if field.swaccess.allows_read(): |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 522 | // to register interface (read) |
| 523 | .qs (${finst_name}_qs) |
Pirmin Vogel | ab9d1ca | 2020-05-25 14:52:55 +0200 | [diff] [blame] | 524 | % else: |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 525 | .qs () |
Pirmin Vogel | ab9d1ca | 2020-05-25 14:52:55 +0200 | [diff] [blame] | 526 | % endif |
| 527 | % else: |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 528 | % if field.swaccess.allows_read(): |
Pirmin Vogel | ab9d1ca | 2020-05-25 14:52:55 +0200 | [diff] [blame] | 529 | // to register interface (read) |
| 530 | .qs (${finst_name}_qs), |
| 531 | % else: |
| 532 | .qs (), |
| 533 | % endif |
| 534 | |
| 535 | // Shadow register error conditions |
| 536 | .err_update (reg2hw.${fsig_name}.err_update ), |
| 537 | .err_storage (reg2hw.${fsig_name}.err_storage) |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 538 | % endif |
| 539 | ); |
| 540 | % endif ## end non-constant prim_subreg |
| 541 | % endif |
| 542 | </%def>\ |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 543 | <%def name="we_gen(field, sig_name, hwext, shadowed, idx)">\ |
Rupert Swarbrick | 1032b47 | 2021-03-12 11:09:56 +0000 | [diff] [blame^] | 544 | <% |
| 545 | needs_we = field.swaccess.allows_write() |
| 546 | needs_re = (field.swaccess.allows_read() and hwext) or shadowed |
| 547 | space = '\n' if needs_we or needs_re else '' |
| 548 | %>\ |
| 549 | ${space}\ |
| 550 | % if needs_we: |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 551 | % if field.swaccess.swrd() != SwRdAccess.RC: |
Timothy Chen | a6f5829 | 2021-03-02 14:02:47 -0800 | [diff] [blame] | 552 | assign ${sig_name}_we = addr_hit[${idx}] & reg_we & !reg_error; |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 553 | assign ${sig_name}_wd = reg_wdata[${str_bits_sv(field.bits)}]; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 554 | % else: |
| 555 | ## Generate WE based on read request, read should clear |
Timothy Chen | a6f5829 | 2021-03-02 14:02:47 -0800 | [diff] [blame] | 556 | assign ${sig_name}_we = addr_hit[${idx}] & reg_re & !reg_error; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 557 | assign ${sig_name}_wd = '1; |
| 558 | % endif |
| 559 | % endif |
Rupert Swarbrick | 1032b47 | 2021-03-12 11:09:56 +0000 | [diff] [blame^] | 560 | % if needs_re: |
Timothy Chen | a6f5829 | 2021-03-02 14:02:47 -0800 | [diff] [blame] | 561 | assign ${sig_name}_re = addr_hit[${idx}] & reg_re & !reg_error; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 562 | % endif |
| 563 | </%def>\ |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 564 | <%def name="rdata_gen(field, sig_name)">\ |
| 565 | % if field.swaccess.allows_read(): |
| 566 | reg_rdata_next[${str_bits_sv(field.bits)}] = ${sig_name}_qs; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 567 | % else: |
Rupert Swarbrick | ede9480 | 2021-02-08 09:16:50 +0000 | [diff] [blame] | 568 | reg_rdata_next[${str_bits_sv(field.bits)}] = '0; |
lowRISC Contributors | 802543a | 2019-08-31 12:12:56 +0100 | [diff] [blame] | 569 | % endif |
| 570 | </%def>\ |