mirror of
https://github.com/Silicon1602/srdl2sv.git
synced 2024-12-22 15:08:39 +00:00
Add SW read- and write wires, including assignment
This commit is contained in:
parent
4b9ad7ad1b
commit
7c4f681241
@ -26,42 +26,32 @@ class Register(Component):
|
|||||||
self.create_logger("{}.{}".format(self.owning_addrmap, self.path), config)
|
self.create_logger("{}.{}".format(self.owning_addrmap, self.path), config)
|
||||||
self.logger.debug('Starting to process register "{}"'.format(obj.inst_name))
|
self.logger.debug('Starting to process register "{}"'.format(obj.inst_name))
|
||||||
|
|
||||||
if obj.is_array:
|
|
||||||
sel_arr = 'array'
|
|
||||||
array_dimensions = obj.array_dimensions
|
|
||||||
else:
|
|
||||||
sel_arr = 'single'
|
|
||||||
array_dimensions = [1]
|
|
||||||
|
|
||||||
depth = '[{}]'.format(']['.join(f"{i}" for i in array_dimensions))
|
|
||||||
dimensions = len(array_dimensions)
|
|
||||||
|
|
||||||
# Create comment and provide user information about register he/she
|
# Create comment and provide user information about register he/she
|
||||||
# is looking at.
|
# is looking at.
|
||||||
self.rtl_header.append(
|
self.rtl_header.append(
|
||||||
Register.templ_dict['reg_comment'].format(
|
Register.templ_dict['reg_comment'].format(
|
||||||
name = obj.inst_name,
|
name = obj.inst_name,
|
||||||
dimensions = dimensions,
|
dimensions = self.dimensions,
|
||||||
depth = depth))
|
depth = self.depth))
|
||||||
|
|
||||||
# Create wires every register
|
# Create wires every register
|
||||||
self.rtl_header.append(
|
self.rtl_header.append(
|
||||||
Register.templ_dict['rw_wire_declare'].format(
|
Register.templ_dict['rw_wire_declare'].format(
|
||||||
name = obj.inst_name,
|
path = self.path,
|
||||||
depth = depth))
|
depth = self.depth))
|
||||||
|
|
||||||
# Create generate block for register and add comment
|
# Create generate block for register and add comment
|
||||||
self.rtl_header.append("generate")
|
self.rtl_header.append("generate")
|
||||||
for i in range(dimensions):
|
for i in range(self.dimensions):
|
||||||
self.rtl_header.append(
|
self.rtl_header.append(
|
||||||
Register.templ_dict['generate_for_start'].format(
|
Register.templ_dict['generate_for_start'].format(
|
||||||
iterator = chr(97+i),
|
iterator = chr(97+i),
|
||||||
limit = array_dimensions[i]))
|
limit = self.array_dimensions[i]))
|
||||||
|
|
||||||
# Create RTL for fields
|
# Create RTL for fields
|
||||||
# Fields should be in order in RTL,therefore, use list
|
# Fields should be in order in RTL,therefore, use list
|
||||||
for field in obj.fields():
|
for field in obj.fields():
|
||||||
field_obj = Field(field, array_dimensions, config)
|
field_obj = Field(field, self.array_dimensions, config)
|
||||||
|
|
||||||
if not config['disable_sanity']:
|
if not config['disable_sanity']:
|
||||||
field_obj.sanity_checks()
|
field_obj.sanity_checks()
|
||||||
@ -69,15 +59,30 @@ class Register(Component):
|
|||||||
self.children.append(field_obj)
|
self.children.append(field_obj)
|
||||||
|
|
||||||
# End loops
|
# End loops
|
||||||
for i in range(dimensions-1, -1, -1):
|
for i in range(self.dimensions-1, -1, -1):
|
||||||
self.rtl_footer.append(
|
self.rtl_footer.append(
|
||||||
Register.templ_dict['generate_for_end'].format(
|
Register.templ_dict['generate_for_end'].format(
|
||||||
dimension = chr(97+i)))
|
dimension = chr(97+i)))
|
||||||
|
|
||||||
|
# Assign variables from bus
|
||||||
|
self.obj.current_idx = [0]
|
||||||
|
|
||||||
|
self.rtl_header.append(
|
||||||
|
Register.templ_dict['rw_wire_assign'].format(
|
||||||
|
path = self.path,
|
||||||
|
addr = self.obj.absolute_address,
|
||||||
|
genvars = self.genvars_str,
|
||||||
|
genvars_sum =self.genvars_sum_str,
|
||||||
|
stride = self.obj.array_stride,
|
||||||
|
depth = self.depth))
|
||||||
|
|
||||||
def __process_variables(self, obj: node.RootNode):
|
def __process_variables(self, obj: node.RootNode):
|
||||||
# Save object
|
# Save object
|
||||||
self.obj = obj
|
self.obj = obj
|
||||||
|
|
||||||
|
# Save name
|
||||||
|
self.name = obj.inst_name
|
||||||
|
|
||||||
# Create full name
|
# Create full name
|
||||||
self.owning_addrmap = obj.owning_addrmap.inst_name
|
self.owning_addrmap = obj.owning_addrmap.inst_name
|
||||||
self.path = obj.get_path()\
|
self.path = obj.get_path()\
|
||||||
@ -86,4 +91,31 @@ class Register(Component):
|
|||||||
|
|
||||||
self.path_underscored = self.path.replace('.', '_')
|
self.path_underscored = self.path.replace('.', '_')
|
||||||
|
|
||||||
self.name = obj.inst_name
|
# Determine dimensions of register
|
||||||
|
if obj.is_array:
|
||||||
|
self.sel_arr = 'array'
|
||||||
|
self.array_dimensions = self.obj.array_dimensions
|
||||||
|
else:
|
||||||
|
self.sel_arr = 'single'
|
||||||
|
self.array_dimensions = [1]
|
||||||
|
|
||||||
|
self.depth = '[{}]'.format(']['.join(f"{i}" for i in self.array_dimensions))
|
||||||
|
self.dimensions = len(self.array_dimensions)
|
||||||
|
|
||||||
|
# Calculate how many genvars shall be added
|
||||||
|
genvars = ['[{}]'.format(chr(97+i)) for i in range(self.dimensions)]
|
||||||
|
self.genvars_str = ''.join(genvars)
|
||||||
|
|
||||||
|
# Determine value to compare address with
|
||||||
|
genvars_sum = []
|
||||||
|
for i in range(self.dimensions):
|
||||||
|
if i != 0:
|
||||||
|
genvars_sum.append("+")
|
||||||
|
genvars_sum.append("*".join(map(str,self.array_dimensions[self.dimensions-i:])))
|
||||||
|
genvars_sum.append("*")
|
||||||
|
|
||||||
|
genvars_sum.append(chr(97+self.dimensions-1-i))
|
||||||
|
|
||||||
|
self.genvars_sum_str = ''.join(genvars_sum)
|
||||||
|
print(self.genvars_sum_str)
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
rw_wire_declare: |
|
rw_wire_declare: |
|
||||||
logic {name}_wr {depth};
|
logic {path}_sw_wr {depth};
|
||||||
logic {name}_rd {depth};
|
logic {path}_sw_rd {depth};
|
||||||
rw_wire_assign: |
|
rw_wire_assign: |
|
||||||
assign {name}_bus_wr[i] = addr == {} && r_vld;
|
assign {path}_sw_wr{genvars} = addr == ({addr}+({genvars_sum})*{stride}) && r_vld;
|
||||||
assign {name}_bus_wr[i] = addr == {} && r_vld;
|
assign {path}_sw_rd{genvars} = addr == ({addr}+({genvars_sum})*{stride}) && w_vld;
|
||||||
reg_comment: |-
|
reg_comment: |-
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
*******************************************************************
|
*******************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user