Skip to content

Commit a619ad9

Browse files
committed
memory model is updated for the variable datawidth of a mem image.
1 parent d1b9029 commit a619ad9

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

veriloggen/thread/ttypes.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import veriloggen.core.vtypes as vtypes
1010
import veriloggen.dataflow.dtypes as dtypes
1111
from veriloggen.dataflow.dataflow import DataflowManager
12+
1213
from veriloggen.seq.seq import Seq
1314
from veriloggen.fsm.fsm import FSM, TmpFSM
1415
from veriloggen.optimizer import try_optimize as optimize
@@ -1010,7 +1011,7 @@ def write_dataflow_interleave(self, port, addr, data, length=1,
10101011
ext_cond = dtypes.make_condition(cond)
10111012
data_cond = dtypes.make_condition(counter > 0, vtypes.Not(last))
10121013

1013-
if when is None or not isinstance(when, df_numeric):
1014+
if when is None or not isinstance(when, dtypes._Numeric):
10141015
raw_data, raw_valid = data.read(cond=data_cond)
10151016
else:
10161017
data_list, raw_valid = dtypes.read_multi(
@@ -1099,7 +1100,7 @@ def write_dataflow_pattern_interleave(self, port, addr, data, pattern,
10991100
ext_cond = dtypes.make_condition(cond)
11001101
data_cond = dtypes.make_condition(running, vtypes.Not(last))
11011102

1102-
if when is None or not isinstance(when, df_numeric):
1103+
if when is None or not isinstance(when, dtypes._Numeric):
11031104
raw_data, raw_valid = data.read(cond=data_cond)
11041105
else:
11051106
data_list, raw_valid = dtypes.read_multi(

veriloggen/types/axi.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3084,15 +3084,20 @@ class AxiMemoryModel(object):
30843084
burst_size_width = 8
30853085

30863086
def __init__(self, m, name, clk, rst,
3087-
datawidth=32, addrwidth=32, mem_addrwidth=20,
3087+
datawidth=32, addrwidth=32,
3088+
mem_datawidth=31, mem_addrwidth=20,
30883089
memimg=None, write_delay=10, read_delay=10, sleep=4):
30893090

3091+
if mem_datawidth % 8 != 0:
3092+
raise ValueError('mem_datawidth must be a multiple of 8')
3093+
30903094
self.m = m
30913095
self.name = name
30923096
self.clk = clk
30933097
self.rst = rst
30943098
self.datawidth = datawidth
30953099
self.addrwidth = addrwidth
3100+
self.mem_datawidth = mem_datawidth
30963101
self.mem_addrwidth = mem_addrwidth
30973102

30983103
itype = util.t_Reg
@@ -3113,8 +3118,9 @@ def __init__(self, m, name, clk, rst,
31133118
if memimg is None:
31143119
filename = '_'.join(['', self.name, 'memimg', '.out'])
31153120
size = 2 ** self.mem_addrwidth
3116-
wordsize = 4
3121+
wordsize = self.mem_datawidth // 8
31173122
self._make_img(filename, size, wordsize)
3123+
31183124
else:
31193125
filename = memimg
31203126

@@ -3130,11 +3136,9 @@ def __init__(self, m, name, clk, rst,
31303136
def _make_img(filename, size, wordsize):
31313137
with open(filename, 'w') as f:
31323138
for i in range(int(size // wordsize)):
3133-
s = '%08x' % i
3134-
f.write('%s\n' % s[6:8])
3135-
f.write('%s\n' % s[4:6])
3136-
f.write('%s\n' % s[2:4])
3137-
f.write('%s\n' % s[0:2])
3139+
s = (''.join(['%0', '%d' % (wordsize * 2), 'x'])) % i
3140+
for w in range(wordsize * 2, 0, -2):
3141+
f.write('%s\n' % s[w - 2:w])
31383142

31393143
def _make_fsm(self, write_delay=10, read_delay=10, sleep=4):
31403144
write_mode = 100

0 commit comments

Comments
 (0)