Fix bpermd and make tests pass
authorMichael Nolan <mtnolan2640@gmail.com>
Sun, 24 May 2020 15:15:54 +0000 (11:15 -0400)
committerMichael Nolan <mtnolan2640@gmail.com>
Sun, 24 May 2020 16:44:43 +0000 (12:44 -0400)
src/soc/fu/logical/bpermd.py
src/soc/fu/logical/main_stage.py

index f9d6c102d8bbb941acf09ea3fea7e721100f5211..dc086faefb70a5f217a6ee3cb894c4553a18371f 100644 (file)
@@ -60,7 +60,7 @@ class Bpermd(Elaboratable):
         perm = Signal(self.width, reset_less=True)
         rb64 = [Signal(1, reset_less=True, name=f"rb64_{i}") for i in range(64)]
         for i in range(64):
-            m.d.comb += rb64[i].eq(self.rb[i])
+            m.d.comb += rb64[i].eq(self.rb[63-i])
         rb64 = Array(rb64)
         for i in range(8):
             index = self.rs[8*i:8*i+8]
index f85acebe29bfcae8e95f13756753457ac2f4614e..1b7931996e486489760c9a0cded0f0a17a5fe251 100644 (file)
@@ -45,6 +45,9 @@ class LogicalMainStage(PipeModBase):
 
         comb += o.ok.eq(1) # overridden if no op activates
 
+
+        m.submodules.bpermd = bpermd = Bpermd(64)
+
         ##########################
         # main switch for logic ops AND, OR and XOR, cmpb, parity, and popcount
 
@@ -132,9 +135,8 @@ class LogicalMainStage(PipeModBase):
 
             ###### bpermd #######
             with m.Case(InternalOp.OP_BPERM):
-                m.submodules.bpermd = bpermd = Bpermd(64)
                 comb += bpermd.rs.eq(a)
-                comb += bpermd.rb.eq(b)
+                comb += bpermd.rb.eq(self.i.b)
                 comb += o.data.eq(bpermd.ra)
 
             with m.Default():