soc_core: csr_alignment assertions
authorGabriel Somlo <gsomlo@gmail.com>
Wed, 18 Dec 2019 16:24:11 +0000 (11:24 -0500)
committerGabriel Somlo <gsomlo@gmail.com>
Sat, 21 Dec 2019 18:00:40 +0000 (13:00 -0500)
Enforce the condition that csr_alignment be either 32 or 64 when
requested explicitly when initializing SoCCore().

Additionally, if a CPU is specified, enforce that csr_alignment be
equal to the native CPU word size (currently either 32 or 64), and
warn the caller if an alignment value *higher* than the CPU native
word size was explicitly requested.

In conclusion, if a CPU is specified, then csr_alignment should be
assumed to equal 8*sizeof(unsigned long).

Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
litex/soc/integration/soc_core.py

index 6bafe6f1f28efb9d3f67519706c667945c64c828..61281f02f187c787cd878716e2d78aab36dfcd3b 100644 (file)
@@ -141,6 +141,8 @@ class SoCCore(Module):
         self.csr_data_width    = csr_data_width
         self.csr_address_width = csr_address_width
 
+        assert csr_alignment in [32, 64]
+
         self.with_ctrl = with_ctrl
 
         self.with_uart     = with_uart
@@ -200,6 +202,9 @@ class SoCCore(Module):
             # Allow SoCController to reset the CPU
             if with_ctrl:
                 self.comb += self.cpu.reset.eq(self.ctrl.reset)
+
+            assert csr_alignment <= self.cpu.data_width
+            csr_alignment = self.cpu.data_width
         else:
             self.submodules.cpu = cpu.CPUNone()
             self.soc_io_regions.update(self.cpu.io_regions)
@@ -256,7 +261,6 @@ class SoCCore(Module):
             self.add_interrupt("timer0", allow_user_defined=True)
 
         # Add Wishbone to CSR bridge
-        csr_alignment = max(csr_alignment, self.cpu.data_width)
         self.config["CSR_DATA_WIDTH"] = csr_data_width
         self.config["CSR_ALIGNMENT"]  = csr_alignment
         assert csr_data_width <= csr_alignment