from nmigen import Module
from nmigen.cli import rtlil
+from nmutil.latch import SRLatch
def create_ports(rf, wr_spec, rd_spec):
* write-through capability (read on same cycle as write)
"""
def __init__(self, svp64_en=False, regreduce_en=False):
- super().__init__(64, 32, fwd_bus_mode=not regreduce_en)
+ super().__init__(64, 32, fwd_bus_mode=False)
self.svp64_en = svp64_en
self.regreduce_en = regreduce_en
wr_spec, rd_spec = self.get_port_specs()
Note: r/w issue are used by issuer to increment/decrement TB/DEC.
"""
def __init__(self, svp64_en=False, regreduce_en=False):
- super().__init__(64, FastRegsEnum.N_REGS, fwd_bus_mode=not regreduce_en)
+ super().__init__(64, FastRegsEnum.N_REGS, fwd_bus_mode=False)
self.svp64_en = svp64_en
self.regreduce_en = regreduce_en
wr_spec, rd_spec = self.get_port_specs()
}
if not self.regreduce_en:
r_port_spec['fast2'] = "src2"
+ r_port_spec['fast3'] = "src3"
+ w_port_spec['fast2'] = "dest2"
+ w_port_spec['fast3'] = "dest3"
return w_port_spec, r_port_spec
else:
n_sprs = len(SPRfull)
super().__init__(width=64, depth=n_sprs,
- fwd_bus_mode=not regreduce_en)
+ fwd_bus_mode=False)
self.svp64_en = svp64_en
self.regreduce_en = regreduce_en
wr_spec, rd_spec = self.get_port_specs()
self.rv, self.wv = {}, {}
if make_hazard_vecs:
# create a read-hazard and write-hazard vectors for this regfile
- self.wv = make_vecs(self, "wr") # global write vectors
- self.rv = make_vecs(self, "rd") # global read vectors
+ self.wv = self.make_vecs("wr") # global write vectors
+ self.rv = self.make_vecs("rd") # global read vectors
def make_vecs(self, name):
vec = {}
# create regfiles here, Factory style
for (name, kls) in RegFiles.regkls:
+ rf = self.rf[name]
vec[name] = self.make_hazard_vec(rf, name)
return vec
def make_hazard_vec(self, rf, name):
if isinstance(rf, VirtualRegPort):
- vec = RegFileArray(rf.bitwidth, 1)
+ vec = SRLatch(sync=False, llen=rf.nregs, name=name)
else:
- vec = RegFileArray(rf.depth, 1)
- if name in ['int', 'cr', 'xer']:
- n_wrs = 3
- elif name in ['fast']:
- n_wrs = 2
- else:
- n_wrs = 1
- # add write ports
- vec.w_ports = {}
- for i in range(n_wrs):
- pname = "wr%d" % i
- vec.w_ports[pname] = vec.write_port("%s_%s" % (name, pname))
- # add read port
- vec.r_ports = {}
- pname = "rd%d" % 0
- vec.r_ports[pname] = vec.read_port("%s_%s" % (name, pname))
+ vec = SRLatch(sync=False, llen=rf.depth, name=name)
return vec
def elaborate_into(self, m, platform):