@@ -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
5166class 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):
90109class _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):
117136class 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
125144class 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