blob: 728cd20aa57499997980ee5962f84471c6146e60 [file] [log] [blame]
lowRISC Contributors802543a2019-08-31 12:12:56 +01001// 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 Package auto-generated by `reggen` containing data structure
6
Eunchan Kim51461cd2019-09-18 14:00:49 -07007<%
Eunchan Kim668ea2e2019-11-12 15:44:08 -08008 from topgen import lib # TODO: Split lib to common lib module
Michael Schaffner9a94b6c2019-09-25 16:17:35 -07009 num_regs = block.get_n_regs_flat()
Eunchan Kim51461cd2019-09-18 14:00:49 -070010 max_regs_char = len("{}".format(num_regs-1))
11%>\
lowRISC Contributors802543a2019-08-31 12:12:56 +010012package ${block.name}_reg_pkg;
Eunchan Kimc4873f32019-09-25 12:46:12 -070013% if len(block.params) != 0:
14
15 // Param list
16% endif
Eunchan Kimb9931902019-09-26 14:16:40 -070017% for param in [p for p in block.params if p["local"] == "true"]:
Michael Schaffner1b5fa9f2020-01-17 17:43:42 -080018 parameter ${param["type"]} ${param["name"]} = ${param["default"]};
Eunchan Kimc4873f32019-09-25 12:46:12 -070019% endfor
lowRISC Contributors802543a2019-08-31 12:12:56 +010020
Eunchan Kim668ea2e2019-11-12 15:44:08 -080021 ////////////////////////////
22 // Typedefs for registers //
23 ////////////////////////////
Michael Schaffner9a94b6c2019-09-25 16:17:35 -070024% for r in block.regs:
Michael Schaffnera2c51d92019-09-27 16:38:24 -070025 ## in this case we have a homogeneous multireg, with only one replicated field
Eunchan Kim668ea2e2019-11-12 15:44:08 -080026 % if r.get_n_bits(["q"]) and r.ishomog:
27 typedef struct packed {
28 logic ${lib.bitarray(r.get_field_flat(0).get_n_bits(["q"]),2)} q;
29 % if r.get_field_flat(0).hwqe:
30 logic qe;
31 % endif
Pirmin Vogelab9d1ca2020-05-25 14:52:55 +020032 % if r.get_field_flat(0).hwre or (r.get_field_flat(0).shadowed and r.get_field_flat(0).hwext):
Eunchan Kim668ea2e2019-11-12 15:44:08 -080033 logic re;
34 % endif
Pirmin Vogelab9d1ca2020-05-25 14:52:55 +020035 % if r.get_field_flat(0).shadowed and not r.get_field_flat(0).hwext:
36 logic err_update;
37 logic err_storage;
38 % endif
Eunchan Kim668ea2e2019-11-12 15:44:08 -080039 } ${block.name + "_reg2hw_" + r.name + ("_mreg_t" if r.is_multi_reg() else "_reg_t")};
40
Michael Schaffnera2c51d92019-09-27 16:38:24 -070041 ## in this case we have an inhomogeneous multireg, with several different fields per register
Eunchan Kim668ea2e2019-11-12 15:44:08 -080042 % elif r.get_n_bits(["q"]) and not r.ishomog:
43 typedef struct packed {
Michael Schaffnera2c51d92019-09-27 16:38:24 -070044 % for f in r.get_reg_flat(0).fields:
Eunchan Kim668ea2e2019-11-12 15:44:08 -080045 % if f.get_n_bits(["q"]) >= 1:
46 struct packed {
47 logic ${lib.bitarray(f.get_n_bits(["q"]),2)} q;
Michael Schaffnera2c51d92019-09-27 16:38:24 -070048 % if f.hwqe:
Eunchan Kim668ea2e2019-11-12 15:44:08 -080049 logic qe;
Michael Schaffnera2c51d92019-09-27 16:38:24 -070050 % endif
Pirmin Vogelab9d1ca2020-05-25 14:52:55 +020051 % if f.hwre or (f.shadowed and f.hwext):
Eunchan Kim668ea2e2019-11-12 15:44:08 -080052 logic re;
Michael Schaffnera2c51d92019-09-27 16:38:24 -070053 % endif
Pirmin Vogelab9d1ca2020-05-25 14:52:55 +020054 % if f.shadowed and not f.hwext:
55 logic err_update;
56 logic err_storage;
57 % endif
Eunchan Kim668ea2e2019-11-12 15:44:08 -080058 } ${f.get_basename() if r.is_multi_reg() else f.name};
59 %endif
Michael Schaffnera2c51d92019-09-27 16:38:24 -070060 %endfor
Eunchan Kim668ea2e2019-11-12 15:44:08 -080061 } ${block.name + "_reg2hw_" + r.name + ("_mreg_t" if r.is_multi_reg() else "_reg_t")};
62
Michael Schaffnera2c51d92019-09-27 16:38:24 -070063 %endif
Michael Schaffner9a94b6c2019-09-25 16:17:35 -070064% endfor
65
Michael Schaffnera2c51d92019-09-27 16:38:24 -070066% for r in block.regs:
67 ## in this case we have a homogeneous multireg, with only one replicated field
Eunchan Kim668ea2e2019-11-12 15:44:08 -080068 % if r.get_n_bits(["d"]) and r.ishomog:
69 typedef struct packed {
70 logic ${lib.bitarray(r.get_field_flat(0).get_n_bits(["d"]),2)} d;
Michael Schaffnera2c51d92019-09-27 16:38:24 -070071 % if not r.get_reg_flat(0).hwext:
Eunchan Kim668ea2e2019-11-12 15:44:08 -080072 logic de;
Michael Schaffnera2c51d92019-09-27 16:38:24 -070073 % endif
Eunchan Kim668ea2e2019-11-12 15:44:08 -080074 } ${block.name + "_hw2reg_" + r.name + ("_mreg_t" if r.is_multi_reg() else "_reg_t")};
75
Michael Schaffnera2c51d92019-09-27 16:38:24 -070076 ## in this case we have an inhomogeneous multireg, with several different fields per register
Eunchan Kim668ea2e2019-11-12 15:44:08 -080077 % elif r.get_n_bits(["d"]) and not r.ishomog:
78 typedef struct packed {
Michael Schaffnera2c51d92019-09-27 16:38:24 -070079 % for f in r.get_reg_flat(0).fields:
Eunchan Kim668ea2e2019-11-12 15:44:08 -080080 % if f.get_n_bits(["d"]) >= 1:
81 struct packed {
82 logic ${lib.bitarray(f.get_n_bits(["d"]),2)} d;
Michael Schaffnera2c51d92019-09-27 16:38:24 -070083 % if not r.hwext:
Eunchan Kim668ea2e2019-11-12 15:44:08 -080084 logic de;
Michael Schaffnera2c51d92019-09-27 16:38:24 -070085 % endif
Eunchan Kim668ea2e2019-11-12 15:44:08 -080086 } ${f.get_basename() if r.is_multi_reg() else f.name};
87 %endif
Michael Schaffnera2c51d92019-09-27 16:38:24 -070088 %endfor
Eunchan Kim668ea2e2019-11-12 15:44:08 -080089 } ${block.name + "_hw2reg_" + r.name + ("_mreg_t" if r.is_multi_reg() else "_reg_t")};
90
Michael Schaffnera2c51d92019-09-27 16:38:24 -070091 % endif
92% endfor
93
Eunchan Kim668ea2e2019-11-12 15:44:08 -080094 ///////////////////////////////////////
95 // Register to internal design logic //
96 ///////////////////////////////////////
lowRISC Contributors802543a2019-08-31 12:12:56 +010097<%
Michael Schaffner9a94b6c2019-09-25 16:17:35 -070098nbits = block.get_n_bits(["q","qe","re"]) - 1
lowRISC Contributors802543a2019-08-31 12:12:56 +010099packbit = 0
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800100%>\
Michael Schaffner9a92bea2019-09-30 18:13:14 -0700101% if nbits > 0:
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800102 typedef struct packed {
lowRISC Contributors802543a2019-08-31 12:12:56 +0100103% for r in block.regs:
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700104 ######################## multiregister ###########################
105 % if r.is_multi_reg() and r.get_n_bits(["q"]):
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800106<%
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700107 array_dims = ""
Michael Schaffnerf9fe0052019-09-27 12:05:58 -0700108 for d in r.get_nested_dims():
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700109 array_dims += "[%d:0]" % (d-1)
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800110%>\
111 ${block.name + "_reg2hw_" + r.name + "_mreg_t"} ${array_dims} ${r.name}; // [${nbits - packbit}:${nbits - (packbit + r.get_n_bits(["q", "qe", "re"]) - 1)}]<% packbit += r.get_n_bits(["q", "qe", "re"]) %>\
112
113 ######################## register ###########################
114 % elif r.get_n_bits(["q"]):
lowRISC Contributors802543a2019-08-31 12:12:56 +0100115 ## Only one field, should use register name as it is
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800116 ${block.name + "_reg2hw_" + r.name + "_reg_t"} ${r.name}; // [${nbits - packbit}:${nbits - (packbit + r.get_n_bits(["q", "qe", "re"]) - 1)}]<% packbit += r.get_n_bits(["q", "qe", "re"]) %>\
117
lowRISC Contributors802543a2019-08-31 12:12:56 +0100118 % endif
119% endfor
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800120 } ${block.name}_reg2hw_t;
Michael Schaffner9a92bea2019-09-30 18:13:14 -0700121% endif
lowRISC Contributors802543a2019-08-31 12:12:56 +0100122
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800123 ///////////////////////////////////////
124 // Internal design logic to register //
125 ///////////////////////////////////////
lowRISC Contributors802543a2019-08-31 12:12:56 +0100126<%
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700127nbits = block.get_n_bits(["d","de"]) - 1
lowRISC Contributors802543a2019-08-31 12:12:56 +0100128packbit = 0
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800129%>\
Michael Schaffner9a92bea2019-09-30 18:13:14 -0700130% if nbits > 0:
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800131 typedef struct packed {
lowRISC Contributors802543a2019-08-31 12:12:56 +0100132% for r in block.regs:
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700133 ######################## multiregister ###########################
134 % if r.is_multi_reg() and r.get_n_bits(["d"]):
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800135<%
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700136 array_dims = ""
Michael Schaffnerf9fe0052019-09-27 12:05:58 -0700137 for d in r.get_nested_dims():
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700138 array_dims += "[%d:0]" % (d-1)
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800139%>\
140 ${block.name + "_hw2reg_" + r.name + "_mreg_t"} ${array_dims} ${r.name}; // [${nbits - packbit}:${nbits - (packbit + r.get_n_bits(["d", "de"]) - 1)}]<% packbit += r.get_n_bits(["d", "de"]) %>\
141
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700142 ######################## register with single field ###########################
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800143 % elif r.get_n_bits(["d"]):
lowRISC Contributors802543a2019-08-31 12:12:56 +0100144 ## Only one field, should use register name as it is
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800145 ${block.name + "_hw2reg_" + r.name + "_reg_t"} ${r.name}; // [${nbits - packbit}:${nbits - (packbit + r.get_n_bits(["q", "qe", "re"]) - 1)}]<% packbit += r.get_n_bits(["q", "qe", "re"]) %>\
146
lowRISC Contributors802543a2019-08-31 12:12:56 +0100147 % endif
148% endfor
Eunchan Kim668ea2e2019-11-12 15:44:08 -0800149 } ${block.name}_hw2reg_t;
Michael Schaffner9a92bea2019-09-30 18:13:14 -0700150% endif
lowRISC Contributors802543a2019-08-31 12:12:56 +0100151
152 // Register Address
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700153% for r in block.get_regs_flat():
Michael Schaffner1b5fa9f2020-01-17 17:43:42 -0800154 parameter logic [${block.addr_width-1}:0] ${block.name.upper()}_${r.name.upper()}_OFFSET = ${block.addr_width}'h ${"%x" % r.offset};
lowRISC Contributors802543a2019-08-31 12:12:56 +0100155% endfor
156
157% if len(block.wins) > 0:
158 // Window parameter
159% endif
160% for i,w in enumerate(block.wins):
Michael Schaffner1b5fa9f2020-01-17 17:43:42 -0800161 parameter logic [${block.addr_width-1}:0] ${block.name.upper()}_${w.name.upper()}_OFFSET = ${block.addr_width}'h ${"%x" % w.base_addr};
162 parameter logic [${block.addr_width-1}:0] ${block.name.upper()}_${w.name.upper()}_SIZE = ${block.addr_width}'h ${"%x" % (w.limit_addr - w.base_addr)};
lowRISC Contributors802543a2019-08-31 12:12:56 +0100163% endfor
164
Eunchan Kim51461cd2019-09-18 14:00:49 -0700165 // Register Index
166 typedef enum int {
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700167% for r in block.get_regs_flat():
Eunchan Kim51461cd2019-09-18 14:00:49 -0700168 ${block.name.upper()}_${r.name.upper()}${"" if loop.last else ","}
169% endfor
170 } ${block.name}_id_e;
171
172 // Register width information to check illegal writes
Michael Schaffner1b5fa9f2020-01-17 17:43:42 -0800173 parameter logic [3:0] ${block.name.upper()}_PERMIT [${block.get_n_regs_flat()}] = '{
Michael Schaffner9a94b6c2019-09-25 16:17:35 -0700174% for i,r in enumerate(block.get_regs_flat()):
Eunchan Kim51461cd2019-09-18 14:00:49 -0700175<% index_str = "{}".format(i).rjust(max_regs_char) %>\
Eunchan Kim534fb242019-10-08 12:05:35 -0700176 % if r.width > 24:
Eunchan Kimbc5d5142019-09-19 14:54:06 -0700177 4'b 1111${" " if i == num_regs-1 else ","} // index[${index_str}] ${block.name.upper()}_${r.name.upper()}
Eunchan Kim534fb242019-10-08 12:05:35 -0700178 % elif r.width > 16:
179 4'b 0111${" " if i == num_regs-1 else ","} // index[${index_str}] ${block.name.upper()}_${r.name.upper()}
Eunchan Kim51461cd2019-09-18 14:00:49 -0700180 % elif r.width > 8:
Eunchan Kimbc5d5142019-09-19 14:54:06 -0700181 4'b 0011${" " if i == num_regs-1 else ","} // index[${index_str}] ${block.name.upper()}_${r.name.upper()}
Eunchan Kim51461cd2019-09-18 14:00:49 -0700182 % else:
Eunchan Kimbc5d5142019-09-19 14:54:06 -0700183 4'b 0001${" " if i == num_regs-1 else ","} // index[${index_str}] ${block.name.upper()}_${r.name.upper()}
Eunchan Kim51461cd2019-09-18 14:00:49 -0700184 % endif
185% endfor
186 };
lowRISC Contributors802543a2019-08-31 12:12:56 +0100187endpackage
Eunchan Kim51461cd2019-09-18 14:00:49 -0700188