self.wid = wid
# inputs
self.i = Signal(wid, reset_less=True)
- self.o = Signal(wid, reset_less=True)
+ self.o = Signal(wid, reset_less=True)
def elaborate(self, platform):
m = Module()
res = []
+ ni = Signal(self.wid, reset_less = True)
+ m.d.comb += ni.eq(~self.i)
for i in range(0, self.wid):
- tmp = Signal(reset_less = True)
+ t = Signal(reset_less = True)
+ res.append(t)
if i == 0:
- m.d.comb += tmp.eq(self.i[0])
+ m.d.comb += t.eq(self.i[i])
else:
- m.d.comb += tmp.eq((~tmp) & self.i[i])
- res.append(tmp)
-
+ m.d.comb += t.eq(~Cat(ni[i], *self.i[:i]).bool())
+
# we like Cat(*xxx). turn lists into concatenated bits
m.d.comb += self.o.eq(Cat(*res))
def __iter__(self):
yield self.i
yield self.o
-
+
def ports(self):
return list(self)
# inputs
self.readable_i = Signal(wid, reset_less=True) # readable in (top)
self.writable_i = Signal(wid, reset_less=True) # writable in (top)
- self.rel_req_i = Signal(wid, reset_less=True) # release request in (top)
+ self.rd_rel_i = Signal(wid, reset_less=True) # go read in (top)
+ self.req_rel_i = Signal(wid, reset_less=True) # release request in (top)
# outputs
self.go_rd_o = Signal(wid, reset_less=True) # go read (bottom)
m.submodules.wpick = wpick = PriorityPicker(self.gp_wid)
# combine release (output ready signal) with writeable
- m.d.comb += wpick.i.eq(self.writable_i & self.rel_req_i)
+ m.d.comb += wpick.i.eq(self.writable_i & self.req_rel_i)
m.d.comb += self.go_wr_o.eq(wpick.o)
- m.d.comb += rpick.i.eq(self.readable_i)
+ m.d.comb += rpick.i.eq(self.readable_i & self.rd_rel_i)
m.d.comb += self.go_rd_o.eq(rpick.o)
return m
def __iter__(self):
yield self.readable_i
yield self.writable_i
- yield self.rel_req_i
+ yield self.req_rel_i
yield self.go_rd_o
yield self.go_wr_o
-
+
def ports(self):
return list(self)
yield
yield dut.issue_i.eq(0)
yield
- yield dut.go_read_i.eq(1)
+ yield dut.rd_rel_i.eq(1)
yield
- yield dut.go_read_i.eq(0)
+ yield dut.rd_rel_i.eq(0)
yield
- yield dut.go_write_i.eq(1)
+ yield dut.go_wr_i.eq(1)
yield
- yield dut.go_write_i.eq(0)
+ yield dut.go_wr_i.eq(0)
yield
def test_grp_pick():