wpu.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # Copyright (c) 2023 Victor Suarez Rovere <suarezvictor@gmail.com>
  2. # SPDX-License-Identifier: AGPL-3.0-only
  3. from litex.soc.interconnect import wishbone
  4. from litex.soc.interconnect.csr import *
  5. from litex.soc.integration.common import *
  6. from litex.soc.integration.soc_core import *
  7. from litex.soc.integration.soc import *
  8. from accel import Accel, AccelImporterSoC
  9. import os
  10. # Core wrappers ------------------------------------------------------------------------------------
  11. #TODO: generalize by reading or deducing parameters from a file
  12. #to instance:
  13. # wpu = WPU(corename, pixel_bus_width = pixel_bus_width, debug=False)
  14. class WPUBase(Accel):
  15. def __init__(self, name, pixel_bus_width=32, debug=False):
  16. coord_width = 16
  17. arg_desc_layout = [
  18. ("x0", coord_width),
  19. ("y0", coord_width),
  20. ("x1", coord_width),
  21. ("y1", coord_width),
  22. ("rgba", 32),
  23. ("base", 32),
  24. ("xstride", coord_width),
  25. ("ystride", coord_width),
  26. ]
  27. super().__init__(name, arg_desc_layout)
  28. self.dma_bus = wishbone.Interface(pixel_bus_width)
  29. self.add_bus_arg(self.dma_bus)
  30. if debug:
  31. adr = Signal(32)
  32. self.comb += adr[2:].eq(self.dma_bus.adr)
  33. self.sync += If(self.args.valid & ~self.args.ready & self.dma_bus.we & self.dma_bus.ack,
  34. Display("x0 %d, y0 %d, dma_addr 0x%08X (0x%08X) done %d", self.args.x0, self.args.y0, self.dma_bus.adr, adr, self.args.ready))
  35. def connect_to_soc(self, soc):
  36. soc.bus.add_master(master=self.dma_bus, name="dma_bus_"+self.name)
  37. # Core adder ---------------------------------------------------------------------------------------
  38. def gen_accel_cores(soc, active_cores, pixel_bus_width=32):
  39. for core in active_cores:
  40. corename = "accel_" + core
  41. fb_offset = 0xC00000
  42. #indirect instancing
  43. wpu = AccelImporterSoC(corename, csr_base=0, busmaster_type="native", debug=False) #importer
  44. wpu.connect_to_soc(soc)
  45. setattr(soc.submodules, corename, wpu)
  46. vram_origin = soc.bus.regions["main_ram"].origin # usually 0x40000000
  47. soc.add_constant("VRAM_ORIGIN_"+corename, vram_origin + fb_offset)
  48. soc.platform.add_source(f"{corename}.v")
  49. soc.platform.add_source(f"{core}.v")