@@ -65,13 +65,19 @@ def axi_signals(w, id_width):
65
65
]
66
66
return signals
67
67
68
- def module_ports (w , name , id_width , is_input ):
68
+ def module_ports (w , intf , id_width , is_input ):
69
69
ports = []
70
70
for s in axi_signals (w , id_width ):
71
71
if s [0 ].endswith ('user' ) and not w .user :
72
72
continue
73
+ if s [0 ].startswith ('aw' ) and intf .read_only :
74
+ continue
75
+ if s [0 ].startswith ('w' ) and intf .read_only :
76
+ continue
77
+ if s [0 ].startswith ('b' ) and intf .read_only :
78
+ continue
73
79
prefix = 'o' if is_input == s [1 ] else 'i'
74
- ports .append (ModulePort ("{}_{}_{}" .format (prefix , name , s [0 ]),
80
+ ports .append (ModulePort ("{}_{}_{}" .format (prefix , intf . name , s [0 ]),
75
81
'output' if is_input == s [1 ] else 'input' ,
76
82
s [2 ]))
77
83
return ports
@@ -84,6 +90,8 @@ def assigns(w, max_idw, masters, slaves):
84
90
if s [0 ].endswith ('user' ) and not w .user :
85
91
continue
86
92
if s [1 ]:
93
+ if m .read_only and (s [0 ].startswith ('aw' ) or s [0 ].startswith ('w' ) or s [0 ].startswith ('b' )):
94
+ continue
87
95
src = "slave_{}[{}]" .format (s [0 ], i )
88
96
if s [0 ] in ['bid' , 'rid' ] and m .idw < max_idw :
89
97
src = src + '[{}:0]' .format (m .idw - 1 )
@@ -92,6 +100,8 @@ def assigns(w, max_idw, masters, slaves):
92
100
src = "i_{}_{}" .format (m .name , s [0 ])
93
101
if s [0 ] in ['arid' , 'awid' ] and m .idw < max_idw :
94
102
src = "{" + str (max_idw - m .idw )+ "'d0," + src + "}"
103
+ if m .read_only and (s [0 ].startswith ('aw' ) or s [0 ].startswith ('w' ) or s [0 ].startswith ('b' )):
104
+ src = "{}'d0" .format (max (1 ,s [2 ]))
95
105
raw += " assign slave_{}[{}] = {};\n " .format (s [0 ], i , src )
96
106
raw += " assign connectivity_map[{}] = {}'b{};\n " .format (i , len (slaves ), '1' * len (slaves ))
97
107
i += 1
@@ -146,29 +156,34 @@ def instance_ports(w, id_width, masters, slaves):
146
156
ports .append (Port ('cfg_connectivity_map_i' , "connectivity_map" ))
147
157
return ports
148
158
149
- def template_ports (w , name , id_width , is_input ):
159
+ def template_ports (w , intf , id_width , is_input ):
150
160
ports = []
151
161
for s in axi_signals (w , id_width ):
152
162
if s [0 ].endswith ('user' ) and not w .user :
153
163
continue
154
- port_name = "{}_{}" .format (name , s [0 ])
164
+ if intf .read_only and (s [0 ].startswith ('aw' ) or s [0 ].startswith ('w' ) or s [0 ].startswith ('b' )):
165
+ continue
166
+ port_name = "{}_{}" .format (intf .name , s [0 ])
155
167
prefix = 'o' if is_input == s [1 ] else 'i'
156
168
ports .append (Port ("{}_{}" .format (prefix , port_name ), port_name ))
157
169
return ports
158
170
159
- def template_wires (w , name , id_width ):
171
+ def template_wires (w , intf , id_width ):
160
172
wires = []
161
173
for s in axi_signals (w , id_width ):
162
174
if s [0 ].endswith ('user' ) and not w .user :
163
175
continue
164
- wires .append (Wire ("{}_{}" .format (name , s [0 ]), s [2 ]))
176
+ if intf .read_only and (s [0 ].startswith ('aw' ) or s [0 ].startswith ('w' ) or s [0 ].startswith ('b' )):
177
+ continue
178
+ wires .append (Wire ("{}_{}" .format (intf .name , s [0 ]), s [2 ]))
165
179
return wires
166
180
167
181
class Master :
168
182
def __init__ (self , name , d = None ):
169
183
self .name = name
170
184
self .slaves = []
171
185
self .idw = 1
186
+ self .read_only = False
172
187
if d :
173
188
self .load_dict (d )
174
189
@@ -179,7 +194,10 @@ def load_dict(self, d):
179
194
continue
180
195
if key == 'id_width' :
181
196
self .idw = value
197
+ elif key == 'read_only' :
198
+ self .read_only = value
182
199
else :
200
+ print (key )
183
201
raise UnknownPropertyError (
184
202
"Unknown property '%s' in master section '%s'" % (
185
203
key , self .name ))
@@ -191,6 +209,7 @@ def __init__(self, name, d=None):
191
209
self .offset = 0
192
210
self .size = 0
193
211
self .mask = 0
212
+ self .read_only = False
194
213
if d :
195
214
self .load_dict (d )
196
215
@@ -201,6 +220,8 @@ def load_dict(self, d):
201
220
elif key == 'size' :
202
221
self .size = value
203
222
self .mask = ~ (self .size - 1 ) & 0xffffffff
223
+ elif key == 'read_only' :
224
+ self .read_only = value
204
225
else :
205
226
raise UnknownPropertyError (
206
227
"Unknown property '%s' in slave section '%s'" % (
@@ -288,18 +309,18 @@ def write(self):
288
309
self .verilog_writer .add (ModulePort ('clk' , 'input' ))
289
310
self .verilog_writer .add (ModulePort ('rst_n' , 'input' ))
290
311
for master in self .masters :
291
- for port in module_ports (w , master . name , master .idw , True ):
312
+ for port in module_ports (w , master , master .idw , True ):
292
313
self .verilog_writer .add (port )
293
- for wire in template_wires (w , master . name , master .idw ):
314
+ for wire in template_wires (w , master , master .idw ):
294
315
self .template_writer .add (wire )
295
- _template_ports += template_ports (w , master . name , master .idw , True )
316
+ _template_ports += template_ports (w , master , master .idw , True )
296
317
297
318
for slave in self .slaves :
298
- for port in module_ports (w , slave . name , max_sidw , False ):
319
+ for port in module_ports (w , slave , max_sidw , False ):
299
320
self .verilog_writer .add (port )
300
- for wire in template_wires (w , slave . name , max_sidw ):
321
+ for wire in template_wires (w , slave , max_sidw ):
301
322
self .template_writer .add (wire )
302
- _template_ports += template_ports (w , slave . name , max_sidw , False )
323
+ _template_ports += template_ports (w , slave , max_sidw , False )
303
324
304
325
raw = ""
305
326
0 commit comments