add SERV CPU initial support (not working)
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Fri, 27 Sep 2019 22:17:00 +0000 (00:17 +0200)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Fri, 27 Sep 2019 22:34:55 +0000 (00:34 +0200)
litex/soc/cores/cpu/__init__.py
litex/soc/cores/cpu/serv/__init__.py [new file with mode: 0644]
litex/soc/cores/cpu/serv/core.py [new file with mode: 0644]
litex/soc/integration/soc_core.py
litex/soc/software/bios/boot-helper-serv.S [new file with mode: 0644]
litex/soc/software/bios/sdram.c
litex/soc/software/include/base/irq.h
litex/soc/software/libbase/crt0-serv.S [new file with mode: 0644]
litex/soc/software/libbase/system.c

index 244869b803ee2acc7adc4035759ab45be55f4736..202f994efe4cf42aa92ba71f45074e34945cc019 100644 (file)
@@ -9,6 +9,7 @@ from litex.soc.cores.cpu.picorv32 import PicoRV32
 from litex.soc.cores.cpu.vexriscv import VexRiscv
 from litex.soc.cores.cpu.minerva import Minerva
 from litex.soc.cores.cpu.rocket import RocketRV64
+from litex.soc.cores.cpu.serv import SERV
 
 # CPU Variants/Extensions Definition ---------------------------------------------------------------
 
diff --git a/litex/soc/cores/cpu/serv/__init__.py b/litex/soc/cores/cpu/serv/__init__.py
new file mode 100644 (file)
index 0000000..b46284a
--- /dev/null
@@ -0,0 +1 @@
+from litex.soc.cores.cpu.serv.core import SERV
diff --git a/litex/soc/cores/cpu/serv/core.py b/litex/soc/cores/cpu/serv/core.py
new file mode 100644 (file)
index 0000000..0f9a262
--- /dev/null
@@ -0,0 +1,93 @@
+# This file is Copyright (c) 2019 Florent Kermarrec <florent@enjoy-digital.fr>
+
+# License: BSD
+
+import os
+
+from migen import *
+
+from litex.soc.interconnect import wishbone
+
+CPU_VARIANTS = ["standard"]
+
+
+class SERV(Module):
+    @property
+    def name(self):
+        return "serv"
+
+    @property
+    def endianness(self):
+        return "little"
+
+    @property
+    def gcc_triple(self):
+        return ("riscv64-unknown-elf", "riscv32-unknown-elf")
+
+    @property
+    def gcc_flags(self):
+        flags =  "-march=rv32i "
+        flags += "-mabi=ilp32 "
+        flags += "-D__serv__ "
+        return flags
+
+    @property
+    def linker_output_format(self):
+        return "elf32-littleriscv"
+
+    @property
+    def reserved_interrupts(self):
+        return {}
+
+    def __init__(self, platform, cpu_reset_address, variant="standard"):
+        assert variant is "standard", "Unsupported variant %s" % variant
+        self.platform  = platform
+        self.variant   = variant
+        self.reset     = Signal()
+        self.ibus      = wishbone.Interface()
+        self.dbus      = wishbone.Interface()
+        self.interrupt = Signal(32)
+
+        # # #
+
+        self.specials += Instance("serv_top",
+            p_RESET_PC=cpu_reset_address,
+
+            # clock / reset
+            i_clk   = ClockSignal(),
+            i_i_rst = ResetSignal(),
+
+            # timer irq
+            i_i_timer_irq = 0,
+
+            # ibus
+            o_o_ibus_adr = self.ibus.adr,
+            o_o_ibus_cyc = self.ibus.cyc,
+            i_i_ibus_rdt = self.ibus.dat_r,
+            i_i_ibus_ack = self.ibus.ack,
+
+
+            # dbus
+            o_o_dbus_adr = self.dbus.adr,
+            o_o_dbus_dat = self.dbus.dat_w,
+            o_o_dbus_sel = self.dbus.sel,
+            o_o_dbus_we  = self.dbus.we,
+            o_o_dbus_cyc = self.dbus.cyc,
+            i_i_dbus_rdt = self.dbus.dat_r,
+            i_i_dbus_ack = self.dbus.ack,
+        )
+        self.comb += [
+            self.ibus.stb.eq(self.ibus.cyc),
+            self.dbus.stb.eq(self.dbus.cyc),
+        ]
+
+        # add verilog sources
+        self.add_sources(platform)
+
+    @staticmethod
+    def add_sources(platform):
+        vdir = os.path.join(
+            os.path.abspath(os.path.dirname(__file__)),
+            "verilog", "rtl")
+        platform.add_source_dir(vdir)
+        platform.add_verilog_include_path(vdir)
index 48009791b91714da9f5658fb10f8d434720fdcb6..7a4c3980b010710288634055df9d5eee4f5530a0 100644 (file)
@@ -278,6 +278,8 @@ class SoCCore(Module):
                 self.add_cpu(cpu.minerva.Minerva(platform, self.cpu_reset_address, self.cpu_variant))
             elif cpu_type == "rocket":
                 self.add_cpu(cpu.rocket.RocketRV64(platform, self.cpu_reset_address, self.cpu_variant))
+            elif cpu_type == "serv":
+                self.add_cpu(cpu.serv.SERV(platform, self.cpu_reset_address, self.cpu_variant))
             else:
                 raise ValueError("Unsupported CPU type: {}".format(cpu_type))
 
diff --git a/litex/soc/software/bios/boot-helper-serv.S b/litex/soc/software/bios/boot-helper-serv.S
new file mode 100644 (file)
index 0000000..e8bd5c7
--- /dev/null
@@ -0,0 +1,4 @@
+       .section .text, "ax", @progbits
+       .global boot_helper
+boot_helper:
+       jr x13
index f0c12edfe7188eb643440b961da6fb97cf37b3ce..897c03d50f23789e2cc73467fddb5840df872cc8 100644 (file)
@@ -44,6 +44,8 @@ __attribute__((unused)) static void cdelay(int i)
                __asm__ volatile("nop");
 #elif defined (__powerpc__)
                __asm__ volatile("nop");
+#elif defined (__serv__)
+               __asm__ volatile("nop");
 #else
 #error Unsupported architecture
 #endif
index 4bf6786c4569af6209a338a5a3558fd7eda5f423..0a0766e8360c76e28778f12ca1b3183da3ec7fd7 100644 (file)
@@ -56,6 +56,8 @@ static inline unsigned int irq_getie(void)
        return (csrr(mstatus) & CSR_MSTATUS_MIE) != 0;
 #elif defined (__rocket__)
        return (csrr(mstatus) & CSR_MSTATUS_MIE) != 0;
+#elif defined (__serv__)
+       return 0; /* FIXME */
 #else
 #error Unsupported architecture
 #endif
@@ -81,6 +83,8 @@ static inline void irq_setie(unsigned int ie)
        if(ie) csrs(mstatus,CSR_MSTATUS_MIE); else csrc(mstatus,CSR_MSTATUS_MIE);
 #elif defined (__rocket__)
        if(ie) csrs(mstatus,CSR_MSTATUS_MIE); else csrc(mstatus,CSR_MSTATUS_MIE);
+#elif defined (__serv__)
+       /* FIXME */
 #else
 #error Unsupported architecture
 #endif
@@ -108,6 +112,8 @@ static inline unsigned int irq_getmask(void)
        return mask;
 #elif defined (__rocket__)
        return csr_readl(PLIC_ENABLED) >> 1;
+#elif defined (__serv__)
+       return 0; /* FIXME */
 #else
 #error Unsupported architecture
 #endif
@@ -129,6 +135,8 @@ static inline void irq_setmask(unsigned int mask)
        asm volatile ("csrw %0, %1" :: "i"(CSR_IRQ_MASK), "r"(mask));
 #elif defined (__rocket__)
        csr_writel(mask << 1, PLIC_ENABLED);
+#elif defined (__serv__)
+       /* FIXME */
 #else
 #error Unsupported architecture
 #endif
@@ -154,6 +162,8 @@ static inline unsigned int irq_pending(void)
        return pending;
 #elif defined (__rocket__)
        return csr_readl(PLIC_PENDING) >> 1;
+#elif defined (__serv__)
+       return 0;/* FIXME */
 #else
 #error Unsupported architecture
 #endif
diff --git a/litex/soc/software/libbase/crt0-serv.S b/litex/soc/software/libbase/crt0-serv.S
new file mode 100644 (file)
index 0000000..6f6e9e6
--- /dev/null
@@ -0,0 +1,63 @@
+#define MIE_MEIE       0x800
+
+       .global _start
+_start:
+       j reset_vector
+
+reset_vector:
+       la sp, _fstack
+       la t0, trap_vector
+       csrw mtvec, t0
+
+       // initialize .bss
+       la t0, _fbss
+       la t1, _ebss
+1:     beq t0, t1, 2f
+       sw zero, 0(t0)
+       addi t0, t0, 4
+       j 1b
+2:
+       // enable external interrupts
+       li t0, MIE_MEIE
+       csrs mie, t0
+
+       call main
+1:     j 1b
+
+trap_vector:
+       addi sp, sp, -16*4
+       sw ra,  0*4(sp)
+       sw t0,  1*4(sp)
+       sw t1,  2*4(sp)
+       sw t2,  3*4(sp)
+       sw a0,  4*4(sp)
+       sw a1,  5*4(sp)
+       sw a2,  6*4(sp)
+       sw a3,  7*4(sp)
+       sw a4,  8*4(sp)
+       sw a5,  9*4(sp)
+       sw a6, 10*4(sp)
+       sw a7, 11*4(sp)
+       sw t3, 12*4(sp)
+       sw t4, 13*4(sp)
+       sw t5, 14*4(sp)
+       sw t6, 15*4(sp)
+       call isr
+       lw ra,  0*4(sp)
+       lw t0,  1*4(sp)
+       lw t1,  2*4(sp)
+       lw t2,  3*4(sp)
+       lw a0,  4*4(sp)
+       lw a1,  5*4(sp)
+       lw a2,  6*4(sp)
+       lw a3,  7*4(sp)
+       lw a4,  8*4(sp)
+       lw a5,  9*4(sp)
+       lw a6, 10*4(sp)
+       lw a7, 11*4(sp)
+       lw t3, 12*4(sp)
+       lw t4, 13*4(sp)
+       lw t5, 14*4(sp)
+       lw t6, 15*4(sp)
+       addi sp, sp, 16*4
+       mret
index bb15aad06e70e188018dff30a0310a5c49944d6a..73e657785aa22d1b56f55631d441c87c750394cc 100644 (file)
@@ -56,6 +56,9 @@ void flush_cpu_icache(void)
 #elif defined (__rocket__)
        /* FIXME: do something useful here! */
        asm volatile("nop");
+#elif defined (__serv__)
+       /* no instruction cache */
+       asm volatile("nop");
 #else
 #error Unsupported architecture
 #endif
@@ -101,6 +104,9 @@ void flush_cpu_dcache(void)
 #elif defined (__rocket__)
        /* FIXME: do something useful here! */
        asm volatile("nop");
+#elif defined (__serv__)
+       /* no data cache */
+       asm volatile("nop");
 #else
 #error Unsupported architecture
 #endif