This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

6678多核同时使用SRIO发包问题

        目前想实现8核同时运行不同的算法,然后分别将结果通过swrite包从SRIO 4x发出。每个核单独使用一个LSU,每个LSU分配相同数量的shadow register,当多个核同时配置不同的LSU发包时,SRIO底层是如何在多个LSU之间仲裁的?是采取下面哪一种方式?

1、采取优先级的方式,先到先发,直到将一个LSU所请求的数据包全部发出之后,才开始发送下一个LSU请求的包。

2、所有LSU优先级相同,在不同的LSU间以round robin的形式循环发包,依次为每个LSU发一定数量的包,直到把所有核要发送的数据发送完毕。

  • 问题已解决! 通过FPGA侧抓包证明,各个LSU间采用的是round robin轮询的方式。如下图所示:

             8个核分别通过一个LSU以swrite包格式,连续发送同一幅400K的图片,每个LSU的srcID依次为A0~A7。从图中可看出,每个核所对应的LSU依次发出一个256byte的swrite数据包,不断循环。

  • 你好,我们原先只使用单核的SRIO 4X,现在需要在多核使用SRIO,我是在TI提供的例程基础上修改的SRIO。有以下问题想请教您

    1、多核srio需要修改原先例程的驱动函数吗?那个driver函数的句柄如何让所有核共享呢?

    2、是否要在每个核上都初始化和配置srio socket?

    3、如何在多核上分配LSU?

    4、dsp通过srio与fpga通信,是否每个核都可以相应doorbell中断?

    谢谢!

  • 你好!

    1、我也是在PDK例程的基础上改的,但是我的改动比较大,把driver部分全部替换成了底层csl驱动来实现,并没有使用任何PDK里的SRIO driver函数。

    2、应该需要的。

    3、不需要分配,一共8个LSU,每个核想用哪个就用哪个。从提高传输效率的角度来看,最好还是每个核使用单独的LSU。

    4、可以,SRIO里一共有24个中断源INTDST0~23,其中8个是直接映射到每个核内部的中断控制器,其余16个都可通过片上中断控制器CIC0和CIC1进行二次路由。你只需要将doorbell中断路由到这16个中断源中的任意一个,然后再通过CIC0和CIC1将该中断源二次路由到每个核内部的中断控制器就可以了。

  • 你好!

       谢谢你的回复!

        我用的是6670芯片,例程里的驱动是有问题吗?那我理解是先只用一个核先对srio外设配置和初始化,然后在每个核再初始化socket吧。那配置中断应该放在那里呢?是每个核都要单独配置吧?

  • 1、驱动本身没有任何问题,相对也比较稳定。只是我觉得驱动函数相对结构比较复杂,代码量也比较大,生成的out文件里.text段也比较大,过于冗余,用起来感觉也不顺溜。所以直接用PDK里的CSL来实现,代码精简了很多。

    2、doorbell中断路由只需要配置一次,中断二次路由到每个核都要在每个核中单独配置。

  • 你好!

            关于doorbell中断,我还是没有在多核的情况下调通,我理解的是doorbell中断路由到不同的host interrupt ID上,每个核都有自己的host interrupt ID,这个我是在bios启动之后在socket start之前在每个核上单独配置的,现在的情况是dsp做自环数据是可以收发正确的,但是无法进入doorbell中断。

    以下是我配置的doorbell中断,初始化时的配置未列出应该是没问题的,我用的是CSL_INTC0_INTDST1和CSL_INTC0_INTDST5,并将其绑定到host interrupt ID 8(core0的) 和 host interrupt ID 24(core1的)。我是不是哪里配置的有问题或者理解的有问题要,期待您的解答!

    CSL_SRIO_DisableInterruptPacing(hSrioCSL,1);

    CSL_SRIO_DisableInterruptPacing(hSrioCSL,5);

    CpIntc_dispatchPlug(CSL_INTC0_INTDST1,(CpIntc_FuncPtr)myDoorbellIsr1,(UArg)hDrvManagedSrioDrv,)

    CpIntc_dispatchPlug(CSL_INTC0_INTDST1,(CpIntc_FuncPtr)myDoorbellIsr1,(UArg)hDrvManagedSrioDrv,)

    CpIntc_mapSysIntToHostInt(0,CSL_INTC0_INTDST1,8);

    CpIntc_mapSysIntToHostInt(0,CSL_INTC0_INTDST5,24);

    CpIntc_enableSysInt(0,CSL_INTC0_INTDST1);

    CpIntc_enableSysInt(0,CSL_INTC0_INTDST5);

    eventID_0 = CpIntc_getEventId(8);

    eventID_1 = CpIntc_getEventId(24);

    EventCombiner_dispatchPlug(eventID_0,CpIntc_dispatch,8,TRUE);

    EventCombiner_dispatchPlug(eventID_1,CpIntc_dispatch,24,TRUE);