add in 2 more ALUs, now 4x4 scoreboard
[soc.git] / src / scoreboard / group_picker.py
index 8f959a188ccb72c4799946826e7d732e9a4f2a57..f02f88630e7080d6b3109c03d41a929f01605ab6 100644 (file)
@@ -10,20 +10,22 @@ class PriorityPicker(Elaboratable):
         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))
 
@@ -32,7 +34,7 @@ class PriorityPicker(Elaboratable):
     def __iter__(self):
         yield self.i
         yield self.o
-                
+
     def ports(self):
         return list(self)
 
@@ -45,7 +47,8 @@ class GroupPicker(Elaboratable):
         # 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)
@@ -58,10 +61,10 @@ class GroupPicker(Elaboratable):
         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
@@ -69,10 +72,10 @@ class GroupPicker(Elaboratable):
     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)
 
@@ -90,13 +93,13 @@ def grp_pick_sim(dut):
     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():