Remove wants_zqcs signal
[gram.git] / gram / core / refresher.py
index 9101c8ee20ca2818060f34994b1a0dc4ed79e179..9ab43592a8bc924a7a1281fc031d2e0f5d1f5169 100644 (file)
@@ -44,7 +44,7 @@ class RefreshExecuter(Elaboratable):
         trp = self._trp
         trfc = self._trfc
 
-        tl = Timeline([
+        m.submodules.timeline = tl = Timeline([
             # Precharge All
             (0, [
                 self.a.eq(2**10),
@@ -71,7 +71,6 @@ class RefreshExecuter(Elaboratable):
                 self.done.eq(1),
             ]),
         ])
-        m.submodules += tl
         m.d.comb += tl.trigger.eq(self.start)
 
         return m
@@ -104,8 +103,7 @@ class RefreshSequencer(Elaboratable):
     def elaborate(self, platform):
         m = Module()
 
-        executer = RefreshExecuter(self._abits, self._babits, self._trp, self._trfc)
-        m.submodules += executer
+        m.submodules.executer = executer = RefreshExecuter(self._abits, self._babits, self._trp, self._trfc)
         m.d.comb += [
             self.a.eq(executer.a),
             self.ba.eq(executer.ba),
@@ -257,7 +255,7 @@ class ZQCSExecuter(Elaboratable):
         trp = self._trp
         tzqcs = self._tzqcs
 
-        tl = Timeline([
+        m.submodules.timeline = tl = Timeline([
             # Precharge All
             (0, [
                 self.a.eq(2**10),
@@ -286,7 +284,6 @@ class ZQCSExecuter(Elaboratable):
                 self.done.eq(1)
             ]),
         ])
-        m.submodules += tl
         m.d.comb += tl.trigger.eq(self.start)
 
         return m
@@ -345,12 +342,10 @@ class Refresher(Elaboratable):
         m.submodules.sequencer = sequencer
 
         if settings.timing.tZQCS is not None:
-            wants_zqcs = Signal()
 
             # ZQCS Timer ---------------------------------------------------------------------------
             zqcs_timer = RefreshTimer(int(self._clk_freq/self._zqcs_freq))
             m.submodules.zqcs_timer = zqcs_timer
-            m.d.comb += wants_zqcs.eq(zqcs_timer.done)
 
             # ZQCS Executer ------------------------------------------------------------------------
             zqcs_executer = ZQCSExecuter(self._abits, self._babits, settings.timing.tRP, settings.timing.tZQCS)
@@ -371,34 +366,25 @@ class Refresher(Elaboratable):
 
             if settings.timing.tZQCS is None:
                 with m.State("Do-Refresh"):
-                    m.d.comb += self.cmd.valid.eq(1)
+                    m.d.comb += self.cmd.valid.eq(~sequencer.done)
                     with m.If(sequencer.done):
-                        m.d.comb += [
-                            self.cmd.valid.eq(0),
-                            self.cmd.last.eq(1),
-                        ]
+                        m.d.comb += self.cmd.last.eq(1)
                         m.next = "Idle"
             else:
                 with m.State("Do-Refresh"):
-                    m.d.comb += self.cmd.valid.eq(1)
+                    m.d.comb += self.cmd.valid.eq(zqcs_timer.done & ~sequencer.done)
                     with m.If(sequencer.done):
-                        with m.If(wants_zqcs):
+                        with m.If(zqcs_timer.done):
                             m.d.comb += zqcs_executer.start.eq(1)
                             m.next = "Do-Zqcs"
                         with m.Else():
-                            m.d.comb += [
-                                self.cmd.valid.eq(0),
-                                self.cmd.last.eq(1),
-                            ]
+                            m.d.comb += self.cmd.last.eq(1)
                             m.next = "Idle"
 
                 with m.State("Do-Zqcs"):
-                    m.d.comb += self.cmd.valid.eq(1)
+                    m.d.comb += self.cmd.valid.eq(~zqcs_executer.done)
                     with m.If(zqcs_executer.done):
-                        m.d.comb += [
-                            self.cmd.valid.eq(0),
-                            self.cmd.last.eq(1),
-                        ]
+                        m.d.comb += self.cmd.last.eq(1)
                         m.next = "Idle"
 
         # Connect sequencer/executer outputs to cmd