1 # TODO: replace with Memory at some point
2 from nmigen
import Elaboratable
, Signal
, Array
, Module
3 from nmutil
.util
import Display
5 class CacheRam(Elaboratable
):
7 def __init__(self
, ROW_BITS
=16, WIDTH
= 64, TRACE
=True, ADD_BUF
=False):
8 self
.ROW_BITS
= ROW_BITS
11 self
.ADD_BUF
= ADD_BUF
13 self
.rd_addr
= Signal(ROW_BITS
)
14 self
.rd_data_o
= Signal(WIDTH
)
15 self
.wr_sel
= Signal(WIDTH
//8)
16 self
.wr_addr
= Signal(ROW_BITS
)
17 self
.wr_data
= Signal(WIDTH
)
19 def elaborate(self
, platform
):
21 comb
, sync
= m
.d
.comb
, m
.d
.sync
23 ROW_BITS
= self
.ROW_BITS
26 ADD_BUF
= self
.ADD_BUF
29 ram
= Array(Signal(WIDTH
) for i
in range(SIZE
))
30 #attribute ram_style of ram : signal is "block";
32 rd_data0
= Signal(WIDTH
)
34 sel0
= Signal(WIDTH
//8) # defaults to zero
37 with m
.If(self
.wr_sel
!= sel0
):
38 sync
+= Display( "write a: %x sel: %x dat: %x",
39 self
.wr_addr
, self
.wr_sel
, self
.wr_data
)
40 for i
in range(WIDTH
//8):
43 with m
.If(self
.wr_sel
[i
]):
44 sync
+= ram
[self
.wr_addr
][lbit
:mbit
].eq(self
.wr_data
[lbit
:mbit
])
45 with m
.If(self
.rd_en
):
46 sync
+= rd_data0
.eq(ram
[self
.rd_addr
])
48 sync
+= Display("read a: %x dat: %x",
49 self
.rd_addr
, ram
[self
.rd_addr
])
54 sync
+= self
.rd_data_o
.eq(rd_data0
)
56 comb
+= self
.rd_data_o
.eq(rd_data0
)