def __init__(self, **kwargs): VirtualMiniSoC.__init__(self, ethmac_nrxslots=4, ethmac_ntxslots=4, **kwargs) AMPSoC.__init__(self) add_identifier(self) self.config["HAS_DDS"] = None self.clock_domains.rtio = ClockDomain() self.comb += self.rtio.clk.eq(ClockSignal("sys")) self.submodules.rtio_tsc = rtio.TSC("async", glbl_fine_ts_width=3)
def add_rtio(self, top, rtio_channels): #self.submodules.rtio_crg = _RTIOCRG(self.platform, self.crg.cd_sys.clk) #self.csr_devices.append("rtio_crg") #self.config["HAS_RTIO_CLOCK_SWITCH"] = None top.submodules.rtio_tsc = rtio.TSC("sync", glbl_fine_ts_width=3) top.submodules.rtio_core = rtio.Core(top.rtio_tsc, rtio_channels, lane_count=2) #self.submodules.rtio_core = rtio.Core(rtio_channels) top.csr_devices.append("rtio_core") top.submodules.rtio = rtio.KernelInitiator(top.rtio_tsc) #self.submodules.rtio_dma = ClockDomainsRenamer("sys_kernel")( # rtio.DMA(self.get_native_sdram_if())) #self.register_kernel_cpu_csrdevice("rtio") #self.register_kernel_cpu_csrdevice("rtio_dma") top.submodules.cri_con = rtio.CRIInterconnectShared( [top.rtio.cri], #self.rtio_dma.cri], [top.rtio_core.cri]) #self.register_kernel_cpu_csrdevice("cri_con") top.submodules.rtio_moninj = rtio.MonInj(rtio_channels) top.csr_devices.append("rtio_moninj")
def __init__(self, gateware_identifier_str=None, **kwargs): MiniSoC.__init__(self, cpu_type="vexriscv", sdram_controller_type="minicon", l2_size=128*1024, integrated_sram_size=8192, ethmac_nrxslots=4, ethmac_ntxslots=4, **kwargs) AMPSoC.__init__(self) add_identifier(self, gateware_identifier_str=gateware_identifier_str) if isinstance(self.platform.toolchain, XilinxVivadoToolchain): self.platform.toolchain.bitstream_commands.extend([ "set_property BITSTREAM.GENERAL.COMPRESS True [current_design]", ]) if isinstance(self.platform.toolchain, XilinxISEToolchain): self.platform.toolchain.bitgen_opt += " -g compress" platform = self.platform platform.add_extension(_reprogrammed3v3_io) platform.add_extension(_ams101_dac) self.comb += platform.request("sfp_tx_disable_n_33").eq(1) data_pads = [ platform.request("sfp"), platform.request("user_sma_mgt") ] # 1000BASE_BX10 Ethernet compatible, 125MHz RTIO clock self.submodules.drtio_transceiver = gtx_7series.GTX( clock_pads=platform.request("si5324_clkout"), pads=data_pads, sys_clk_freq=self.clk_freq) self.csr_devices.append("drtio_transceiver") self.submodules.rtio_tsc = rtio.TSC("async", glbl_fine_ts_width=3) drtio_csr_group = [] drtioaux_csr_group = [] drtioaux_memory_group = [] self.drtio_cri = [] for i in range(len(self.drtio_transceiver.channels)): core_name = "drtio" + str(i) coreaux_name = "drtioaux" + str(i) memory_name = "drtioaux" + str(i) + "_mem" drtio_csr_group.append(core_name) drtioaux_csr_group.append(coreaux_name) drtioaux_memory_group.append(memory_name) cdr = ClockDomainsRenamer({"rtio_rx": "rtio_rx" + str(i)}) core = cdr(DRTIOMaster( self.rtio_tsc, self.drtio_transceiver.channels[i])) setattr(self.submodules, core_name, core) self.drtio_cri.append(core.cri) self.csr_devices.append(core_name) coreaux = cdr(DRTIOAuxController(core.link_layer)) setattr(self.submodules, coreaux_name, coreaux) self.csr_devices.append(coreaux_name) memory_address = self.mem_map["drtioaux"] + 0x800*i self.add_wb_slave(memory_address, 0x800, coreaux.bus) self.add_memory_region(memory_name, memory_address | self.shadow_base, 0x800) self.config["HAS_DRTIO"] = None self.config["HAS_DRTIO_ROUTING"] = None self.add_csr_group("drtio", drtio_csr_group) self.add_csr_group("drtioaux", drtioaux_csr_group) self.add_memory_group("drtioaux_mem", drtioaux_memory_group) self.config["RTIO_FREQUENCY"] = str(self.drtio_transceiver.rtio_clk_freq/1e6) self.submodules.si5324_rst_n = gpio.GPIOOut(platform.request("si5324_33").rst_n) self.csr_devices.append("si5324_rst_n") i2c = self.platform.request("i2c") self.submodules.i2c = gpio.GPIOTristate([i2c.scl, i2c.sda]) self.csr_devices.append("i2c") self.config["I2C_BUS_COUNT"] = 1 self.config["HAS_SI5324"] = None self.config["SI5324_AS_SYNTHESIZER"] = None self.comb += [ platform.request("user_sma_clock_p").eq(ClockSignal("rtio_rx0")), platform.request("user_sma_clock_n").eq(ClockSignal("rtio")) ] rtio_clk_period = 1e9/self.drtio_transceiver.rtio_clk_freq # Constrain TX & RX timing for the first transceiver channel # (First channel acts as master for phase alignment for all channels' TX) gtx0 = self.drtio_transceiver.gtxs[0] platform.add_period_constraint(gtx0.txoutclk, rtio_clk_period) platform.add_period_constraint(gtx0.rxoutclk, rtio_clk_period) platform.add_false_path_constraints( self.crg.cd_sys.clk, gtx0.txoutclk, gtx0.rxoutclk) # Constrain RX timing for the each transceiver channel # (Each channel performs single-lane phase alignment for RX) for gtx in self.drtio_transceiver.gtxs[1:]: platform.add_period_constraint(gtx.rxoutclk, rtio_clk_period) platform.add_false_path_constraints( self.crg.cd_sys.clk, gtx0.txoutclk, gtx.rxoutclk) self.submodules.rtio_crg = _RTIOClockMultiplier(self.drtio_transceiver.rtio_clk_freq) self.csr_devices.append("rtio_crg") fix_serdes_timing_path(platform)