@@ -54,7 +54,7 @@ def _compute_page_bits(nwords):
54
54
return 0
55
55
56
56
class SRAM :
57
- def __init__ (self , mem_or_size , address , bus = None ):
57
+ def __init__ (self , mem_or_size , address , read_only = None , bus = None ):
58
58
if isinstance (mem_or_size , Memory ):
59
59
self .mem = mem_or_size
60
60
else :
@@ -71,6 +71,12 @@ def __init__(self, mem_or_size, address, bus=None):
71
71
self ._page = RegisterField (self .mem .name_override + "_page" , page_bits )
72
72
else :
73
73
self ._page = None
74
+ if read_only is None :
75
+ if hasattr (self .mem , "bus_read_only" ):
76
+ read_only = self .mem .bus_read_only
77
+ else :
78
+ read_only = False
79
+ self .read_only = read_only
74
80
if bus is None :
75
81
bus = Interface ()
76
82
self .bus = bus
@@ -82,7 +88,8 @@ def get_registers(self):
82
88
return [self ._page ]
83
89
84
90
def get_fragment (self ):
85
- port = self .mem .get_port (write_capable = not self .word_bits )
91
+ port = self .mem .get_port (write_capable = not self .read_only ,
92
+ we_granularity = data_width if not self .read_only and self .word_bits else 0 )
86
93
87
94
sel = Signal ()
88
95
sel_r = Signal ()
@@ -99,14 +106,22 @@ def get_fragment(self):
99
106
chooser (word_expanded , word_index , self .bus .dat_r , n = self .csrw_per_memw , reverse = True )
100
107
)
101
108
]
109
+ if not self .read_only :
110
+ comb += [
111
+ If (sel & self .bus .we , port .we .eq ((1 << self .word_bits ) >> self .bus .adr [:self .word_bits ])),
112
+ port .dat_w .eq (Replicate (self .bus .dat_w , self .csrw_per_memw ))
113
+ ]
102
114
else :
103
115
comb += [
104
- port .we .eq (sel & self .bus .we ),
105
- port .dat_w .eq (self .bus .dat_w ),
106
116
If (sel_r ,
107
117
self .bus .dat_r .eq (port .dat_r )
108
118
)
109
119
]
120
+ if not self .read_only :
121
+ comb += [
122
+ port .we .eq (sel & self .bus .we ),
123
+ port .dat_w .eq (self .bus .dat_w )
124
+ ]
110
125
111
126
if self ._page is None :
112
127
comb .append (port .adr .eq (self .bus .adr [self .word_bits :len (port .adr )]))
0 commit comments