soc/add_cpu: use cpu.data_width as CSR alignment, fix regression on Rocket
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Wed, 12 Feb 2020 20:25:20 +0000 (21:25 +0100)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Wed, 12 Feb 2020 20:25:52 +0000 (21:25 +0100)
litex/soc/integration/soc.py

index 434ed36a4998c412bdaf81e0bbee0076ae22248b..c72e44692440f9828aae071822592d09263ccd83 100755 (executable)
@@ -495,6 +495,17 @@ class SoCCSRHandler(SoCLocHandler):
 
         self.logger.info("CSR Handler {}.".format(colorer("created", color="green")))
 
+    # Update CSR Alignment ----------------------------------------------------------------------------
+    def update_alignment(self, alignment):
+        # Check Alignment
+        if alignment not in self.supported_alignment:
+            self.logger.error("Unsupported {}: {} supporteds: {:s}".format(
+                colorer("Alignment", color="red"),
+                colorer(alignment),
+                colorer(", ".join(str(x) for x in self.supported_alignment))))
+            raise
+        self.alignment = alignment
+
     # Add Master -----------------------------------------------------------------------------------
     def add_master(self, name=None, master=None):
         if name is None:
@@ -747,6 +758,7 @@ class SoC(Module):
         for n, (origin, size) in enumerate(self.cpu.io_regions.items()):
             self.bus.add_region("io{}".format(n), SoCIORegion(origin=origin, size=size, cached=False))
         self.mem_map.update(self.cpu.mem_map) # FIXME
+        self.csr.update_alignment(self.cpu.data_width)
         # Add Bus Masters/CSR/IRQs
         if not isinstance(self.cpu, cpu.CPUNone):
             if reset_address is None: