add means to JTAG interface to enable/disable "stuff" currently just WB
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 22 Oct 2020 13:13:11 +0000 (14:13 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 22 Oct 2020 15:51:04 +0000 (16:51 +0100)
src/soc/debug/jtag.py

index 74d501369182a6ed2514cc9805b15cabcd9d7804..1f5508c52e2a988405e51f3e388500f683d79326 100644 (file)
@@ -4,7 +4,7 @@ using Staf Verhaegen (Chips4Makers) wishbone TAP
 """
 
 from collections import OrderedDict
-from nmigen import (Module, Signal, Elaboratable)
+from nmigen import (Module, Signal, Elaboratable, Cat)
 from nmigen.cli import rtlil
 from c4m.nmigen.jtag.tap import IOType
 from soc.debug.dmi import  DMIInterface, DBGCore
@@ -87,9 +87,24 @@ class JTAG(DMITAP, Pins):
         # create DMI2JTAG (goes through to dmi_sim())
         self.dmi = self.add_dmi(ircodes=[8, 9, 10])
 
+        # use this for enable/disable of parts of the ASIC
+        self.sr_en = self.add_shiftreg(ircode=11, length=2)
+        self.wb_icache_en = Signal(reset=1)
+        self.wb_dcache_en = Signal(reset=1)
+
     def elaborate(self, platform):
         m = super().elaborate(platform)
         m.d.comb += self.sr.i.eq(self.sr.o) # loopback as part of test?
+
+        # provide way to enable/disable wishbone caches just in case of issues
+        # see https://bugs.libre-soc.org/show_bug.cgi?id=520
+        en_sigs = Cat(self.wb_icache_en, self.wb_dcache_en)
+        with m.If(self.sr_en.oe):
+            m.d.sync += en_sigs.eq(self.sr_en.o)
+        # also make it possible to read the enable/disable current state
+        with m.If(self.sr_en.ie):
+            m.d.comb += self.sr_en.i.eq(en_sigs)
+
         return m
 
     def external_ports(self):