only pass on the uncancelled mask bits
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 3 Aug 2019 22:39:12 +0000 (23:39 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 3 Aug 2019 22:39:12 +0000 (23:39 +0100)
src/nmutil/singlepipe.py

index 17df104c3314d582e3dae2b1835d408a930bbb45..7f146585ad95924faa8290a545d4603f59abfe40 100644 (file)
@@ -432,12 +432,15 @@ class MaskCancellable(ControlBase):
         # is NOT "normal" for the Stage API.
         p_valid_i = Signal(reset_less=True)
         #print ("self.p.data_i", self.p.data_i)
-        m.d.comb += p_valid_i.eq(((self.p.mask_i & ~self.p.stop_i).bool()))
+        maskedout = Signal(len(self.p.mask_i), reset_less=True)
+        m.d.comb += maskedout.eq(self.p.mask_i & ~self.p.stop_i)
+        m.d.comb += p_valid_i.eq(maskedout.bool())
 
         # if idmask nonzero, mask gets passed on (and register set).
         # register is left as-is if idmask is zero, but out-mask is set to zero
+        # note however: only the *uncancelled* mask bits get passed on
         m.d.sync += self.n.valid_o.eq(p_valid_i)
-        m.d.sync += self.n.mask_o.eq(Mux(p_valid_i, self.p.mask_i, 0))
+        m.d.sync += self.n.mask_o.eq(Mux(p_valid_i, maskedout, 0))
         with m.If(p_valid_i):
             data_o = self._postprocess(result) # XXX TBD, does nothing right now
             m.d.sync += nmoperator.eq(self.n.data_o, data_o) # update output