Skip to content

Commit 0540f79

Browse files
committed
SyncRAM with enable port
1 parent 678511e commit 0540f79

File tree

1 file changed

+32
-13
lines changed

1 file changed

+32
-13
lines changed

veriloggen/types/ram.py

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class RAMInterface(object):
1515

1616
def __init__(self, m, name=None, datawidth=32, addrwidth=10, itype=None, otype=None,
1717
p_addr='addr', p_rdata='rdata', p_wdata='wdata', p_wenable='wenable',
18-
index=None):
18+
p_enable='enable', index=None, with_enable=False):
1919

2020
if itype is None:
2121
itype = self._I
@@ -27,25 +27,40 @@ def __init__(self, m, name=None, datawidth=32, addrwidth=10, itype=None, otype=N
2727
name_addr = p_addr if name is None else '_'.join([name, p_addr])
2828
name_rdata = p_rdata if name is None else '_'.join([name, p_rdata])
2929
name_wdata = p_wdata if name is None else '_'.join([name, p_wdata])
30-
name_wenable = p_wenable if name is None else '_'.join(
31-
[name, p_wenable])
30+
name_wenable = (
31+
p_wenable if name is None else '_'.join([name, p_wenable]))
32+
if with_enable:
33+
name_enable = (
34+
p_enable if name is None else '_'.join([name, p_enable]))
3235

3336
if index is not None:
3437
name_addr = name_addr + str(index)
3538
name_rdata = name_rdata + str(index)
3639
name_wdata = name_wdata + str(index)
3740
name_wenable = name_wenable + str(index)
41+
if with_enable:
42+
name_enable = name_enable + str(index)
3843

3944
self.addr = util.make_port(m, itype, name_addr, addrwidth, initval=0)
4045
self.rdata = util.make_port(m, otype, name_rdata, datawidth, initval=0)
4146
self.wdata = util.make_port(m, itype, name_wdata, datawidth, initval=0)
4247
self.wenable = util.make_port(m, itype, name_wenable, initval=0)
48+
if with_enable:
49+
self.enable = util.make_port(m, itype, name_enable, initval=0)
4350

4451
def connect(self, targ):
4552
util.connect_port(self.addr, targ.addr)
4653
util.connect_port(targ.rdata, self.rdata)
4754
util.connect_port(self.wdata, targ.wdata)
4855
util.connect_port(self.wenable, targ.wenable)
56+
if hasattr(self, 'enable'):
57+
if hasattr(targ, 'enable'):
58+
util.connect_port(self.enable, targ.enable)
59+
else:
60+
util.connect_port(self.enable, 1)
61+
else:
62+
if hasattr(targ, 'enable'):
63+
raise ValueError('no enable port')
4964

5065

5166
class RAMSlaveInterface(RAMInterface):
@@ -58,26 +73,30 @@ class RAMMasterInterface(RAMInterface):
5873
_O = 'Input'
5974

6075

61-
def mkRAMDefinition(name, datawidth=32, addrwidth=10, numports=2, sync=True):
76+
def mkRAMDefinition(name, datawidth=32, addrwidth=10, numports=2, sync=True, with_enable=False):
6277
m = Module(name)
6378
clk = m.Input('CLK')
6479

6580
interfaces = []
6681

6782
for i in range(numports):
6883
interface = RAMSlaveInterface(
69-
m, name + '_%d' % i, datawidth, addrwidth)
84+
m, name + '_%d' % i, datawidth, addrwidth, with_enable=with_enable)
7085
interface.delay_addr = m.Reg(name + '_%d_daddr' % i, addrwidth)
7186
interfaces.append(interface)
7287

7388
mem = m.Reg('mem', datawidth, length=2**addrwidth)
7489

7590
for interface in interfaces:
76-
m.Always(vtypes.Posedge(clk))(
91+
body = [
7792
vtypes.If(interface.wenable)(
7893
mem[interface.addr](interface.wdata)
7994
),
80-
interface.delay_addr(interface.addr)
95+
interface.delay_addr(interface.addr)]
96+
if with_enable:
97+
body = vtypes.If(interface.enable)(*body)
98+
m.Always(vtypes.Posedge(clk))(
99+
body
81100
)
82101
if sync:
83102
m.Assign(interface.rdata(mem[interface.delay_addr]))
@@ -90,17 +109,17 @@ def mkRAMDefinition(name, datawidth=32, addrwidth=10, numports=2, sync=True):
90109
class _RAM(object):
91110

92111
def __init__(self, m, name, clk,
93-
datawidth=32, addrwidth=10, numports=1, sync=True):
112+
datawidth=32, addrwidth=10, numports=1, sync=True, with_enable=False):
94113

95114
self.m = m
96115
self.name = name
97116
self.clk = clk
98117

99118
self.interfaces = [RAMInterface(m, name + '_%d' % i, datawidth, addrwidth,
100-
itype='Wire', otype='Wire')
119+
itype='Wire', otype='Wire', with_enable=with_enable)
101120
for i in range(numports)]
102121

103-
ram_def = mkRAMDefinition(name, datawidth, addrwidth, numports, sync)
122+
ram_def = mkRAMDefinition(name, datawidth, addrwidth, numports, sync, with_enable)
104123

105124
self.m.Instance(ram_def, name,
106125
params=(), ports=m.connect_ports(ram_def))
@@ -117,15 +136,15 @@ def rdata(self, port):
117136
class SyncRAM(_RAM):
118137

119138
def __init__(self, m, name, clk,
120-
datawidth=32, addrwidth=10, numports=1):
139+
datawidth=32, addrwidth=10, numports=1, with_enable=False):
121140
_RAM.__init__(self, m, name, clk,
122-
datawidth, addrwidth, numports, sync=True)
141+
datawidth, addrwidth, numports, sync=True, with_enable=with_enable)
123142

124143

125144
class AsyncRAM(_RAM):
126145

127146
def __init__(self, m, name, clk,
128-
datawidth=32, addrwidth=10, numports=1):
147+
datawidth=32, addrwidth=10, numports=1, with_enable=False):
129148
_RAM.__init__(self, m, name, clk,
130149
datawidth, addrwidth, numports, sync=False)
131150

0 commit comments

Comments
 (0)