Exemple #1
0
    def __init__(self,
                 name="Top",
                 description="Container for FEB FPGA",
                 dev='/dev/datadev_0',
                 hwType='pcie',
                 ip='10.0.0.1',
                 **kwargs):
        super().__init__(name=name, description=description, **kwargs)

        # File writer
        dataWriter = pr.utilities.fileio.StreamWriter()
        self.add(dataWriter)

        ######################################################################

        if (hwType == 'hsio-dtm') or (hwType == 'rce-dpm'):
            # Create the mmap interface
            rceMap = rogue.hardware.axi.AxiMemMap('/dev/rce_memmap')
            # Add RCE version device
            self.add(rceg3.RceVersion(
                memBase=rceMap,
                expand=False,
            ))
            # Add PGPv3 to the FEB
            self.add(
                pgp.Pgp3AxiL(
                    name='Pgp3Mon',
                    memBase=rceMap,
                    offset=0xA0000000,
                    numVc=1,
                    writeEn=True,
                    expand=False,
                ))
            if (hwType == 'hsio-dtm'):
                # Add PGPv2b to the HSIO FPGA
                self.add(
                    pgp.Pgp2bAxi(
                        name='Pgp2bMon',
                        memBase=rceMap,
                        offset=0xA1000000,
                        expand=False,
                    ))
                # Connect the SRPv0 to PGPv2b.VC[1]
                pgp2bVc1 = rogue.hardware.axi.AxiStreamDma(
                    '/dev/axi_stream_dma_0', 1, True)
                srpV0 = rogue.protocols.srp.SrpV0()
                pr.streamConnectBiDir(srpV0, pgp2bVc1)

        if (hwType == 'pcie'):

            axiMemMap = rogue.hardware.axi.AxiMemMap(dev)

            self.add(
                pcie.AxiPcieCore(
                    memBase=axiMemMap,
                    offset=0x00000000,
                    expand=False,
                ))

            # for i in range(8):
            # self.add(pgp.Pgp3AxiL(
            # memBase         = axiMemMap,
            # name            = ('Pgp3Mon[%d]' % i),
            # offset          = (0x00800000 + i*0x10000),
            # numVc           = 16,
            # writeEn         = True,
            # expand          = False,
            # ))

        ######################################################################

        # Create an empty stream arrays
        configStream = [None] * 4
        dataStream = [None] * 4

        ########################################################################################################################
        # https://github.com/slaclab/rogue/blob/master/include/rogue/hardware/axi/AxiStreamDma.h
        # static boost::shared_ptr<rogue::hardware::axi::AxiStreamDma> create (std::string path, uint32_t dest, bool ssiEnable);
        ########################################################################################################################

        ######################################################################
        # PGPv3.[VC=0] = FEB SRPv3 Register Access
        # PGPv3.[VC=1] = RD53[DPORT=0] Streaming ASIC Configuration Interface
        # PGPv3.[VC=2] = RD53[DPORT=1] Streaming ASIC Configuration Interface
        # PGPv3.[VC=3] = RD53[DPORT=2] Streaming ASIC Configuration Interface
        # PGPv3.[VC=4] = RD53[DPORT=3] Streaming ASIC Configuration Interface
        # PGPv3.[VC=5] = RD53[DPORT=0] Streaming Data Interface
        # PGPv3.[VC=6] = RD53[DPORT=1] Streaming Data Interface
        # PGPv3.[VC=7] = RD53[DPORT=2] Streaming Data Interface
        # PGPv3.[VC=8] = RD53[DPORT=3] Streaming Data Interface
        ######################################################################

        if (hwType == 'simulation'):
            srpStream = pr.interfaces.simulation.StreamSim(host='localhost',
                                                           dest=0,
                                                           uid=12,
                                                           ssi=True)
            for i in range(4):
                configStream[i] = pr.interfaces.simulation.StreamSim(
                    host='localhost', dest=1 + i, uid=12, ssi=True)
                dataStream[i] = pr.interfaces.simulation.StreamSim(
                    host='localhost', dest=5 + i, uid=12, ssi=True)
        elif (hwType == 'eth'):
            rudp = pr.protocols.UdpRssiPack(host=ip, port=8192, packVer=2)
            srpStream = rudp.application(0)
            for i in range(4):
                configStream[i] = rudp.application(1 + i)
                dataStream[i] = rudp.application(5 + i)
        else:
            srpStream = rogue.hardware.axi.AxiStreamDma(dev, 0, True)
            for i in range(4):
                configStream[i] = rogue.hardware.axi.AxiStreamDma(
                    dev, 1 + i, True)
                dataStream[i] = rogue.hardware.axi.AxiStreamDma(
                    dev, 5 + i, True)

        ######################################################################

        # Connect the SRPv3 to PGPv3.VC[0]
        memMap = rogue.protocols.srp.SrpV3()
        pr.streamConnectBiDir(memMap, srpStream)

        for i in range(4):
            # Add data stream to file as channel [i] to dataStream[i]
            pr.streamConnect(dataStream[i], dataWriter.getChannel(i))

        ######################################################################

        # Add devices
        self.add(
            axiVer.AxiVersion(
                name='AxiVersion',
                memBase=memMap,
                offset=0x00000000,
                expand=False,
            ))

        self.add(
            xil.Xadc(
                name='Xadc',
                memBase=memMap,
                offset=0x00010000,
                expand=False,
            ))

        self.add(
            prom.AxiMicronP30(
                name='AxiMicronP30',
                memBase=memMap,
                offset=0x00020000,
                hidden=True,  # Hidden in GUI because indented for scripting
            ))

        self.add(
            common.SysReg(
                name='SysReg',
                description=
                'This device contains system level configuration and status registers',
                memBase=memMap,
                offset=0x00030000,
                expand=False,
            ))

        self.add(
            common.Ntc(
                name='Rd53Ntc',
                description=
                'This device contains the four NTC MAX6682 readout modules',
                memBase=memMap,
                offset=0x00040000,
                expand=False,
            ))

        self.add(
            nxp.Sa56004x(
                name='BoardTemp',
                description=
                'This device monitors the board temperature and FPGA junction temperature',
                memBase=memMap,
                offset=0x00050000,
                expand=False,
            ))

        self.add(
            linear.Ltc4151(
                name='BoardPwr',
                description=
                'This device monitors the board power, input voltage and input current',
                memBase=memMap,
                offset=0x00050400,
                senseRes=20.E-3,  # Units of Ohms
                expand=False,
            ))

        for i in range(4):
            self.add(
                common.RxPhyMon(
                    name=('RxPhyMon[%d]' % i),
                    memBase=memMap,
                    offset=(0x01000000 * (i + 1) + 0x00100000),
                    expand=False,
                ))

        self.add(
            common.Timing(
                name='Timing',
                description=
                'This device monitors the TLU and timing/trigger emulator',
                memBase=memMap,
                offset=0x05000000,
                expand=False,
            ))
Exemple #2
0
    def __init__(self,
                 name="Hardware",
                 description="Container for PCIe Hardware Registers",
                 numLane=4,
                 version3=False,
                 **kwargs):
        super().__init__(name=name, description=description, **kwargs)

        # Add axi-pcie-core
        self.add(
            pcie.AxiPcieCore(
                offset=0x00000000,
                numDmaLanes=numLane,
                expand=False,
            ))

        # Add PGP Core
        for i in range(numLane):

            if (version3):
                self.add(
                    pgp.Pgp3AxiL(
                        name=(f'PgpMon[{i}]'),
                        offset=(0x00800000 + i * 0x00010000 + 0 * 0x2000),
                        numVc=4,
                        writeEn=True,
                        expand=False,
                    ))

            else:
                self.add(
                    pgp.Pgp2bAxi(
                        name=(f'PgpMon[{i}]'),
                        offset=(0x00800000 + i * 0x00010000),
                        writeEn=True,
                        expand=False,
                    ))

            self.add(
                axi.AxiStreamMonitoring(
                    name=(f'PgpTxAxisMon[{i}]'),
                    offset=(0x00800000 + i * 0x00010000 + 1 * 0x2000),
                    numberLanes=4,
                    expand=False,
                ))

            self.add(
                axi.AxiStreamMonitoring(
                    name=(f'PgpRxAxisMon[{i}]'),
                    offset=(0x00800000 + i * 0x00010000 + 2 * 0x2000),
                    numberLanes=4,
                    expand=False,
                ))

        # Add Timing Core
        self.add(
            XilinxKcu1500Pgp.Timing(
                offset=0x00900000,
                numLane=numLane,
                expand=False,
            ))
Exemple #3
0
    def __init__(self,
                 name='PgpSemi',
                 description='Pgp Application',
                 numLanes=1,
                 usePgp3=True,
                 **kwargs):
        super().__init__(name=name, description=description, **kwargs)

        for i in range(numLanes):
            if usePgp3:
                self.add(
                    pgp.Pgp3AxiL(
                        name='Pgp3AxiL_%d' % i,
                        offset=0x10000 * i,
                        writeEn=True,
                    ))
            else:
                self.add(
                    pgp.Pgp2bAxi(
                        name='Pgp2bAxi_%d' % i,
                        offset=0x10000 * i,
                        writeEn=True,
                    ))
                self.add(
                    axi.AxiStreamMonAxiL(
                        name='TxMon_%d' % i,
                        offset=0x12000 * i,
                    ))
                self.add(
                    axi.AxiStreamMonAxiL(
                        name='RxMon_%d' % i,
                        offset=0x14000 * i,
                    ))

        for i in range(numLanes):
            self.add(
                pr.RemoteVariable(
                    name='rxLinkId_%d' % i,
                    offset=0x40000 + 4 * i,
                    bitSize=32,
                    mode='RO',
                ))

            self.add(
                pr.RemoteVariable(
                    name='txLinkId_%d' % i,
                    offset=0x40010 + 4 * i,
                    bitSize=32,
                    mode='RW',
                ))

        self.add(
            pr.RemoteVariable(
                name='qpllLock',
                offset=0x40020,
                bitSize=4,
                mode='RO',
            ))

        self.add(
            pr.RemoteVariable(
                name='qpllReset',
                offset=0x40024,
                bitSize=1,
                bitOffset=0,
                mode='RW',
            ))

        self.add(
            pr.RemoteVariable(
                name='txReset',
                offset=0x40024,
                bitSize=1,
                bitOffset=1,
                mode='RW',
            ))

        self.add(
            pr.RemoteVariable(
                name='rxReset',
                offset=0x40024,
                bitSize=1,
                bitOffset=2,
                mode='RW',
            ))
# Add PGPv3 to the FEB
base.add(pgp.Pgp3AxiL( 
    name    = 'Pgp3Mon',
    memBase = rceMap,
    offset  = 0xA0000000,
    numVc   = 1,
    writeEn = True,
    expand  = False,
)) 

# Check for HSIO DTM
if ( args.hwType == 'hsio-dtm' ):
    # Add PGPv2b to the HSIO FPGA
    base.add(pgp.Pgp2bAxi( 
        name    = 'Pgp2bMon',
        memBase = rceMap,
        offset  = 0xA1000000,
        expand  = False,
    ))    

#################################################################

# Start the system
base.start(
    pollEn    = args.pollEn,
    initRead  = args.initRead,
    pyroGroup = 'rce', 
    pyroAddr  = socket.gethostbyname(socket.gethostname()), # RCE IP   
)

# Close window and stop polling
def stop():
    def __init__(
            self,
            name="ClinkFeb",
            description="ClinkFeb Container",
            serial=None,
            camType=None,
            enI2C=False,  # disabled by default to prevent artificial timeouts due to long I2C access latency
            promLoad=False,
            **kwargs):
        super().__init__(name=name, description=description, **kwargs)

        # Init Variables for only 1 serial/camType per PGP lane
        self._serial = [serial, None]
        self._camType = [camType, None]

        # Add devices
        self.add(
            axi.AxiVersion(
                name='AxiVersion',
                offset=0x00000000,
                expand=False,
            ))

        if promLoad:
            self.add(
                prom.CypressS25Fl(
                    name='CypressS25Fl',
                    offset=0x00001000,
                    hidden=True,  # Hidden in GUI because indented for scripting
                ))

        else:

            self.add(
                nxp.Sa56004x(
                    name='BoardTemp',
                    description=
                    'This device monitors the board temperature and FPGA junction temperature',
                    offset=0x00002000,
                    expand=False,
                    enabled=
                    False,  # enabled=False because I2C are slow transactions and might "log jam" register transaction pipeline
                ))

            self.add(
                linear.Ltc4151(
                    name='BoardPwr',
                    description=
                    'This device monitors the board power, input voltage and input current',
                    offset=0x00002400,
                    senseRes=20.E-3,  # Units of Ohms
                    expand=False,
                    enabled=
                    False,  # enabled=False because I2C are slow transactions and might "log jam" register transaction pipeline
                ))

            self.add(xil.Xadc(
                name='Xadc',
                offset=0x00003000,
                expand=False,
            ))

            for i in range(4):
                self.add(
                    xceiver.Sfp(
                        name=f'Sfp[{i}]',
                        offset=0x00004000 + i * 0x00001000,
                        expand=False,
                        enabled=
                        False,  # enabled=False because I2C are slow transactions and might "log jam" register transaction pipeline
                    ))

            self.add(feb.Sem(
                name='Sem',
                offset=0x00008000,
                expand=False,
            ))

            self.add(
                cl.ClinkTop(
                    offset=0x00100000,
                    serial=self._serial,
                    camType=self._camType,
                    expand=True,
                ))

            self.add(
                feb.ClinkTrigCtrl(
                    name='TrigCtrl[0]',
                    description='Channel A trigger control',
                    offset=0x00200000,
                    expand=True,
                ))

            self.add(
                pgp.Pgp2bAxi(
                    name='PgpMon[0]',
                    offset=0x00400000,
                    statusCountBits=8,
                    errorCountBits=8,
                    writeEn=False,
                    expand=False,
                ))

            self.add(
                pgp.Pgp4AxiL(
                    name='PgpMon[1]',
                    offset=0x00410000,
                    numVc=4,
                    statusCountBits=16,
                    errorCountBits=8,
                    writeEn=False,
                    expand=True,
                ))
    def __init__(
            self,
            name="ClinkFeb",
            description="ClinkFeb Container",
            serial=[None, None],
            camType=[None, None],
            version3=False,  # true = PGPv3, false = PGP2b
            **kwargs):
        super().__init__(name=name, description=description, **kwargs)

        # Add devices
        self.add(
            axi.AxiVersion(
                name='AxiVersion',
                offset=0x00000000,
                expand=False,
            ))

        self.add(
            prom.CypressS25Fl(
                name='CypressS25Fl',
                offset=0x00001000,
                hidden=True,  # Hidden in GUI because indented for scripting
            ))

        self.add(
            nxp.Sa56004x(
                name='BoardTemp',
                description=
                'This device monitors the board temperature and FPGA junction temperature',
                offset=0x00002000,
                expand=False,
            ))

        self.add(
            linear.Ltc4151(
                name='BoardPwr',
                description=
                'This device monitors the board power, input voltage and input current',
                offset=0x00002400,
                senseRes=20.E-3,  # Units of Ohms
                expand=False,
            ))

        self.add(xil.Xadc(
            name='Xadc',
            offset=0x00003000,
            expand=False,
        ))

        self.add(
            cl.ClinkTop(
                offset=0x00100000,
                serial=serial,
                camType=camType,
                expand=False,
            ))

        self.add(
            feb.ClinkTrigCtrl(
                name='TrigCtrl[0]',
                description='Channel A trigger control',
                offset=0x00200000,
                expand=False,
            ))

        self.add(
            feb.ClinkTrigCtrl(
                name='TrigCtrl[1]',
                description='Channel B trigger control',
                offset=0x00200100,
                expand=False,
            ))

        for i in range(2):

            if (version3):
                self.add(
                    pgp.Pgp3AxiL(
                        name=(f'PgpMon[{i}]'),
                        offset=(0x00400000 + i * 0x2000),
                        numVc=4,
                        writeEn=False,
                        expand=False,
                    ))

                # self.add(axi.AxiStreamMonitoring(
                # name        = (f'PgpTxAxisMon[{i}]'),
                # offset      = (0x00400000 + i*0x4000 + 0x4000),
                # numberLanes = 4,
                # expand      = False,
                # ))

                # self.add(axi.AxiStreamMonitoring(
                # name        = (f'PgpRxAxisMon[{i}]'),
                # offset      = (0x00400000 + i*0x4000 + 0x6000),
                # numberLanes = 4,
                # expand      = False,
                # ))

            else:
                self.add(
                    pgp.Pgp2bAxi(
                        name=(f'PgpMon[{i}]'),
                        offset=(0x00400000 + i * 0x6000 + 0 * 0x2000),
                        writeEn=False,
                        expand=False,
                    ))
Exemple #7
0
    def __init__(self,
                 name="pciServer",
                 description="DMA Loopback Testing",
                 **kwargs):
        super().__init__(name=name, description=description, **kwargs)

        # Create PCIE memory mapped interface
        self.memMap = rogue.hardware.axi.AxiMemMap(args.dev)

        # Add the PCIe core device to base
        self.add(
            pcie.AxiPcieCore(
                offset=0x00000000,
                memBase=self.memMap,
                numDmaLanes=args.numLane,
                boardType=args.boardType,
                expand=True,
            ))

        # Add PGP Core
        for lane in range(args.numLane):
            if (args.version == 4):
                self.add(
                    pgp.Pgp4AxiL(
                        name=f'Lane[{lane}]',
                        offset=(0x00800000 + lane * 0x00010000),
                        memBase=self.memMap,
                        numVc=args.numVc,
                        writeEn=True,
                        expand=True,
                    ))
            elif (args.version == 3):
                self.add(
                    pgp.Pgp3AxiL(
                        name=f'Lane[{lane}]',
                        offset=(0x00800000 + lane * 0x00010000),
                        memBase=self.memMap,
                        numVc=args.numVc,
                        writeEn=True,
                        expand=False,
                    ))
            else:
                self.add(
                    pgp.Pgp2bAxi(
                        name=f'Lane[{lane}]',
                        offset=(0x00800000 + lane * 0x00010000 + 0x1000),
                        memBase=self.memMap,
                        expand=False,
                    ))

            self.add(
                axi.AxiStreamMonAxiL(
                    name=(f'PgpTxAxisMon[{lane}]'),
                    offset=(0x00800000 + lane * 0x00010000 + 0x3000),
                    numberLanes=args.numVc,
                    memBase=self.memMap,
                    expand=False,
                ))

            self.add(
                axi.AxiStreamMonAxiL(
                    name=(f'PgpRxAxisMon[{lane}]'),
                    offset=(0x00800000 + lane * 0x00010000 + 0x4000),
                    numberLanes=args.numVc,
                    memBase=self.memMap,
                    expand=False,
                ))
Exemple #8
0
    def __init__(self,
                 name="pciServer",
                 description="DMA Loopback Testing",
                 **kwargs):
        super().__init__(name=name, description=description, **kwargs)

        # Create PCIE memory mapped interface
        self.memMap = rogue.hardware.axi.AxiMemMap(args.dev)

        if (args.swRx or args.swTx):
            self.dmaStream = [[None for x in range(args.numVc)]
                              for y in range(args.numLane)]
            self.prbsRx = [[None for x in range(args.numVc)]
                           for y in range(args.numLane)]
            self.prbsTx = [[None for x in range(args.numVc)]
                           for y in range(args.numLane)]

        # Add the PCIe core device to base
        self.add(
            pcie.AxiPcieCore(
                offset=0x00000000,
                memBase=self.memMap,
                numDmaLanes=args.numLane,
                boardType=args.boardType,
                expand=True,
            ))

        # Add PGP Core
        for lane in range(args.numLane):
            if (args.version == 4):
                self.add(
                    pgp.Pgp4AxiL(
                        name=f'Lane[{lane}]',
                        offset=(0x00800000 + lane * 0x00010000),
                        memBase=self.memMap,
                        numVc=args.numVc,
                        writeEn=True,
                        expand=True,
                    ))
            elif (args.version == 3):
                self.add(
                    pgp.Pgp3AxiL(
                        name=f'Lane[{lane}]',
                        offset=(0x00800000 + lane * 0x00010000),
                        memBase=self.memMap,
                        numVc=args.numVc,
                        writeEn=True,
                        expand=False,
                    ))
            else:
                self.add(
                    pgp.Pgp2bAxi(
                        name=f'Lane[{lane}]',
                        offset=(0x00800000 + lane * 0x00010000 + 0x1000),
                        memBase=self.memMap,
                        expand=False,
                    ))

            self.add(
                axi.AxiStreamMonAxiL(
                    name=(f'PgpTxAxisMon[{lane}]'),
                    offset=(0x00800000 + lane * 0x00010000 + 0x3000),
                    numberLanes=args.numVc,
                    memBase=self.memMap,
                    expand=False,
                ))

            self.add(
                axi.AxiStreamMonAxiL(
                    name=(f'PgpRxAxisMon[{lane}]'),
                    offset=(0x00800000 + lane * 0x00010000 + 0x4000),
                    numberLanes=args.numVc,
                    memBase=self.memMap,
                    expand=False,
                ))

            # Loop through the virtual channels
            for vc in range(args.numVc):

                if (args.swRx or args.swTx):
                    self.dmaStream[lane][vc] = rogue.hardware.axi.AxiStreamDma(
                        args.dev, (0x100 * lane) + vc, 1)

                if (args.swRx):

                    # Connect the SW PRBS Receiver module
                    self.prbsRx[lane][vc] = pr.utilities.prbs.PrbsRx(
                        name=('SwPrbsRx[%d][%d]' % (lane, vc)),
                        width=args.prbsWidth,
                        checkPayload=True,
                        expand=False,
                    )
                    self.dmaStream[lane][vc] >> self.prbsRx[lane][vc]
                    self.add(self.prbsRx[lane][vc])

                if (args.swTx):

                    # Connect the SW PRBS Transmitter module
                    self.prbsTx[lane][vc] = pr.utilities.prbs.PrbsTx(
                        name=('SwPrbsTx[%d][%d]' % (lane, vc)),
                        width=args.prbsWidth,
                        expand=False,
                    )
                    self.prbsTx[lane][vc] >> self.dmaStream[lane][vc]
                    self.add(self.prbsTx[lane][vc])

        @self.command()
        def EnableAllSwTx():
            swTxDevices = root.find(typ=pr.utilities.prbs.PrbsTx)
            for tx in swTxDevices:
                tx.txEnable.set(True)

        @self.command()
        def DisableAllSwTx():
            swTxDevices = root.find(typ=pr.utilities.prbs.PrbsTx)
            for tx in swTxDevices:
                tx.txEnable.set(False)