通过代理进行队列通信的方法与装置与流程

文档序号:15685708发布日期:2018-10-16 21:02阅读:123来源:国知局

本申请涉及集成电路技术领域,具体涉及通过代理进行队列通信的方法与装置。



背景技术:

片上系统(soc,systemonchip)包括多个组件,例如,一个或多个cpu核、存储器接口、总线接口等。各组件之间需进行存在多种消息的交换。

现有技术的amba(advancedmicrocontrollerbusarchitecture,先进微处理器总线架构)总线架构中定义了多种总线,包括ahb(advancedhigh-performancebus,先进高性能总线)、asb(advancedsystembus,先进系统总线)、apb(advancedperipheralbus,先进外设总线)、axi(advancedextensibleinterface,先进可扩展接口)等。现有技术的片上系统总线协议还包括例如ocp(opencoreprotocol,开放核心协议)。



技术实现要素:

片上系统的各组件之间,有多种不同层次、不同功能的通信方式,例如,共享存储器的组件之间频繁交换存储器指针,组件之间可通过先进先出(fifo)队列按顺序交换消息。

由片上系统的各组件来管理多种消息传递过程,增加了组件的复杂度,且需要额外的精力来提升消息交换的处理效率。

本申请提供在片上系统的各组件之间用于传递消息的消息系统。为组件之间交换存储器指针、通过队列通信、为各组件访问存储器等多种通信方式提供优化,从而降低组件的复杂度、提升消息交换的处理效率。

根据本申请的第一方面,提供了根据本申请的第一方面的第一片上系统的消息系统,包括代理和消息总线,代理将片上系统的组件耦合到消息总线,使得片上系统的组件之间通过代理和消息总线通信。

根据本申请的第一方面的第一片上系统的消息系统,提供了根据本申请的第一方面的第二片上系统的消息系统,代理基于数据报文通信。

根据本申请的第一方面的第一或第二片上系统的消息系统,提供了根据本申请的第一方面的第三片上系统的消息系统,数据报文携带目标代理标识与功能标识,目标代理标识用于识别数据报文的接收方代理,功能标识用于识别报文的类型。

根据本申请的第一方面的第一至第三片上系统的消息系统之一,提供了根据本申请的第一方面的第四片上系统的消息系统,数据报文的类型包括配置报文、访存报文、队列报文和指针报文的一种或多种。

根据本申请的第一方面的第一至第四片上系统的消息系统之一,提供了根据本申请的第一方面的第五片上系统的消息系统,代理通过报文的功能标识识别数据报文的类型。

根据本申请的第一方面的第一至第五片上系统的消息系统之一,提供了根据本申请的第一方面的第六片上系统的消息系统,消息总线包括两个或更多个端口,端口包括仲裁器和译码器,消息总线的仲裁器耦合到消息总线的译码器;消息总线的仲裁器和消息总线的译码器耦合到分别代理,代理通过消息总线的仲裁器向消息总线发送数据报文,代理通过消息总线的译码器从消息总线接收数据报文。

根据本申请的第一方面的第六片上系统的消息系统,提供了根据本申请的第一方面的第七片上系统的消息系统,消息总线的仲裁器耦合到消息总线的一个、多个或所有译码器。

根据本申请的第一方面的第六或第七片上系统的消息系统,提供了根据本申请的第一方面的第八片上系统的消息系统,消息总线的仲裁器根据接收的数据报文的目标代理标识,将数据报文发送到消息总线的译码器。

根据本申请的第一方面的第六至第八片上系统的消息系统之一,提供了根据本申请的第一方面的第九片上系统的消息系统,消息总线的译码器耦合到消息总线的一个、多个或所有仲裁器。

根据本申请的第一方面的第六至第九片上系统的消息系统之一,提供了根据本申请的第一方面的第十片上系统的消息系统,消息总线的译码器接收来自消息总线的仲裁器的数据报文,并将数据报文转发给与消息总线的该译码器相耦合的代理。

根据本申请的第一方面的第六至第十片上系统的消息系统之一,提供了根据本申请的第一方面的第十一片上系统的消息系统,代理包括仲裁器、译码器和报文处理装置,仲裁器、译码器和报文处理装置相耦合,代理的仲裁器耦合到消息总线的仲裁器,代理的译码器耦合到消息总线的译码器,报文处理装置生成数据报文,并通过代理的仲裁器发送给消息总线,以及代理的译码器从消息总线的译码器接收数据报文,并将数据报文转发给报文处理装置。

根据本申请的第一方面的第十一消息系统,提供了根据本申请的第一方面的第十二片上系统的消息系统,代理的译码器依据数据报文中的功能标识将数据报文发送给代理的报文处理装置。

根据本申请的第一方面的第十一或第十二片上系统的消息系统,提供了根据本申请的第一方面的第十三片上系统的消息系统,报文处理装置包括寄存器,片上系统的组件可访问报文处理装置的寄存器。

根据本申请的第一方面的第十一至第十三片上系统的消息系统之一,提供了根据本申请的第一方面的第十四片上系统的消息系统,报文处理装置还包括中断模块,用于向片上系统的组件提供中断。

根据本申请的第一方面的第十一至第十四片上系统的消息系统之一,提供了根据本申请的第一方面的第十五片上系统的消息系统,代理的报文处理装置包括配置模块、指针同步模块、队列tx模块、队列rx模块和访存模块的一种或多种。

根据本申请的第一方面的第十五消息系统,提供了根据本申请的第一方面的第十六片上系统的消息系统,指针同步模块通过发送或接收指针报文来同其他代理的指针同步模块同步指针。

根据本申请的第一方面的第十五或第十六片上系统的消息系统,提供了根据本申请的第一方面的第十七片上系统的消息系统,配置模块通过配置报文对代理进行配置。

根据本申请的第一方面的第十五至第十七片上系统的消息系统之一,提供了根据本申请的第一方面的第十八片上系统的消息系统,队列tx模块通过队列报文向队列rx模块发送队列条目,接收队列rx模块的响应并更新队列指针。

根据本申请的第一方面的第十五至第十八片上系统的消息系统之一,提供了根据本申请的第一方面的第十九片上系统的消息系统,访存模块通过向缓存代理发送访存报文来访问缓存代理所耦合的存储器。

根据本申请的第一方面的第一至第十九片上系统的消息系统之一,提供了根据本申请的第一方面的第二十片上系统的消息系统,代理包括第一cpu代理、缓存代理与消息代理的一个或多个;第一cpu代理耦合到第一cpu、第一紧耦合存储器与消息总线,所述缓存代理耦合到消息总线与片外存储器,所述消息代理耦合到消息总线与所述缓存代理。

根据本申请的第一方面的第二十片上系统的消息系统,提供了根据本申请的第一方面的第二十一片上系统的消息系统,所述第一cpu代理包括队列tx模块、队列rx模块、配置模块、指针同步模块与访存模块。

根据本申请的第一方面的第二十一片上系统的消息系统,提供了根据本申请的第一方面的第二十二片上系统的消息系统,所述第一cpu代理的访存模块用于访问紧耦合存储器,和/或用于通过生成发送给所述缓存代理的访存报文以访问片外存储器。

根据本申请的第一方面的第二十至第二十二片上系统的消息系统之一,提供了根据本申请的第一方面的第二十三片上系统的消息系统,代理还包括第二cpu代理;所述第二cpu代理包括队列tx模块、队列rx模块、配置模块、指针同步模块与访存模块。

根据本申请的第一方面的第二十三片上系统的消息系统,提供了根据本申请的第一方面的第二十四片上系统的消息系统,所述第一cpu代理的队列tx模块通过生成队列报文将队列条目发送给第二cpu代理或消息代理的队列rx模块,并维护队列指针;所述第一cpu代理的队列rx模块通过接收队列报文从第二cpu代理或消息代理的队列tx模块接收队列条目,并维护队列指针。

根据本申请的第一方面的第二十三或第二十四片上系统的消息系统,提供了根据本申请的第一方面的第二十五片上系统的消息系统,所述第一cpu代理的指针同步模块用于与所述第二cpu代理的指针同步模块同步指针。

根据本申请的第一方面的第二十至第二十五片上系统的消息系统之一,提供了根据本申请的第一方面的第二十六片上系统的消息系统,所述缓存代理包括配置模块与访存模块。

根据本申请的第一方面的第二十六片上系统的消息系统,提供了根据本申请的第一方面的第二十七片上系统的消息系统,所述缓存代理的访存模块通过接收cpu代理发出的访存报文访问片外存储器。

根据本申请的第一方面的第二十至第二十七片上系统的消息系统之一,提供了根据本申请的第一方面的第二十八片上系统的消息系统,所述消息代理包括队列tx模块、队列rx模块与配置模块。

根据本申请的第一方面的第二十八片上系统的消息系统,提供了根据本申请的第一方面的第二十九片上系统的消息系统,所述消息代理还包括访存模块,用于通过生成发送给所述缓存代理的访存报文访问片外存储器。

根据本申请的第一方面的第二十八或第二十九片上系统的消息系统,提供了根据本申请的第一方面的第三十片上系统的消息系统,所述消息代理耦合到第二消息总线,所述缓存代理耦合到第二消息总线,所述消息代理通过第二消息总线访问所述缓存代理。

根据本申请的第一方面的第二十至第三十片上系统的消息系统之一,提供了根据本申请的第一方面的第三十一片上系统的消息系统,代理还包括nvme代理;nvme代理包括队列tx模块、队列rx模块、配置模块、指针同步模块与访存模块。

根据本申请的第一方面的第三十一片上系统的消息系统,提供了根据本申请的第一方面的第三十二片上系统的消息系统,所述nvme代理的访存模块用于访问紧耦合存储器,和/或用于通过生成发送给所述缓存代理的访存报文以访问片外存储器。

根据本申请的第一方面的第三十一或第三十二片上系统的消息系统,提供了根据本申请的第一方面的第三十三片上系统的消息系统,所述nvme代理的队列tx模块通过生成队列报文将队列条目发送给第一cpu代理、第二cpu代理或消息代理的队列rx模块,并维护队列指针;所述nvme代理的队列rx模块通过接收队列报文从第一cpu代理、第二cpu代理或消息代理的队列tx模块接收队列条目,并维护队列指针。

根据本申请的第一方面的第三十一至第三十三片上系统的消息系统之一,提供了根据本申请的第一方面的第三十四片上系统的消息系统,所述nvme代理的指针同步模块用于与所述第一cpu代理或所述第二cpu代理的指针同步模块同步指针。

根据本申请的第二方面,提供了根据本申请的第二方面的第一代理,包括仲裁器、译码器、队列tx模块与队列rx模块,仲裁器与译码器耦合到消息总线;仲裁器将队列tx模块与队列rx模块耦合到消息总线;译码器将消息总线耦合到队列tx模块与队列rx模块。

根据本申请的第二方面的第一代理,提供了根据本申请的第二方面的第二代理,代理基于数据报文通信。

根据本申请的第二方面的第一或第二代理,提供了根据本申请的第二方面的第三代理,数据报文携带目标代理标识与功能标识,目标代理标识用于识别数据报文的接收方代理,功能标识用于识别报文的类型。

根据本申请的第二方面的第一至第三代理之一,提供了根据本申请的第二方面的第四代理,数据报文的类型包括配置报文、访存报文、队列报文和指针报文的一种或多种。

根据本申请的第二方面的第一至第四代理之一,提供了根据本申请的第二方面的第五代理,代理的仲裁器向消息总线发送数据报文,代理的译码器从消息总线接收数据报文。

根据本申请的第二方面的第一至第五代理之一,提供了根据本申请的第二方面的第六代理,队列tx模块通过队列报文向队列rx模块发送队列条目,接收队列rx模块的响应并更新队列指针。

根据本申请的第二方面的第一至第六代理之一,提供了根据本申请的第二方面的第七代理,队列rx模块从队列tx模块获取队列条目,并更新队列指针。

根据本申请的第二方面的第一至第七代理之一,提供了根据本申请的第二方面的第八代理,代理还包括访存模块,访存模块通过访存报文访问存储器。

根据本申请的第二方面的第一至第八代理之一,提供了根据本申请的第二方面的第九代理,队列tx模块和队列rx模块均包括寄存器,用于指示队列状态。

根据本申请的第二方面的第一至第九代理之一,提供了根据本申请的第二方面的第十代理,队列tx模块包括指针管理器、访存单元、应答缓存单元、访存接收单元和rcv单元,rcv单元耦合到指针管理器和译码器,指针管理器还耦合到访存单元、rcv单元以及代理接口,访存单元还耦合到应答缓存单元,应答缓存单元还耦合到访存接收模块,访存接收模块还耦合到仲裁器。

根据本申请的第二方面的第一至第十代理之一,提供了根据本申请的第二方面的第十一代理,队列rx模块包括第二指针管理器、第二访存单元、txd单元、第二应答缓存单元和第二rcv单元;第二rcv单元还耦合到第二指针管理器、第二应答缓存单元和译码器,指针管理器还耦合到txd单元,txd单元耦合到第二应答缓存单元以及仲裁器。

根据本申请的第二方面的第十或第十一代理,提供了根据本申请的第二方面的第十二代理,队列tx模块的指针管理器依据队列的队头指针与队尾指针的值,在队列tx模块的寄存器中指示队列的状态,队列tx模块的指针管理器还更新队尾指针的值。

根据本申请的第二方面的第十至第十二代理之一,提供了根据本申请的第二方面的第十三代理,队列tx模块的访存单元依据队头指针的值访问存储器。

根据本申请的第二方面的第十至第十三代理之一,提供了根据本申请的第二方面的第十四代理,队列tx模块的访存单元还将队列条目的信息填入队列tx模块的应答缓存单元。

根据本申请的第二方面的第十至第十四代理之一,提供了根据本申请的第二方面的第十五代理,填入队列tx模块的应答缓存单元的信息包括队列标识符和队列接收方代理标识符。

根据本申请的第二方面的第十至第十五代理之一,提供了根据本申请的第二方面的第十六代理,队列tx模块的访存接收单元从队列tx模块的应答缓存单元获取队列的队列条目的信息与获取的条目内容,封装成访存报文,通过仲裁器发送给消息总线。

根据本申请的第二方面的第十至第十六代理之一,提供了根据本申请的第二方面的第十七代理,队列tx模块的rcv单元从译码器接收指示队列的接收方代理已接收了被发送的队列的条目的报文。

根据本申请的第二方面的第十至第十七代理之一,提供了根据本申请的第二方面的第十八代理,响应于队列tx模块的rcv单元从译码器接收报文,队列tx模块的rcv单元更新指针管理器记录的队列的队头指针。

根据本申请的第二方面的第十一代理,提供了根据本申请的第二方面的第十九代理,队列rx模块的第二指针管理器依据队列的队头指针与队尾指针的值,在队列rx模块的寄存器中指示队列的状态。

根据本申请的第二方面的第十九代理,提供了根据本申请的第二方面的第二十代理,队列rx模块的第二rcv单元从译码器接收队列报文,并从队列rx模块的第二指针管理器获取队列状态。

根据本申请的第二方面的第十九或第二十代理,提供了根据本申请的第二方面的第二十一代理,队列rx模块的第二rcv单元从第二指针管理器获取的队列状态为未满时,从队列rx模块的第二指针管理器获取队列队尾指针所指示的存储器地址,从队列报文获取队列条目的内容,通过第二访存单元将队列条目写入存储器。

根据本申请的第二方面的第十九至第二十一代理之一,提供了根据本申请的第二方面的第二十二代理,队列rx模块的第二rcv单元还将队列条目的信息填入队列rx模块的第二应答缓存单元。

根据本申请的第二方面的第十九至第二十二代理之一,提供了根据本申请的第二方面的第二十三代理,填入队列rx模块的第二应答缓存单元的信息包括队列标识符和队列发送方代理标识符。

根据本申请的第二方面的第十九或第二十代理,提供了根据本申请的第二方面的第二十四代理,队列rx模块的第二rcv单元从第二指针管理器获取的队列状态为满时,队列rx模块的第二rcv单元丢弃从队列报文接收的队列条目。

根据本申请的第二方面的第二十四代理,提供了根据本申请的第二方面的第二十五代理,队列rx模块的第二rcv单元还将队列条目的信息填入队列rx模块的第二应答缓存单元。

根据本申请的第二方面的第二十四或第二十五代理,提供了根据本申请的第二方面的第二十六代理,填入队列rx模块的第二应答缓存单元的信息包括队列标识符、队列接收方代理标识符以及条目未被接收的指示。

根据本申请的第二方面的第十九至第二十六代理之一,提供了根据本申请的第二方面的第二十七代理,响应于第二访存单元向存储器添加队列的条目完成,队列rx模块的txd单元从队列rx模块的第二应答缓存单元获取队列的队列条目的信息,封装成访存报文,通过仲裁器发送给消息总线,以向队列的发送方代理指示队列的接收方代理已接收了其发送的队列的条目。

根据本申请的第二方面的第十九至第二十七代理之一,提供了根据本申请的第二方面的第二十八代理,队列rx模块的txd单元更新队列rx模块的第二指针管理器记录的队列的队尾指针。

根据本申请的第二方面的第十九至第二十八代理之一,提供了根据本申请的第二方面的第二十九代理,队列rx模块的txd单元检查队列rx模块的应答缓存单元中的队列条目的消息。

根据本申请的第二方面的第十九至第二十九代理之一,提供了根据本申请的第二方面的第三十代理,响应于队列rx模块的txd单元检查队列rx模块的第二应答缓存单元中的队列条目的消息,若消息指示队列条目未被接收,依据队列标识符、队列接收方代理标识符以及队列条目未被接收的指示,封装成队列报文,通过仲裁器发送给消息总线,以向队列的发送方代理指示队列的接收方代理未能接收该队列条目。

根据本申请的第三方面,提供了根据本申请的第三方面的第一向队列添加条目的方法,包括如下步骤:响应于队列的队尾指针超前于队头指针,指针管理器获取队头指针;依据队头指针以及指定的队列条目尺寸,访存单元从存储器获取队列条目;访存单元将队列标识符填入应答缓存单元;响应于从存储器获取了队列的条目,访存接收单元从应答缓存单元获取队列标识符,将队列条目、队列标识符以及与队列接收方代理标识符封装成队列报文,通过代理的仲裁器发送给消息总线;响应于rcv单元从译码器接收指示队列的接收方代理已接收了被发送的队列条目的报文,rcv单元更新队列的队头指针。

根据本申请的第三方面的第一向队列添加条目的方法,提供了根据本申请的第三方面的第二向队列添加条目的方法,应答缓存单元可存储对应于多个队列条目的每个的队列标识符与接收代理标识符。

根据本申请的第三方面的第一或第二向队列添加条目的方法,提供了根据本申请的第三方面的第三向队列添加条目的方法,填入应答缓存单元的信息包括队列标识符、队列接收代理标识符。

根据本申请的第三方面的第一或第二向队列添加条目的方法,提供了根据本申请的第三方面的第四向队列添加条目的方法,访存接收单元获取同队列标识符对应的队列接收代理标识符。

根据本申请的第三方面的第一至第四向队列添加条目的方法之一,提供了根据本申请的第三方面的第五向队列添加条目的方法,在指针管理器中为每条队列记录队头指针与队尾指针。

根据本申请的第三方面的第一至第五向队列添加条目的方法之一,提供了根据本申请的第三方面的第六向队列添加条目的方法,rcv单元依据从代理的译码器接收的队列报文获取队列的接收方代理的状态。

根据本申请的第三方面的第六向队列添加条目的方法,提供了根据本申请的第三方面的第七向队列添加条目的方法,队列的接收方代理的状态包括队列接收方代理已接收队列条目、队列接收方代理暂时无法接收队列条目,或者队列接收方代理没有正确接收队列条目。

根据本申请的第三方面的第六或第七向队列添加条目的方法,提供了根据本申请的第三方面的第八向队列添加条目的方法,若队列接收方代理没有正确接收队列条目,不更新队列的队头指针,以及依据队列的队尾指针,访存接收单元再次从存储器获取队列条目,以发送给队列的接收方代理。

根据本申请的第三方面的第六至第八向队列添加条目的方法之一,提供了根据本申请的第三方面的第九向队列添加条目的方法,若队列接收方代理暂时无法接收队列条目,指针管理器不更新队列的队头指针,以及暂停获取该队列的条目。

根据本申请的第四方面,提供了根据本申请的第四方面的第一从队列获取条目的方法,包括如下步骤:响应于收到队列条目,rcv单元将队列条目发送给存储器,并将队列标识符填入应答缓存单元;响应于存储器指示队列条目被写入存储器,txd单元从应答缓存单元获取队列标识符,依据队列标识符、队列发送方代理标识符生成指示队列接收方状态的队列报文,发送给消息总线,并更新队列的队尾指针;响应于队列的队尾指针超前于队头指针,指针管理器向cpu指示队列状态为非空。

根据本申请的第四方面的第一从队列获取条目的方法,提供了根据本申请的第四方面的第二从队列获取条目的方法,响应于cpu的访问请求,指针管理器更新队列队头指针。

根据本申请的第四方面的第一或第二从队列获取条目的方法,提供了根据本申请的第四方面的第三从队列获取条目的方法,应答缓存单元存储对应于多个队列条目的每个的队列标识符与队列发送方代理标识符。

根据本申请的第四方面的第一至第三从队列获取条目的方法之一,提供了根据本申请的第四方面的第四从队列获取条目的方法,填入应答缓存单元的信息包括队列标识符、队列发送方代理标识符。

根据本申请的第四方面的第一至第四从队列获取条目的方法之一,提供了根据本申请的第四方面的第五从队列获取条目的方法,txd单元获取同队列标识符对应的队列发送代理标识符。

根据本申请的第四方面的第一至第五从队列获取条目的方法之一,提供了根据本申请的第四方面的第六从队列获取条目的方法,在指针管理器中为每条队列记录队头指针与队尾指针。

根据本申请的第四方面的第一至第六从队列获取条目的方法之一,提供了根据本申请的第四方面的第七从队列获取条目的方法,响应于队列满,rcv单元丢弃接收的队列条目,生成指示队列接收方代理没有正确接收队列条目的队列报文,发送给消息总线。

根据本申请的第四方面的第一至第七从队列获取条目的方法之一,提供了根据本申请的第四方面的第八从队列获取条目的方法,响应于队列仅能容纳一个条目,txd单元生成指示队列接收方代理暂时无法接收队列条目的队列报文,发送给消息总线。

根据本申请的第五方面,提供了根据本申请的第五方面的第一向队列添加条目的方法,响应于队列的队尾指针超前于队头指针,获取队头指针;依据队头指针以及指定的队列条目尺寸,从存储器获取队列条目;将队列标识符填入缓存;响应于从存储器获取了队列的条目,从应答缓存获取队列标识符,将队列条目、队列标识符以及与队列接收方代理标识符封装成队列报文,通过代理的仲裁器发送给消息总线;响应于从译码器接收指示队列的接收方代理已接收了被发送的队列条目的报文,更新队列的队头指针。

根据本申请的第五方面的第一向队列添加条目的方法,提供了根据本申请的第五方面的第二向队列添加条目的方法,缓存可存储对应于多个队列条目的每个的队列标识符与队列接收方代理标识符。

根据本申请的第五方面的第一或第二向队列添加条目的方法,提供了根据本申请的第五方面的第三向队列添加条目的方法,填入应答缓存模块的信息包括队列标识符、队列接收方代理标识符。

根据本申请的第五方面的第一或第二向队列添加条目的方法,提供了根据本申请的第五方面的第四向队列添加条目的方法,获取同队列标识符对应的队列接收方代理标识符。

根据本申请的第五方面的第一至第四向队列添加条目的方法之一,提供了根据本申请的第五方面的第五向队列添加条目的方法,为每条队列记录队头指针与队尾指针。

根据本申请的第五方面的第一至第五向队列添加条目的方法之一,提供了根据本申请的第五方面的第六向队列添加条目的方法,依据从代理的译码器接收的队列报文获取队列的接收方代理的状态。

根据本申请的第五方面的第六向队列添加条目的方法,提供了根据本申请的第五方面的第七向队列添加条目的方法,队列的接收方代理的状态包括队列接收方代理已接收队列条目、队列接收方代理暂时无法接收队列条目,或者队列接收方代理没有正确接收队列条目。

根据本申请的第五方面的第六或第七向队列添加条目的方法,提供了根据本申请的第五方面的第八向队列添加条目的方法,若队列接收方代理没有正确接收队列条目,不更新队列的队头指针,以及依据队列的队尾指针,再次从存储器获取队列条目,以发送给队列的接收方代理。

根据本申请的第五方面的第六至第八向队列添加条目的方法之一,提供了根据本申请的第五方面的第九向队列添加条目的方法,若队列接收方代理暂时无法接收队列条目,更新队列的队头指针,以及暂停获取该队列的条目。

根据本申请的第六方面,提供了根据本申请的第六方面的第一从队列获取条目的方法,响应于收到队列条目,将队列条目发送给存储器,并将队列标识符填入缓存;响应于存储器指示队列条目被写入存储器,从应答缓存获取队列标识符,依据队列标识符、队列发送方代理标识符生成指示队列接收方状态的队列报文,发送给消息总线,并更新队列的队尾指针;响应于队列的队尾指针超前于队头指针,向cpu指示队列状态为非空。

根据本申请的第六方面的第一从队列获取条目的方法,提供了根据本申请的第六方面的第二从队列获取条目的方法,响应于cpu的访问请求,更新队列队头指针。

根据本申请的第六方面的第一或第二从队列获取条目的方法,提供了根据本申请的第六方面的第三从队列获取条目的方法,缓存存储对应于多个队列条的每个的队列标识符与队列接收方代理标识符。

根据本申请的第六方面的第一至第三从队列获取条目的方法之一,提供了根据本申请的第六方面的第四从队列获取条目的方法,填入缓存的信息包括队列标识符、队列发送方代理标识符。

根据本申请的第六方面的第一至第四从队列获取条目的方法之一,提供了根据本申请的第六方面的第五从队列获取条目的方法,获取同队列标识符对应的队列发送方代理标识符。

根据本申请的第六方面的第一至第五从队列获取条目的方法之一,提供了根据本申请的第六方面的第六从队列获取条目的方法,为每条队列记录队头指针与队尾指针。

根据本申请的第六方面的第一至第六从队列获取条目的方法之一,提供了根据本申请的第六方面的第七从队列获取条目的方法,响应于队列满,丢弃接收的队列条目,生成指示队列接收方代理没有正确接收队列条目的队列报文,发送给消息总线。

根据本申请的第六方面的第一至第七从队列获取条目的方法之一,提供了根据本申请的第六方面的第八从队列获取条目的方法,响应于队列仅能容纳一个条目,生成指示队列接收方代理暂时无法接收队列条目的队列报文,发送给消息总线。

根据本申请的第七方面,提供了根据本申请的第七方面的第一向队列中填充条目的方法,cpu访问代理的队列tx模块的寄存器,获取队列状态;响应于队列未满,cpu向队列的队尾写入队列条目;cpu将新的队尾位置写入队列tx模块。

根据本申请的第七方面的第一向队列中填充条目的方法,提供了根据本申请的第七方面的第二向队列中填充条目的方法,队列条目存储于紧耦合存储器中。

根据本申请的第七方面的第一或第二向队列中填充条目的方法,提供了根据本申请的第七方面的第三向队列中填充条目的方法,cpu访问代理的tx模块的寄存器获得队列的队尾位置。

根据本申请的第七方面的第一或第二向队列中填充条目的方法,提供了根据本申请的第七方面的第四向队列中填充条目的方法,cpu记录队列的队尾位置。

根据本申请的第七方面的第一至第四向队列中填充条目的方法之一,提供了根据本申请的第七方面的第五向队列中填充条目的方法,cpu向队列的队尾写入多个队列条目。

根据本申请的第七方面的第一至第五向队列中填充条目的方法之一,提供了根据本申请的第七方面的第六向队列中填充条目的方法,cpu向多个队列的队尾写入队列条目。

根据本申请的第七方面的第一至第六向队列中填充条目的方法之一,提供了根据本申请的第七方面的第七向队列中填充条目的方法,cpu访问代理的队列tx模块的队头寄存器与队尾寄存器,获取队列状态。

根据本申请的第八方面,提供了根据本申请的第八方面的第一从队列获取条目的方法,包括如下步骤:响应于队列非空,cpu依据队列队头位置从存储器中获取队列条目;cpu将新的队头位置写入队列rx模块。

根据本申请的第八方面的第一从队列中获取条目的方法,提供了根据本申请的第八方面的第二从队列中获取条目的方法,队列条目存储于紧耦合存储器中。

根据本申请的第八方面的第一或第二从队列中获取条目的方法,提供了根据本申请的第八方面的第三从队列中获取条目的方法,cpu检查队列状态是否非空;响应于队列非空,cpu从代理的队列rx模块获取队列的队头位置。

根据本申请的第八方面的第一至第三从队列中获取条目的方法之一,提供了根据本申请的第八方面的第四从队列中获取条目的方法,队列rx模块向cpu指示中断,告知cpu队列中被填充了条目。

根据本申请的第八方面的第一至第四从队列中获取条目的方法之一,提供了根据本申请的第八方面的第五从队列中获取条目的方法,cpu访问队列rx模块的寄存器以获知队列状态。

根据本申请的第八方面的第一至第五从队列中获取条目的方法之一,提供了根据本申请的第八方面的第六从队列中获取条目的方法,cpu依据队列tx模块的队头寄存器与队尾寄存器,获取队列状态。

根据本申请的第八方面的第一至第六从队列中获取条目的方法之一,提供了根据本申请的第八方面的第七从队列中获取条目的方法,cpu依据队列的队头指针与队尾指针从队头位置获取队列的多个条目。

根据本申请的第八方面的第一至第七从队列中获取条目的方法之一,提供了根据本申请的第八方面的第八从队列中获取条目的方法,cpu从多个队列的队头位置获取一个或多个条目。

根据本申请的第九方面,提供了根据本申请的第九方面的第一代理,包括第一仲裁器、第一译码器、第二仲裁器、第二译码器、队列tx模块和队列rx模块,第一仲裁器将队列tx模块与队列rx模块耦合到消息总线;第一译码器将消息总线耦合到队列tx模块与队列rx模块;第二仲裁器将队列tx模块与队列rx模块耦合到第二消息总线;第二译码器将第二消息总线耦合到队列tx模块与队列rx模块。

根据本申请的第九方面的第一代理,提供了根据本申请的第九方面的第二代理,代理基于数据报文通信。

根据本申请的第九方面的第一或第二代理,提供了根据本申请的第九方面的第三代理,数据报文携带目标代理标识与功能标识,目标代理标识用于识别数据报文的接收方代理,功能标识用于识别报文的类型。

根据本申请的第九方面的第一至第三代理之一,提供了根据本申请的第九方面的第四代理,数据报文的类型包括配置报文、访存报文、队列报文和指针报文的一种或多种。

根据本申请的第九方面的第一至第四代理之一,提供了根据本申请的第九方面的第五代理,代理能够识别一种或多种报文。

根据本申请的第九方面的第一至第五代理之一,提供了根据本申请的第九方面的第六代理,队列tx模块与队列rx模块通过第一仲裁器向消息总线发送数据报文,队列tx模块与队列rx模块通过第一译码器从消息总线接收数据报文。

根据本申请的第九方面的第一至第六代理之一,提供了根据本申请的第九方面的第七代理,队列tx模块与队列rx模块通过第二仲裁器向第二消息总线发送数据报文,队列tx模块与队列rx模块通过第二译码器从第二消息总线接收数据报文。

根据本申请的第九方面的第一至第七代理之一,提供了根据本申请的第九方面的第八代理,第一译码器接收来自消息总线的数据报文,并基于数据报文的功能标识将数据报文转发给队列tx模块或队列rx模块之一。

根据本申请的第九方面的第一至第八代理之一,提供了根据本申请的第九方面的第九代理,队列tx模块通过队列报文向其他代理的队列rx模块发送队列条目,接收其他代理的队列rx模块的响应并更新队列指针。

根据本申请的第九方面的第一至第九代理之一,提供了根据本申请的第九方面的第十代理,队列rx模块从其他代理的队列tx模块获取队列条目,并更新队列指针。

根据本申请的第九方面的第一至第十代理之一,提供了根据本申请的第九方面的第十一代理,代理还包括访存模块,访存模块通过访存报文访问存储器。

根据本申请的第九方面的第一至第十一代理之一,提供了根据本申请的第九方面的第十二代理,消息总线和第二消息总线通过缓存代理相耦合,第二消息总线和存储器通过缓存代理相耦合。

根据本申请的第九方面的第一至第十二代理之一,提供了根据本申请的第九方面的第十三代理,队列tx模块和队列rx模块均包括寄存器,用于指示队列状态。

根据本申请的第九方面的第一至第十三代理之一,提供了根据本申请的第九方面的第十四代理,代理还包括配置模块,配置模块接收来自其他代理的配置报文,并对代理的队列tx模块和队列tx模块进行配置。

根据本申请的第九方面的第一至第十四代理之一,提供了根据本申请的第九方面的第十五代理,配置模块配置的内容包括设置队列的条目尺寸、队列的读指针和/或队列深度。

根据本申请的第九方面的第一至第十五代理之一,提供了根据本申请的第九方面的第十六代理,队列rx模块与队列tx模块同步队列指针。

根据本申请的第九方面的第十六代理,提供了根据本申请的第九方面的第十七代理,队列rx模块将其维护的队列的队尾指针同步给队列tx模块;以及队列tx模块将其维护的队列的队头指针同步给队列rx模块。

根据本申请的第九方面的第十六或第十七代理,提供了根据本申请的第九方面的第十八代理,队列rx模块从其他代理的队列tx模块获取队列条目,并更新队列队尾指针,并将更新后的队尾指针同步给所述代理的队列tx模块,所述代理的队列tx模块将更新后的队尾指针作为自身的队尾指针。

根据本申请的第九方面的第十六至第十八代理之一,提供了根据本申请的第九方面的第十九代理,队列tx模块通过队列报文向其他代理的队列rx模块发送队列条目,接收其他代理的队列rx模块的响应并更新队列的队头指针,并将更新后的队头指针同步给所述代理的队列rx模块,所述代理的队列rx模块将更新后的队头指针作为自身的队头指针。

根据本申请的第九方面的第十六至第十九代理之一,提供了根据本申请的第九方面的第二十代理,队列rx模块包括第一指针管理器,队列tx模块包括第二指针管理器。

根据本申请的第九方面的第二十代理,提供了根据本申请的第九方面的第二十一代理,队列rx模块响应于从其他代理的队列tx模块接收队列条目,从第一指针管理器获取队尾指针;队列rx模块依据队尾指针与接收到的队列条目,生成访存报文,以将队列条目经第二仲裁器以写入存储器;队列rx模块响应于从第二译码器收到将队列条目写入存储器的指示,经第一仲裁器向队列发送方的代理发送响应,并更新第一指针管理器的队尾指针。

根据本申请的第九方面的第二十或第二十一代理,提供了根据本申请的第九方面的第二十二代理,第一指针管理器记录多条队列的队头指针与队尾指针。

根据本申请的第九方面的第二十二代理,提供了根据本申请的第九方面的第二十三代理,响应于队列满,队列rx模块丢弃从其他代理的队列tx模块接收队列条目,生成指示队列接收方代理没有正确接收队列条目的队列报文,经第一仲裁器发送给队列发送方代理。

根据本申请的第九方面的第二十或第二十一代理,提供了根据本申请的第九方面的第二十四代理,队列tx模块,响应于第二指针管理器指示的队列的队尾指针超前于队头指针,获取队头指针;队列tx模块依据队头指针生成访存报文,经第二仲裁器从存储器获取队列条目;队列tx模块响应于经第二译码器从存储器获取了队列的条目,经第一仲裁器将条目发送给队列接收方代理;队列tx模块响应于经第一译码器接收指示队列的接收方代理已接收了被发送的队列条目的报文,更新队列的队头指针。

根据本申请的第九方面的第二十四代理,提供了根据本申请的第九方面的第二十五代理,队列tx模块经第一译码器接收指示队列的接收方代理的状态的队列报文,其中队列的接收方代理的状态包括队列接收方代理已接收队列条目、队列接收方代理暂时无法接收队列条目,或者队列接收方代理没有正确接收队列条目。

根据本申请的第九方面的第二十五代理,提供了根据本申请的第九方面的第二十六代理,若队列接收方代理没有正确接收队列条目,队列tx模块不更新第二指针管理器的队列的队头指针,以及依据队列的队尾指针,再次从存储器获取队列条目,以发送给队列的接收方代理。

根据本申请的第九方面的第二十五或第二十六代理,提供了根据本申请的第九方面的第二十七代理,若队列接收方代理暂时无法接收队列条目,队列tx模块不更新第二指针管理器的队列的队头指针,以及暂停获取该队列的条目。

根据本申请的第十方面,提供了根据本申请的第十方面的第一向队列添加条目的方法,包括如下步骤;响应于队列的队尾指针超前于队头指针,获取队头指针;依据队头指针生成访存报文,经第二消息总线从存储器获取队列条目;响应于从存储器获取了队列的条目,经消息总线接收指示队列的接收方代理已接收了被发送的队列条目的报文,更新队列的队头指针。

根据本申请的第十方面的第一向队列添加条目的方法,提供了根据本申请的第十方面的第二向队列添加条目的方法,通过第二译码器和第二消息总线从存储器获取队列条目。

根据本申请的第十方面的第一或第二向队列添加条目的方法,提供了根据本申请的第十方面的第三向队列添加条目的方法,消息总线和第二消息总线通过缓存代理相耦合,第二消息总线和存储器通过缓存代理相耦合。

根据本申请的第十方面的第一至第三向队列添加条目的方法之一,提供了根据本申请的第十方面的第四向队列添加条目的方法,为每条队列记录对头指针与队尾指针。

根据本申请的第十方面的第一至第四向队列添加条目的方法之一,提供了根据本申请的第十方面的第五向队列添加条目的方法,获取队列的接收方代理的状态。

根据本申请的第十方面的第五向队列添加条目的方法,提供了根据本申请的第十方面的第六向队列添加条目的方法,队列的接收方代理的状态包括队列接收方代理已接收队列条目、队列接收方代理暂时无法接收队列条目,或者队列接收方代理没有正确接收队列条目。

根据本申请的第十方面的第一至第六向队列添加条目的方法之一,提供了根据本申请的第十方面的第七向队列添加条目的方法,若队列接收方代理没有正确接收队列条目,不更新队列的队头指针,以及依据队列的队尾指针,再次从存储器获取队列条目,以发送给队列的接收方代理。

根据本申请的第十方面的第一至第七向队列添加条目的方法之一,提供了根据本申请的第十方面的第八向队列添加条目的方法,若队列接收方代理暂时无法接收队列条目,不更新队列的队头指针,以及暂停获取该队列的条目。

根据本申请的第十一方面,提供了根据本发明的第十一方面的第一从队列获取条目的方法,响应于接收到队列条目,获取队尾指针;依据队尾指针与接收到的队列条目,生成访存报文,并将访存报文经第二消息总线写入存储器;响应于将访存报文写入存储器,经消息总线向队列发送方的代理发送响应,并更新队尾指针。

根据本申请的第十一方面的第一从队列获取条目的方法,提供了根据本发明的第十一方面的第二从队列获取条目的方法,还包括将更新后的队尾指针发送给队列tx模块,队列tx模块记录队列的队尾指针。

根据本申请的第十一方面的第一或第二从队列获取条目的方法,提供了根据本发明的第十一方面的第三从队列获取条目的方法,消息总线和第二消息总线通过缓存代理相耦合,第二消息总线和存储器通过缓存代理相耦合。

根据本申请的第十一方面的第一或第二从队列获取条目的方法,提供了根据本发明的第十一方面的第四从队列获取条目的方法,为每条队列记录队头指针与队尾指针。

根据本申请的第十二方面,提供了根据本发明的第十二方面的第一消息系统,包括第一cpu代理、第二cpu代理和消息总线,消息总线耦合到第一cpu代理和第二cpu代理;第一cpu代理和第二cpu代理均包括队列tx模块和队列rx模块。

根据本发明的第十二方面的第一消息系统,提供了根据本发明的第十二方面的第二消息系统,第一cpu代理与第一cpu和第一存储器相耦合,第二cpu代理与第二cpu和第二存储器相耦合。

根据本发明的第十二方面的第一或第二消息系统,提供了根据本发明的第十二方面的第三消息系统,第一cpu直接访问第一存储器,以访问第一存储器的队列条目。

根据本发明的第十二方面的第一至第三消息系统之一,提供了根据本发明的第十二方面的第四消息系统,第二存储器存储队列条目,第二cpu直接访问第二存储器,以访问第二存储器的队列条目。

根据本发明的第十二方面的第一至第四消息系统之一,提供了根据本发明的第十二方面的第五消息系统,第一cpu代理的队列tx模块经消息总线向第二cpu代理的队列rx模块发送队列报文,以将第一存储器的队列条目发送至第二存储器存储;第一cpu代理的队列rx模块经消息总线从第二cpu代理的队列tx模块接收队列报文,以接收被添加到第二存储器的队列的队列条目。

根据本发明的第十二方面的第一至第五消息系统之一,提供了根据本发明的第十二方面的第六消息系统,第二cpu代理的队列tx模块经消息总线向第一cpu代理的队列rx模块发送队列报文,以将第二紧耦合存储器的队列的队列条目发送至第一存储器存储;第二cpu代理的队列rx模块经消息总线从第一cpu代理的队列tx模块接收队列报文,以接收被添加到第二存储器的队列的队列条目。

根据本发明的第十二方面的第一至第六消息系统之一,提供了根据本发明的第十二方面的第七消息系统,还包括消息代理、缓存代理以及片外存储器,消息代理耦合到消息总线与缓存代理,缓存代理耦合到片外存储器。

根据本发明的第十二方面的第一至第七消息系统之一,提供了根据本发明的第十二方面的第八消息系统,若第二cpu代理暂时无法接收队列条目,第一cpu代理将队列的接收方设置为消息代理,第一cpu代理的队列tx模块发出的数据报文被消息总线转发给消息代理,并在片外存储器中存储队列的队列条目。

根据本发明的第十二方面的第八消息系统,提供了根据本发明的第十二方面的第九消息系统,消息代理将片外存储器中存储的队列条目发送给第二cpu代理。

根据本发明的第十三方面,提供了根据本发明的第十三方面的第一通过代理进行队列通信的方法,包括如下步骤:第一cpu访问第一cpu代理的队列tx模块的寄存器,获取队列状态;响应于队列未满,第一cpu向第一存储器中的队列的队尾写入队列条目;第一cpu将新的队尾位置写入第一cpu代理的队列tx模块;第二cpu从第二cpu代理的队列rx模块获取队列状态;响应于队列非空,第二cpu依据队列队头位置从第二存储器中获取队列条目;第二cpu将新的队头位置写入第二cpu代理的队列rx模块。

根据本发明的第十三方面的第一通过代理进行队列通信的方法,提供了根据本发明的第十三方面的第二通过代理进行队列通信的方法,第一cpu访问第一cpu代理的tx模块的寄存器获得队列的队尾位置。

根据本发明的第十三方面的第一或第二通过代理进行队列通信的方法,提供了根据本发明的第十三方面的第三通过代理进行队列通信的方法,第一cpu记录队列的队尾位置。

根据本发明的第十三方面的第一至第三通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第四通过代理进行队列通信的方法,第一cpu访问第一代理的队列tx模块的队头寄存器与队尾寄存器,获取队列状态。

根据本发明的第十三方面的第一至第四通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第五通过代理进行队列通信的方法,第二cpu从第二cpu代理的队列rx模块获取队列的队头位置。

根据本发明的第十三方面的第一至第五通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第六通过代理进行队列通信的方法,第二cpu向第二cpu代理的队列rx模块更新队列的队头位置。

根据本发明的第十三方面的第一至第六通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第七通过代理进行队列通信的方法,第二cpu代理的队列rx模块向第二cpu指示中断,告知第二cpu队列中被填充了条目。

根据本发明的第十三方面的第一至第七通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第八通过代理进行队列通信的方法,第一cpu和第二cpu之间通过多条队列通信。

根据本发明的第十三方面的第八通过代理进行队列通信的方法,提供了根据本发明的第十三方面的第九通过代理进行队列通信的方法,所述多条队列具有不同的队列深度。

根据本发明的第十三方面的第一至第九通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第十通过代理进行队列通信的方法,第一cpu向第一存储器中的队列添加一个或多个队列条目。

根据本发明的第十三方面的第一至第十通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第十一通过代理进行队列通信的方法,第一cpu代理的队列tx模块响应于队列的队尾指针于队头指针超前,依据队列的队头指针从第一存储器获取队列条目,将队列条目发送给第二cpu代理的队列rx模块。

根据本发明的第十三方面的第一至第十一通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第十二通过代理进行队列通信的方法,第二cpu代理的队列rx模块将接收到的条目,依据自身维护的队尾指针存储到第二存储器,并更新自身维护的队列的队尾指针。

根据本发明的第十三方面的第一至第十二通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第十三通过代理进行队列通信的方法,第二cpu代理的队列rx模块响应于队列的队尾指针超前于队头指针,识别出队列被添加了队列条目,向第二cpu指示队列被添加了条目。

根据本发明的第十三方面的第一至第十三通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第十四通过代理进行队列通信的方法,第二cpu代理的队列rx模块响应于将接收的队列条目存储到第二存储器,还向第一cpu代理的队列tx模块指示队列条目被成功接收。

根据本发明的第十三方面的第一至第十四通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第十五通过代理进行队列通信的方法,第一cpu代理的队列tx模块响应于队列条目被第二cpu代理成功接收,更新自身维护的队列的队头指针。

根据本发明的第十三方面的第一至第十五通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第十六通过代理进行队列通信的方法,队列是循环队列。

根据本发明的第十三方面的第一至第十六通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第十七通过代理进行队列通信的方法,第二cpu访问第二cpu代理的队列tx模块的寄存器,获取队列状态;响应于队列未满,第二cpu向第二存储器中的队列的队尾写入队列条目;第二cpu将新的队尾位置写入第二cpu代理的队列tx模块。

根据本发明的第十三方面的第一至第十七通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第十八通过代理进行队列通信的方法,响应于队列非空,第一cpu依据队列队头位置从第一存储器中获取队列条目;第一cpu将新的队头位置写入第一cpu代理的队列rx模块。

根据本发明的第十三方面的第一至第十八通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第十九通过代理进行队列通信的方法,响应于从第二cpu代理接收了队列条目,第一cpu代理的队列rx模块将接收的队列条目存储到第一存储器,更新队列的队尾指针,并向第一cpu指示队列的队尾指针超前于队头指针。

根据本发明的第十三方面的第一至第十九通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第二十通过代理进行队列通信的方法,第一cpu获取队列中被写入的队列条目,并更新第一cpu代理的队列rx模块所维护的队列的队头指针。

根据本发明的第十三方面的第一至第二十通过代理进行队列通信的方法之一,提供了根据本发明的第十三方面的第二十一通过代理进行队列通信的方法,第一cpu代理的队列rx模块更新的队头指针。

根据本申请的第十四方面,提供了根据本申请的第十四方面的第一消息系统,包括第一cpu代理、第二cpu代理、缓存代理、消息代理和消息总线,消息总线耦合到第一cu代理、第二cpu代理和消息代理,缓存代理与消息代理相耦合;第一cpu代理和第二cpu代理均包括队列tx模块和队列rx模块。

根据本申请的第十四方面的第一消息系统,提供了根据本申请的第十四方面的第二消息系统,第一cpu代理与第一cpu和第一存储器相耦合,第二cpu代理与第二cpu和第二存储器相耦合,缓存代理与片外存储器相耦合。

根据本申请的第十四方面的第一或第二消息系统,提供了根据本申请的第十四方面的第三消息系统,第一存储器存储队列条目,第一cpu直接访问第一存储器的队列条目。

根据本申请的第十四方面的第一至第三消息系统之一,提供了根据本申请的第十四方面的第四消息系统,第二存储器存储队列条目,第二cpu直接访问第二存储器的队列条目。

根据本申请的第十四方面的第一至第四消息系统之一,提供了根据本申请的第十四方面的第五消息系统,片外存储器存储条目。

根据本申请的第十四方面的第一至第五消息系统之一,提供了根据本申请的第十四方面的第六消息系统,第一cpu代理的队列tx模块将第一存储器中的队列条目发送给消息代理,消息代理将队列条目存储到片外存储器。

根据本申请的第十四方面的第六消息系统,提供了根据本申请的第十四方面的第七消息系统,消息代理经缓存代理将队列条目存储到片外存储器。

根据本申请的第十四方面的第一至第七消息系统之一,提供了根据本申请的第十四方面的第八消息系统,发送给第二cpu代理,第二cpu代理的队列rx模块将队列条目存储到第二存储器。

根据本申请的第十四方面的第一至第八消息系统之一,提供了根据本申请的第十四方面的第九消息系统,第一cpu代理的队列tx模块获取消息代理的队列rx模块提供的队列状态。

根据本申请的第十四方面的第一至第九消息系统之一,提供了根据本申请的第十四方面的第十消息系统,消息代理的队列tx模块获取第二cpu代理的队列rx模块提供的队列的状态。

根据本申请的第十四方面的第一至第十消息系统之一,提供了根据本申请的第十四方面的第十一消息系统,若第二存储器的队列未满,第一cpu代理的队列的接收方为第二cpu代理,第一cpu代理的队列tx模块发出的数据报文被消息总线转发给第二cpu代理的队列rx模块。

根据本申请的第十四方面的第一至第十一消息系统之一,提供了根据本申请的第十四方面的第十二消息系统,若第二存储器的队列已满,第一cpu代理将队列的接收方设置为消息代理,第一cpu代理的队列tx模块发出的数据报文被消息总线转发给消息代理。

根据本申请的第十四方面的第十二消息系统,提供了根据本申请的第十四方面的第十三消息系统,若第二存储器的队列已满,第一cpu将第一cpu代理的队列的接收方设置为消息代理。

根据本申请的第十四方面的第十三消息系统,提供了根据本申请的第十四方面的第十四消息系统,第一cpu还将消息代理的队列的接收方设置为第二cpu代理。

根据本申请的第十四方面的第一至第十四消息系统之一,提供了根据本申请的第十四方面的第十五消息系统,第二cpu代理将第二存储器的队列条目,发送给消息代理。

根据本申请的第十四方面的第一至第十五消息系统之一,提供了根据本申请的第十四方面的第十六消息系统,消息代理将从第二cpu代理接收的队列条目存储到片外存储器,并从片外存储器取出队列条目发送给第一cpu代理,由第一cpu代理的队列rx模块将条目存储到第一存储器。

根据本申请的第十四方面的第一至第十六消息系统之一,提供了根据本申请的第十四方面的第十七消息系统,第二cpu代理的队列tx模块获取第一cpu代理的队列rx模块提供的队列状态。

根据本申请的第十四方面的第一至第十七消息系统之一,提供了根据本申请的第十四方面的第十八消息系统,若第一存储器的队列未满,第二cpu代理的队列的接收方为第一cpu代理,第二cpu代理的队列tx模块发出的数据报文被消息总线转发给第一cpu代理的队列rx模块。

根据本申请的第十四方面的第一至第十八消息系统之一,提供了根据本申请的第十四方面的第十九消息系统,若第一存储器的队列已满,第二cpu代理将队列的接收方设置为消息代理,第二cpu代理的队列tx模块发出的数据报文被消息总线转发给消息代理。

根据本申请的第十四方面的第一至第十九消息系统之一,提供了根据本申请的第十四方面的第二十消息系统,若第一存储器的队列已满,第二cpu将第二cpu代理的队列的接收方设置为消息代理。

根据本申请的第十四方面的第二十消息系统,提供了根据本申请的第十四方面的第二十一消息系统,第二cpu还将消息代理的队列的接收方设置为第一cpu代理。

根据本申请的第十四方面的第一至第二十一消息系统之一,提供了根据本申请的第十四方面的第二十二消息系统,对各代理之间消息通路的更改,由消息接收方根据自身的队列的状态来设置。

根据本申请的第十四方面的第一至第二十二消息系统之一,提供了根据本申请的第十四方面的第二十三消息系统,消息代理包括队列tx模块与队列rx模块。

根据本申请的第十四方面的第一至第二十三消息系统之一,提供了根据本申请的第十四方面的第二十四消息系统,消息代理的队列rx模块从第一cpu代理或第二cpu代理的队列tx模块接收数据报文,而消息代理的队列tx模块向第一cpu代理或第二cpu代理的队列rx模块发送数据报文。

根据本申请的第十五方面,提供了根据本申请的第十五方面的第一通过代理进行队列通信的方法,包括如下步骤:第一cpu访问第一cpu代理的队列tx模块的寄存器,获取队列状态;响应于队列未满,第一cpu向第一存储器中的队列的队尾写入队列条目;第一cpu将新的队尾位置写入第一cpu代理的队列tx模块;第二cpu从第二cpu代理的队列rx模块获取队列状态;响应于队列非空,第二cpu依据队列队头位置从第二存储器中获取队列条目;第二cpu将新的队头位置写入第二cpu代理的队列rx模块。

根据本申请的第十五方面的第一通过代理进行队列通信的方法,提供了根据本申请的第十五方面的第二通过代理进行队列通信的方法,第一cpu和第二cpu之间通过多条队列通信。

根据本申请的第十五方面的第一或第二通过代理进行队列通信的方法,提供了根据本申请的第十五方面的第三通过代理进行队列通信的方法,所述多条队列具有不同的队列深度。

根据本申请的第十五方面的第一至第三通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第四通过代理进行队列通信的方法,第一cpu依据第一存储器的容量以及片外存储器的容量设置队列的深度。

根据本申请的第十五方面的第一至第四通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第五通过代理进行队列通信的方法,第二cpu依据第二存储器的数量以及片外存储器的容量设置队列的深度。

根据本申请的第十五方面的第一至第五通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第六通过代理进行队列通信的方法,第一存储器或第二存储器的队列与片外存储器的队列具有不同的队列深度。

根据本申请的第十五方面的第一至第六通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第七通过代理进行队列通信的方法,第一cpu设置第一cpu代理的队列tx模块的队列接收方为消息代理;第一cpu通过第一cpu代理设置消息代理的队列接收方为第二cpu代理。

根据本申请的第十五方面的第一至第七通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第八通过代理进行队列通信的方法,第二cpu设置第二cpu代理的队列tx模块的队列接收方为消息代理;第二cpu通过第二cpu代理设置消息代理的队列接收方为第一cpu代理。

根据本申请的第十五方面的第一至第八通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第九通过代理进行队列通信的方法,第一cpu代理的队列tx模块接收第一cpu设置的接收方代理的代理标识,第一cpu代理的队列tx模块将数据报文发送给消息代理的队列rx模块。

根据本申请的第十五方面的第一至第九通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第十通过代理进行队列通信的方法,第一cpu更新第一cpu代理的队列tx模块和/或消息代理的队列tx模块的接收方的代理标识。

根据本申请的第十五方面的第一至第十通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第十一通过代理进行队列通信的方法,第一cpu代理的队列tx模块响应于队列的队尾指针超前于队头指针,依据队列的队头指针获取队列条目,将队列条目发送给消息代理的队列rx模块。

根据本申请的第十五方面的第一至第十一通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第十二通过代理进行队列通信的方法,消息代理的队列rx模块将接收到的队列条目,依据自身维护的队尾指针存储到片外存储器,并使自身维护的队尾指针递增。

根据本申请的第十五方面的第一至第十二通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第十三通过代理进行队列通信的方法,消息代理的队列rx模块响应于将接收的队列条目存储到片外存储器,向第一cpu代理的队列tx模块指示队列条目被成功接收。

根据本申请的第十五方面的第一至第十三通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第十四通过代理进行队列通信的方法,消息代理的队列rx模块向消息代理的队列tx模块同步队尾指针。

根据本申请的第十五方面的第一至第十四通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第十五通过代理进行队列通信的方法,消息代理的队列tx模块响应于队尾指针超前于队头指针,依据队头指针从片外存储器中获取队列条目,并通过消息总线发送给第二cpu代理的队列rx模块。

根据本申请的第十五方面的第一至第十五通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第十六通过代理进行队列通信的方法,第二cpu代理的队列rx模块将接收到的队列条目,依据自身维护的队尾指针存储到第二存储器,并使队列rx模块所维护的队列的队尾指针递增。

根据本申请的第十五方面的第一至第十六通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第十七通过代理进行队列通信的方法,响应于队尾指针超前于队头指针,第二cpu代理的队列rx模块向第二cpu指示队列被添加了条目。

根据本申请的第十五方面的第一至第十七通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第十八通过代理进行队列通信的方法,第二cpu基于队列0的队头指针从第二紧耦合存储器中获取被添加到队列0的队列条目。

根据本申请的第十五方面的第一至第十八通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第十九通过代理进行队列通信的方法,第二cpu代理的队列rx模块响应于将接收的队列条目存储到第二存储器,还向消息代理的队列tx模块指示队列条目被成功接收。

根据本申请的第十五方面的第一至第十九通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第二十通过代理进行队列通信的方法,消息代理的队列tx模块响应于队列条目被第二cpu代理成功接收,更新队列的队头指针。

根据本申请的第十五方面的第一至第二十通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第二十一通过代理进行队列通信的方法,响应于从消息代理接收了队列条目,第一cpu代理的队列rx模块将接收的队列条目存储到第一存储器,更新队列的队尾指针。

根据本申请的第十五方面的第一至第二十一通过代理进行队列通信的方法之一,提供了根据本申请的第十五方面的第二十二通过代理进行队列通信的方法,第一cpu队头指针从第一存储器的获取队列条目,并更新第一cpu代理的队列rx模块的队头指针。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。

图1是根据本申请实施例的用于片上系统的消息系统的框图;

图2是根据本申请又一实施例的用于片上系统的消息系统的框图;

图3是根据本申请又一实施例的用于片上系统的消息系统的框图;

图4是根据本申请又一实施例的用于片上系统的消息系统的框图;

图5是根据本申请又一实施例的用于片上系统的消息系统的框图;

图6是根据本申请又一实施例的用于片上系统的消息系统的框图;

图7是根据本申请又一实施例的用于片上系统的消息系统的框图;

图8是根据本申请实施例的通过代理进行队列通信的示意图;

图9是根据本申请又一实施例的通过代理进行队列通信的示意图;以及

图10是根据本申请又一实施例的用于片上系统的消息系统的框图。

具体实施方式

下面结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

图1是根据本申请实施例的用于片上系统的消息系统的框图。

片上系统包括消息系统100与耦合到消息系统100的一个或多个组件。片上系统的组件包括例如cpu、nvme协议处理器、片内存储器以及消息总线等。片内存储器包括例如dccm(dataclosecoupledmemory,数据紧耦合存储器)。cpu可以是arm、mips、arc等不同指令集架构的cpu,并可以具有一个或多个cpu核。nvme协议处理器用于处理nvme协议,在中国专利申请201610505459.6中提供了nvme协议处理器的实例,所属领域技术人员可获得的其他nvme协议处理器也可应用于本申请。片上系统也可包括其他组件。片上系统还耦合到片外存储器(图1,ddr存储器124)

根据本申请图1的实施例的消息系统100包括消息总线108以及耦合到消息总线的多个代理(cpu代理、消息代理、缓存代理以及nvme代理)。片上系统的组件(cpu102、cpu104、nvme协议处理器152等)通过各自的代理耦合到消息总线。消息总线可以是例如符合axi协议的总线桥。

图1中,cpu代理106、cpu代理107、消息代理120、缓存代理109、nvme代理151都是消息系统的代理的实例。cpu代理106耦合到cpu102、紧耦合存储器101与消息总线108;cpu代理107耦合到cpu104、紧耦合存储器103与消息总线108。nvme子系统105包括nvme代理151和nvme协议处理器152。nvme代理151耦合到nvme协议处理器152与消息总线108。ddr存储器124通过消息总线122耦合到缓存代理109;缓存代理109耦合到消息代理108、消息总线122与消息总线108。消息代理120耦合到消息总线108与缓存代理109。可选地,消息总线122与消息总线108是同一消息总线。

消息系统100中,各代理通过消息总线108进行多种功能的通信。

代理之间基于数据报文通信。报文携带目标代理标识(id)与功能标识(tag)。目标代理标识用于识别数据报文的接收方代理,功能标识用于识别报文的类型。报文的类型包括配置报文、访存报文、队列报文、指针报文等,每种报文类型对应特定的功能。配置报文用于配置接收方代理,访存报文用于访问存储器,队列报文用于在代理之间以队列方式交换消息,指针报文用于在代理之间同步指针(例如,存储器指针)。代理依据报文的功能标识(tag)执行报文所指示的操作。

通过定义新的功能标识以及处理携带新功能标识的报文,为代理扩展功能。代理可识别一种或多种报文类型,并提供一种或多种功能。代理提供的功能包括配置、访问存储器(例如,ddr存储器)、访问队列、同步指针等。

消息总线108接收代理提供的报文,并依据报文中的目标代理标识(id)确定报文的接收方代理,并将报文发送给接收方代理。

代理可耦合到一个或多个组件。代理可作为主设备访问组件,也可作为从设备接受组件的访问。

例如,cpu102(作为组件)要将存储器指针发送给cpu104(作为组件),cpu102将新指针写入cpu代理106提供的指针寄存器,cpu代理106将指针值封装为指针报文,在报文中指示目标代理标识(id)为“cpu代理107”,并发送给cpu代理107,cpu代理107依据报文类型识别出报文要操作的指针寄存器与指针值,并更新代理cpu代理107的指针寄存器,以及可选地cpu代理107还通知cpu104指针寄存器已被更新。

作为又一个例子,cpu102(作为组件)要将一组数据写入ddr存储器124(作为组件)。cpu102将数据(或dccm101中存储数据的地址)与接收数据的ddr存储器124的地址提供给cpu代理106,cpu代理106将数据与地址封装为访存报文,报文中指示目标代理标识(id)为缓存代理109,并发送给缓存代理109。缓存代理109依据报文类型识别出报文要向ddr存储器124写入数据、ddr存储器124的地址以及要写入数据,并生成ddr存储器124访问命令,将数据写入ddr存储器124。

图1中,缓存代理109通过消息总线122(例如,axi总线)耦合到ddr存储器124,缓存代理109生成总线命令来访问ddr存储器1012。可选地,缓存代理109还生成发送给cpu代理106的报文来指示数据写入ddr存储器124的结果。

作为又一个例子,cpu102(作为组件)同cpu104(作为组件)通过队列进行通信。队列是先进先出(fifo)队列,cpu102是队列发送方,cpu104是队列接收方。cpu代理106提供寄存器记录队列的队尾的写指针以及队头的读指针,cpu代理107提供寄存器记录队列的队尾的写指针以及队头的读指针。dccm101与dccm103为队列条目提供存储空间。cpu102为向队列填充队列条目,将队列条目写入dccm101,用写入条目的地址更新cpu代理106的写指针寄存器,以完成向队列填充条目的操作。cpu代理106依据自身读指针寄存器与写指针寄存器的值,识别队列被写入条目,依据读指针寄存器的值获取队列条目内容,将队列条目(可选地,还包括队列标识符)封装为队列报文,并发送给cpu代理107。以及cpu代理106在接收到指示cpu代理107成功接收了队列条目的报文后,更新自身的读指针寄存器(意味着队列条目被cpu代理107取出)。cpu代理107接收到队列报文,从报文中获取队列条目内容,写入dccm103,并更新自身的写指针寄存器以指示队列被填充内容,还向cpu代理106发送队列报文指示从cpu代理106接收了队列条目。以及cpu代理107还依据自身的读指针寄存器与写指针寄存器的值,识别队列被写入条目,并告知cpu104。

作为又一个例子,cpu102为nvme代理151设置队列地址空间。cpu102将分配给nvme代理151的队列地址空间的首地址提供给cpu代理106,即完成了队列地址空间的设置。cpu代理106将首地址封装为配置报文,并发送给nvme代理151。nvme代理151接收配置报文,提取出队列地址空间的首地址,记录在自身的寄存器或存储器中。

作为举例,图1的实施例中,cpu代理106和cpu代理107提供配置、访问队列与同步指针功能;nvme代理151提供配置与访问队列功能;消息代理120提供配置、访存、访问队列功能。可选地,cpu代理106和cpu代理107还提供访存功能。nvme代理151还提供访存和/或同步指针功能。消息代理120还提供同步指针功能。

图2是根据本申请又一实施例的用于片上系统的消息系统200的框图。如图2所示,消息系统200包括消息总线208与耦合到消息总线208的多个代理。

图2中,cpu代理206、消息代理220、缓存代理209、nvme代理251都是消息系统的代理的实例。cpu代理206耦合到cpu202、紧耦合存储器201与消息总线208。nvme子系统205包括nvme代理251和nvme协议处理器252,nvme代理251耦合到nvme协议处理器252与消息总线208。ddr存储器224通过消息总线222耦合到缓存代理209;缓存代理209耦合消息总线208。消息代理220耦合到消息总线208,以及消息代理220还耦合到缓存代理209。

消息总线208外部的每个代理耦合到消息总线208的端口的一个仲裁器与一个译码器。

消息总线208包括多个端口,每个端口包括成对的仲裁器与译码器。cpu代理206耦合到仲裁器281和译码器282;nvme代理251耦合到仲裁器283和译码器284;缓存代理209耦合到仲裁器285和译码器286;消息代理220耦合到仲裁器287和译码器288。

代理通过消息总线208中的仲裁器向消息总线208发送数据报文;代理通过消息总线208中的译码器从消息总线208接收数据报文。

消息总线208中,每个仲裁器(可配置地)耦合到消息总线208中的一个、多个或所有译码器,用于从所耦合的代理接收数据报文,并向所耦合的译码器发送数据报文;消息总线208中的仲裁器根据接收的数据报文的目标代理标识(id),确定将数据报文发送到哪个译码器(跟目标代理标识(id)对应的译码器)。

消息总线208中,每个译码器(可配置地)耦合到消息总线208中的一个、多个或所有仲裁器,用于从仲裁器接收数据报文,并向所耦合的代理发送数据报文。

图3是根据本申请又一实施例的用于片上系统的消息系统的框图。如图3所示,消息系统包括耦合到消息总线308的cpu代理306与缓存代理309。

cpu代理306耦合到cpu302、紧耦合存储器301(dccm302)和消息总线308。cpu302通过axi从接口367与cpu代理306耦合,紧耦合存储器301通过axi主接口368与cpu代理306耦合。cpu302通过axi从接口367访问cpu代理306,而cpu代理306通过axi主接口368访问dccm301。

缓存代理309耦合到ddr存储器324和消息总线308。缓存代理309利用axi主接口398通过axi总线304耦合到ddr存储器324,并访问ddr存储器324。

图3还展示了代理的框图。代理用于桥接组件与消息总线。组件通过访问代理提供的寄存器或存储器来指示代理完成相应的功能。代理可提供一种或多种功能。

代理包括仲裁器与译码器;代理的仲裁器耦合到消息总线308的仲裁器(仲裁器381、仲裁器383、仲裁器385或仲裁器387),并用于向消息总线308的仲裁器发送报文;代理的译码器耦合到消息总线308的译码器(译码器382、译码器384、译码器386或译码器388),并用于从消息总线308的译码器接收报文。代理的译码器依据报文中的功能标识(tag)访问或设置代理的对应模块,或将报文转发给代理的处理该报文的模块。

代理可包括代理接口(例如,axi接口),用于同代理所服务的组件(例如,cpu、dccm)、nvme协议处理器)通信;组件通过代理的代理接口访问代理提供的寄存器或存储器。代理还可向组件指示中断。

代理包括多个模块。每个模块通过处理报文提供各自的功能。代理所服务的组件通过代理接口可向模块的寄存器写入数据,以指示模块执行相应的功能,或从模块的寄存器读出数据。作为举例,模块的寄存器可以是只读、只写或可读可写的。

模块还可通过代理接口向所服务的组件提供中断。模块可生成报文,并在报文中用功能标识(tag)指示报文所对应的功能;用目标代理标识(id)指示接收报文的目标代理。模块将生成的报文通过代理的仲裁器发送给消息总线308进而发送给接收方。

参看图3,cpu代理306包括仲裁器361、译码器362和多个用于处理报文的模块(配置模块363、指针同步模块364、队列tx模块365以及访存模块366)。仲裁器361、译码器362各自耦合到用于处理报文的模块的一个或多个。cpu代理306的仲裁器361耦合到消息总线308的仲裁器381,cpu代理306的译码器362耦合到消息总线308的译码器382。用于处理报文的模块生成数据报文,并通过cpu代理306的仲裁器361发送给消息总线308,以及cpu代理306的译码器362从消息总线308的译码器382接收数据报文,并将数据报文转发给用于处理报文的模块。cpu代理306的用于处理报文的模块包括配置模块363、指针同步模块364、队列tx模块365以及访存模块366。

缓存代理309包括仲裁器391、译码器392和用于处理报文的模块(包括配置模块393、队列rx模块395和访存模块396)。仲裁器391、译码器392和用于处理报文的模块相耦合。缓存代理309的仲裁器391耦合到消息总线308的仲裁器385,缓存代理309的译码器392耦合到消息总线308的译码器386。用于处理报文的模块生成数据报文,并通过缓存代理309的仲裁器391发送给消息总线308,以及缓存代理309的译码器392从消息总线308的译码器386接收数据报文,并将数据报文转发给用于处理报文的模块。

图3中,代理的模块提供各自的功能。

cpu代理306包括配置模块363、指针同步模块364、队列tx模块365与访存模块366。指针同步模块364用于实现同步指针功能;配置模块363用于实现配置功能;队列tx模块365用于将队列条目填充到队列以实现队列通信;访存模块366用于实现存储器访问功能。例如,cpu302向配置模块363写入数据以指示将被配置的代理以及配置的内容,和/或配置模块363从其他代理获取其配置信息。

缓存代理309的配置模块393用于接收并处理配置报文:cpu代理306的配置模块363发出的配置报文被传递给缓存代理309的配置模块393,缓存代理309的配置模块393根据数据报文内容对缓存代理309进行配置(例如,读/写配置寄存器)。

cpu代理306的访存模块366,用于使cpu302以异步(读/写)方式访问dccm301。虽然在图3中未示出,可选地,还通过访存模块366访问ddr存储器。

cpu代理306的队列tx模块365,用于向其他代理发送队列条目,例如,cpu302向cpu代理306的队列tx模块365指示要填充队列的队列条目,队列tx模块365将队列条目发送给接收方代理。队列tx模块365还维护队列的读指针与写指针。

cpu代理306的指针同步模块364,用于同其他代理的指针同步模块同步指针。

图4是根据本申请又一实施例的用于片上系统的消息系统的框图。在图4的实施例中,cpu402与cpu404通过各自的cpu代理的指针同步模块交换指针。

参看图4,cpu代理406耦合到cpu402与消息总线408,cpu代理406的指针同步模块464耦合到仲裁器461与译码器462,cpu代理406的仲裁器461耦合到消息总线408,cpu代理406的译码器462耦合到消息总线408,cpu代理406的仲裁器461发送给消息总线408数据报文,以及cpu代理406的译码器462从消息总线408接收数据报文。

cpu代理407耦合到cpu404与消息总线408,cpu代理407的指针同步模块474耦合到仲裁器472和译码器471,cpu代理407的仲裁器472耦合到消息总线408,cpu代理407的译码器471耦合到消息总线408,cpu代理407的仲裁器472发送给消息总线408数据报文,以及cpu代理407的译码器471从消息总线408接收数据报文。

图4的实施例中,cpu402同cpu404同步指针。cpu402通过cpu代理406耦合到消息总线408,cpu404通过cpu代理407耦合到消息总线408。cpu代理406与cpu代理407均包括指针同步模块,并提供指针同步功能。

cpu通过例如axi总线访问代理的指针同步模块中的指针寄存器。作为举例,cpu402向cpu代理406的指针同步模块464的指针寄存器写入指针值。cpu代理406的指针同步模块464将指针值以及cpu代理407的目标代理标识(id)封装成指针报文,通过仲裁器461发送给消息总线408。消息总线408依据目标代理标识(id)将报文发送给cpu代理407的译码器471。cpu代理407的译码器471依据报文的功能标识(tag)识别出报文是指针报文,并将报文交由cpu代理407中的指针同步模块474处理。

cpu代理407的指针同步模块474从报文中获取指针的值,并记录的指针寄存器中。可选地,译码器471依据报文内容,更新指针同步模块474的指针寄存器。

指针同步模块可提供多个指针寄存器,以及在报文中还指示所更新的指针寄存器的索引。

cpu404可通过例如axi总线访问cpu代理407的指针同步模块474的指针寄存器,以获取指针的最新值。可选地,指针同步模块474响应于指针寄存器被更新,向cpu404指示中断信号,使cpu404获知指针寄存器被更新。

以类似的方式,cpu404向cpu代理407的指针同步模块474的指针寄存器写入指针值,以使cpu402获得指针值。

可选地,申请号为201610473495.9的中国专利申请中提供的指针同步电路,可作为本申请的指针同步模块的实例。

图5是根据本申请又一实施例的用于片上系统的消息系统的框图。

图5的实施例中,cpu502通过cpu代理506耦合到消息总线508。cpu代理506包括队列tx模块565,cpu502通过队列tx模块565向队列中填充条目。cpu代理506还包括访存模块566,队列tx模块565通过访存模块566获取dccm501中的队列条目,dccm501中的队列条目是cpu502添加的。

cpu代理506通过仲裁器561与译码器562耦合到消息总线508。

cpu502通过代理接口(例如,axi总线接口)访问队列tx模块565,以向队列tx模块565更新写指针。cpu502还耦合到存储器(例如dccm501),cpu502可直接访问dccm501。

如图5所示,队列tx模块565包括指针管理器551、访存单元553、应答缓存单元554、访存接收单元555和rcv单元552。rcv单元552耦合到指针管理器551和译码器562,指针管理器551还耦合到访存单元553与rcv单元552,访存单元553还耦合到应答缓存单元554,应答缓存单元554还耦合到访存接收单元555,访存接收单元555还耦合到仲裁器561。访存但愿553通过访存模块566发出访问dccm501的请求,而访存接收单元555从访存模块566接收dccm501提供的访存结果。指针管理器551中记录队列的读指针与写指针。

作为举例,cpu502以先进先出方式使用队列,cpu502作为条目的生产者将新的条目添加到队列的队尾。队列的另一端(例如,另一cpu,图5中未示出)作为条目的消费者从队列的队头取出条目。在一个实施方式中,队列的两端(队列条目的生产者与消费者)是在片上系统初始化或生产时指定的。在生产者与消费者之间,可以同时存在多条队列。在另一个实施方式中,cpu502中运行的软件控制cpu502操作cpu代理506以向队列中添加条目。

为向队列添加条目,cpu502首先检查队列是否“满”。例如,对于循环队列,通过检查指向队头位置的队头指针与指向队尾位置的尾指针是否相同识别队列是否“满”。可选地,队列tx模块565提供cpu502可访问的寄存器指示队列是否“满”。指针管理器依据队列的读指针与写指针的值,在寄存器中设置队列的状态(是否“满”或是否“空”)。

若队列未“满”,cpu502获取队列的队尾的位置。cpu502可从队列tx模块565的指针管理器551获取队尾的位置,也可自己维护队尾位置。

图5中,队列条目存储在dccm501中,cpu502将新队列条目写入dccm501中的队尾位置。

接下来,cpu502将新的队尾位置(写指针值)写入cpu代理506的队列tx模块565的指针管理器551。作为举例,cpu502在当前队尾位置上增加一个队列条目的尺寸作为新的队尾位置。在另一个例子中,cpu502向队列tx模块565指示写指针递增,队列tx模块565基于被配置的队列条目大小更新指针管理器551的写指针值。

此时,cpu502已完成了根据本申请实施例的向队列添加条目的操作。由于cpu502仅需操作耦合到cpu502的dccm501与cpu代理506的寄存器,这些操作都以低延迟完成,cpu502体验到的高速队列操作。cpu502无须关注队列条目如何被传递给总线远端的另一cpu,简化了cpu502的软件的操作过程。可选地,队列tx模块565也响应于队列另一端的cpu代理提供的响应报文,以获知该队列另一端cpu代理已成功接收队列条目。队列tx模块565也可通过状态寄存器向cpu502指示队列条目的发送结果。

可选地,cpu502可一次添加队列的多个条目。然后才向队列tx模块565更新写指针。通过减少更新写指针的操作来进一步提升队列操作效率。

依然可选地,cpu502可一次向多个队列添加一个或多个条目。然后才向队列tx模块565更新写指针。

接下来,描述队列tx模块565如何处理向队列添加条目的操作。

队列tx模块565随时检查队列状态,并在cpu502可访问的寄存器中指示队列状态(空、非空、满和/或非满)。

指针管理器551检查队列的读指针与写指针,来指示队列状态。

若队列被填充了条目(例如,cpu502更新了写指针),指针管理器551获取写指针和/或读指针的值提供给访存单元553。更新的写指针的值指示了队尾在dccm501中的存储地址,而被新被添加的队列条目在紧邻队尾的位置。读指针的值指示了被添加到队列但尚未被取走的条目的存储地址。

访存单元553依据写指针/读指针的值以及指定的队列条目大小,通过访存模块566访问dccm501。访存单元553还将与队列条目相关的信息填入应答缓存单元554。填入应答缓存单元554的信息包括,队列索引、队列消费者的目标代理标识(id)等。

cpu代理506可提供多条队列。以及在指针管理器551中为每条队列记录读指针与写指针。图5的指针管理器551记录了n+1个队列的每个的读指针与写指针。在dccm501中存储有每条队列的队列条目。在图5中,展示了在dccm501中存储的队列0与队列1。

通过提供应答缓存单元554,队列tx模块565可响应对多个队列的同时操作。例如,cpu502更新了队列0的写指针,队列tx模块565基于队列0的写指针/读指针通过访存模块566从dccm501中获取队列条目,并将与队列条目相关的信息填入应答缓存单元554。而在访存模块566获取队列条目完成前,cpu502又更新了队列1的写指针。队列tx模块565可基于队列1的写指针/读指针通过访存模块566从dccm501中获取队列条目,并将与队列条目相关的信息填入应答缓存单元554。从而并行处理队列0与队列1的条目添加操作。作为另一个例子,cpu502向dccm501中写入了队列0的两个或多个条目,然后更新了队列0的写指针。通过比较队列0的读指针与写指针,指针管理器551知晓队列0中被写入了多个条目。指针管理器551依据读指针以及条目的尺寸,指示访存单元553从dccm501获取条目,并将与队列条目相关的信息填入应答缓存单元554。

响应于访存模块566从dccm501获取了队列0的条目,访存接收单元555从应答缓存单元554获取队列0的与队列条目相关的信息(队列索引、队列消费者的目标代理标识(id)等),连同获取的条目内容封装成访存报文,通过cpu代理506的仲裁器561发送给消息总线508。以及,rcv单元552从cpu代理506的译码器562接收报文,指示队列0的消费者已接收了被发送的队列0的条目。rcv单元552更新指针管理器551记录的队列0的读指针。例如,使读指针指向队列0的下一个条目。

指针管理器551不断检查各队列的读指针与写指针。若即使rcv单元552更新了队列0的读指针,而队列0依然非空(读指针落后于写指针),指针管理器551则再次依据读指针以及条目的尺寸,从dccm501获取条目,并将与队列条目相关的信息填入应答缓存单元554。

在一个例子中,指针管理器551只要发现队列非空,就依据队列的读指针,从dccm501获取读指针所指向的队列条目,并由访存接收单元555发送给队列的消费者(代理)。作为另一个例子,队列的消费者可在队列报文中向cpu代理506指示消费者的状态。例如,队列消费者暂时无法接收队列条目,或者队列消费者没有正确接收队列条目。若队列消费者暂时无法接收队列条目(例如,队列0的队列条目,或者任意队列的队列条目),指针管理器551相应地暂停从dccm501中获取队列条目。若队列消费者没有正确接收队列条目,指针管理器551不更新读指针,以及依据原有的读指针,再次从dccm501中获取队列条目,以发送给队列的消费者(代理)。

图6是根据本申请又一实施例的用于片上系统的消息系统的框图。

图6的实施例中,cpu604通过cpu代理607耦合到消息总线608。cpu代理607包括队列rx模块675,cpu604通过队列rx模块675从队列中获取条目。cpu代理607还包括访存模块676,队列rx模块675通过访存模块676向存储器603写入队列条目,cpu604直接耦合到存储器603并从存储器603获取队列条目。

cpu代理607通过仲裁器671与rcv单元672耦合到消息总线608。

cpu604通过代理接口访问队列rx模块675,以向队列rx模块675更新读指针。cpu604还耦合到存储器603(例如dccm)。

如图6所示,队列rx模块675包括指针管理器651、访存单元(未在图中示出)、txd单元653、应答缓存单元654和rcv单元652;rcv单元652还耦合到指针管理器651、应答缓存单元654以及译码器672,指针管理器651还耦合到txd单元653,txd单元653耦合到应答缓存单元654以及仲裁器671。

作为举例,cpu604以先进先出方式使用队列,cpu604作为条目的消费者从队列的队头取出条目。

cpu604中运行的软件控制cpu604操作cpu代理607以从队列中取出队列条目。

cpu从队列取出条目的过程如下所示。在队列中存在条目时,cpu604从队列中取出条目。队列的条目由队列的生产者(例如,cpu502)提供。cpu代理607的队列rx模块675维护队列的状态。例如,对于循环队列,队列rx模块675通过检查指向队头位置的队头指针(读指针)是否落后于指向队尾位置的尾指针(写指针)是否相同识别队列是否“空”。可选地,队列rx模块675提供cpu604可访问的寄存器指示队列是否“满”。指针管理器651依据队列的读指针与写指针的值,在寄存器中设置队列的状态(“满”、“空”、“非满”或“非空”)。在队列“非空”时,队列rx模块675可向cpu604指示中断,告知cpu604队列中被填充了条目。或者,cpu604轮询队列rx模块675的状态寄存器以获知队列状态。

若队列非空,cpu604获取队列的队头的位置(读指针值)。cpu604可从队列rx模块675的指针管理器651获取队头的位置,也可自己维护队头位置。

图6中,队列条目存储在存储器603中,cpu604依据读指针从存储器603获取队列条目。

接下来,cpu604将新的队头位置(读指针值)写入cpu代理607的队列rx模块675的指针管理器651。作为举例,cpu604在当前队头位置上增加一个队列条目的尺寸作为新的队头位置。在另一个例子中,cpu604向队列rx模块675指示读指针递增,队列rx模块675基于被配置的队列条目大小更新读指针值。

此时,cpu604已完成了根据本申请实施例的从队列获取条目的操作。由于cpu604仅需操作耦合到cpu604的存储器603与cpu代理607的寄存器,这些操作都以低延迟完成,cpu604体验到的高速队列操作。cpu604无须关注队列生产者如何获知队列条目被队列消费者取出,简化了cpu604的软件的操作过程。可选地,在cpu604更新了读指针后,队列rx模块675向队列另一端的cpu代理(例如,cpu代理506)提供响应报文,以向cpu代理506告知读队列条目被成功接收,cpu代理506可相应地更新其所维护的读指针。可选地,cpu代理506与cpu代理607之间通过指针同步功能以及指针报文同步读指针和/或写指针值。依然可选地,cpu代理与cpu代理607之间通过队列报文传递更新后的读指针和/或写指针值。

可选地,若队列中有多个条目,cpu604可一次读出队列的多个条目。然后才向队列rx模块675更新读指针。通过减少更新写指针的操作来进一步提升队列操作效率。

依然可选地,cpu604可一次从多个队列获取一个或多个条目。然后才向队列rx模块675更新读指针。

接下来,描述队列rx模块675如何处理从队列获取条目的操作。

队列rx模块675随时检查队列状态,并在cpu604可访问的寄存器中指示队列状态(空、非空、满和/或非满)。

指针管理器651检查队列的读指针与写指针,来指示队列状态。

cpu代理607的译码器672响应于从消息总线608接收队列报文,将队列报文转发给rcv单元652。

rcv单元652从指针管理器651获取队列状态。在队列未满时,从指针管理器651获取队列写指针所指示的存储器地址,从队列报文获取队列条目的内容,通过访存模块676将队列条目写入存储器603。以及rcv单元652还将与队列条目有关的信息填入应答缓存单元654。填入应答缓存单元654的信息包括,队列索引、队列生产者的目标代理标识(id)等。

若队列已满,rcv单元652丢弃从队列报文接收的队列条目,以及rcv单元652还将与队列条目有关的信息填入应答缓存单元654。填入应答缓存单元654的信息包括,队列索引、队列生产者的目标代理标识(id),以及就条目未被接收的指示(例如,请求重传)等。

cpu代理607可提供多条队列。以及在指针管理器651中为每条队列记录读指针与写指针。在存储器603中存储有每条队列的队列条目。在图6中,展示了在存储器603中存储的队列0与队列1。

通过提供应答缓存,队列rx模块675可响应对多个队列的同时操作。例如,rcv单元652基于队列0的写指针通过访存模块676向存储器603填充队列条目,并将与队列条目相关的信息填入应答缓存单元654。而在访存模块676填充队列条目完成前,队列rx模块675再次收到队列报文,向队列1填充队列条目。队列tx模块可基于队列1的写指针通过访存模块向存储器603写入队列1的条目,并将与队列条目相关的信息填入应答缓存单元。从而并行处理队列0与队列1的条目添加操作。

响应于访存模块向存储器603添加队列0的条目完成,txd单元653从应答缓存单元654获取队列0的与队列条目相关的信息(队列索引、队列生产者的目标代理标识(id)等),封装成访存报文,通过cpu代理607的仲裁器671发送给消息总线608,以向队列0的生产者指示队列0的消费者已接收了其发送的队列0的条目。txd单元653更新指针管理器651记录的队列0的写指针。例如,使写指针指向队列0的下一个条目。

txd单元653还检查应答缓存单元654中的与队列条目相关的消息。若消息指示条目未被接收,依据队列索引、队列生产者的目标代理标识(id),以及条目未被接收的指示,封装成队列报文,通过cpu代理607的仲裁器671发送给消息总线608,以向队列的生产者指示队列的消费者未能接收某队列的条目。

cpu代理607的指针管理器651可响应cpu604的访问来更新读指针。cpu604可向指针管理器651提供读指针的新值。或者cpu604向指针管理器651指示使读指针递增,指针管理器651依据预设的队列条目尺寸与当前读指针值,更新读指针。

图7是根据本申请又一实施例的用于片上系统的消息系统的框图。如图7所示,cpu代理706耦合到cpu702、消息总线708以及dccm701。cpu代理706包括译码器762、仲裁器761、队列tx模块765、队列rx模块760、译码器712、仲裁器711以及访存模块766。cpu代理706的译码器712、仲裁器761与消息总线708、队列tx模块765以及队列rx模块760相耦合,译码器712、仲裁器711耦合到访存模块766、队列rx模块760以及队列tx模块765,访存模块766耦合到dccm701。

队列tx模块765包括指针管理器751、访存单元753、应答缓存单元754、访存接收单元755和rcv单元752,rcv单元752耦合到指针管理器751和译码器762,指针管理器751还耦合到访存单元753、rcv单元752以及代理接口(例如axi总线接口),访存单元753还耦合到应答缓存单元754和仲裁器711,应答缓存单元754还耦合到访存接收模块755,访存接收模块755还耦合到仲裁器761和译码器712。

图7的实施例中,cpu代理706包括队列tx模块765与队列rx模块760。队列tx模块765可以是图5的队列tx模块565,队列rx模块760可以是图6的队列rx模块675。

cpu702可通过cpu代理706的队列tx模块765向队列0填充条目,以及通过cpu代理706的队列rx模块760从队列1获取条目。队列tx模块765可向cpu702提供多条队列,cpu702通过这些队列向队列远端的代理发送队列条目。队列rx模块760可向cpu702提供多条队列,cpu702通过这些队列从队列远端接收队列条目。各个队列的远端可以是不同的代理或组件。

队列tx模块765与队列rx模块760均通过仲裁器761向消息总线708发送数据报文,并通过译码器712从消息总线708接收数据报文。队列tx模块765与队列rx模块760具有不同的功能标识(tag)。

cpu代理706还包括译码器712与仲裁器711。队列tx模块765与队列rx模块760均通过仲裁器711向访存模块766发出存储器704访问请求,以及队列tx模块765与队列rx模块760均通过译码器712从访存模块766接收存储器704给出的响应。

可选地,存储器(例如,dccm701或者片外存储器)耦合到消息总线,队列tx模块765与队列rx模块760通过仲裁器761向消息总线708发送访问存储器的访存报文,并通过译码器762从消息总线708接收存储器访问结果。以及这种情况下,无须提供译码器712与仲裁器711。

cpu702可向dccm701写入队列条目,并从dccm701读出队列条目。cpu702还可更新队列tx模块765维护的队列的写指针,以及队列rx模块760维护的队列的读指针。

图8是根据本申请实施例的通过代理进行队列通信的示意图。如图8所示,消息系统包括cpu代理806、cpu代理807、缓存代理809、消息代理820和消息总线807,消息总线807耦合到cpu代理806、cpu代理807、缓存代理809和消息代理820;cpu代理806包括队列tx模块865和队列rx模块860。cpu代理807包括队列tx模块875和队列rx模块870。

cpu代理806与cpu802和dccm801相耦合,cpu代理807与cpu804和dccm803相耦合。dccm801存储队列条目,cpu802直接访问dccm801,以访问dccm801的队列条目。dccm803存储队列条目,cpu804直接访问dccm803,以访问dccm803的队列条目。缓存代理809与消息代理820和存储器8010相耦合。

图8的实施例中,cpu802与cpu804利用各自的代理在消息总线808上进行队列通信。cpu802通过队列0向cpu804发送队列条目,cpu804从队列0接收条目。cpu804通过队列1向cpu802发送队列条目,cpu802从队列1接收条目。

cpu802与dccm801耦合到cpu代理806。dccm801中存储有队列0与队列1,cpu802直接访问dccm801以向队列0写入条目或从队列1获取条目。cpu代理806包括队列tx模块865与队列rx模块860。cpu代理806的队列tx模块865用于向cpu代理807的队列rx模块870发送消息,以将dccm801的队列0的条目发送dccm803的队列0。cpu代理806的队列rx模块860用于从cpu代理807的队列tx模块875接收消息,以接收被添加到dccm801/dccm803的队列1的条目。

cpu804与dccm803耦合到cpu代理807。dccm803中存储有队列1与队列1,cpu804直接访问dccm803以向队列1写入条目或从队列0获取条目。cpu代理807包括队列tx模块875与队列rx模块870。cpu代理807的队列tx模块875用于向cpu代理806的队列rx模块860发送消息,以将dccm803的队列1的条目发送dccm801的队列1。cpu代理807的队列rx模块870用于从cpu代理806的队列tx模块865接收消息,以接收被添加到dccm801/dccm803的队列0的条目。

队列tx模块可以是图5的队列tx模块565,队列rx模块可以是图6的队列rx模块675。

下面描述cpu的操作流程如下。

为了在cpu802与cpu804之间建立队列0,cpu802维护在dccm801中队列0,包括维护存储队列0的队列条目的地址,队列0的读指针(头指针)与写指针(尾指针),队列0的条目尺寸,队列条目的数量(队列深度),cpu802向cpu代理806的队列tx模块865指示dccm801中队列0的读指针与尾指针(和/或存储队列条目的地址)、队列0的条目尺寸以及队列条目的数量。以类似的方式,可在cpu802与cpu804之间建立多条队列。

cpu802还配置(例如,通过cpu代理806的配置模块)cpu代理807的队列rx模块870,指示dccm803中队列0的读指针与尾指针(和/或存储队列条目的地址)、队列0的条目尺寸以及队列条目的数量。cpu代理806的队列0与cpu代理807的队列0可具有不同的队列深度。可依据cpu802与cpu804所拥有的dccm(存储资源)数量设置各自队列的深度。

可选地,cpu802还向cpu代理806的队列tx模块865设置队列接收方的代理标识(图8中,cpu代理807)。从而,在未经其他指定的情况下,队列tx模块865将消息都发送给代理cpu代理807(及其队列rx模块870)。

依然可选地,上述配置,也可由cpu804实施。

下面描述进行队列通信的过程。

为通过队列0进行通信,cpu802依据队列0的写指针,将队列条目写入dccm801中的队列0,更新写指针使写指针指向队列0的下一可写入条目,并向cpu代理806的队列tx模块865告知写指针的新值。至此,cpu802已即完成了向队列0添加条目的操作。以同样方式,cpu802可向队列0添加一个或多个条目。余下的工作由cpu代理806与cpu代理807协作完成。

cpu代理806的队列tx模块865响应于dccm801的队列0的写指针被更新,识别出队列0中被添加了条目,依据队列0的读指针获取队列0的条目,将条目发送给cpu代理807的队列rx模块870。cpu代理807的队列rx模块870将接收到的队列0的条目,依据自身维护的队列0的写指针将接收的条目存储到dccm803的队列0,并使队列rx模块870所维护的队列0的写指针递增。以及cpu代理807的队列rx模块870响应于队列0的写指针超前于读指针,识别出dccm803的队列0被添加了条目,向cpu804指示队列0被添加了条目。cpu804基于队列0的读指针从dccm803中获取被添加到队列0的条目。

cpu代理807的队列rx模块870响应于将接收的队列0的条目存储到dccm803的队列0,还向cpu代理806的队列tx模块865指示队列0的条目被成功接收,从而cpu代理806的队列tx模块865知晓队列0的条目被cpu代理807取走,因而更新dccm801的队列0的读指针。

在图8的实施例中,cpu802维护dccm801中的队列0。而cpu代理807在dccm803中维护了dccm801的队列0的副本队列0,以跟踪cpu802所维护的队列0的变化。从而cpu802仅需操作本地存储器(dccm801)中的队列0,而无须关注远端存储器(队列0的接收方的存储器),简化了cpu802的操作复杂度,也无须等待队列0的条目被从dccm801搬移到dccm803。从而在逻辑上,在cpu802与cpu804之间建立起单向队列。队列0可以是循环队列,当写指针到达队列的存储空间最后的条目后,写指针再被更新时,写指针将指向的存储空间最前的条目。

以类似的方式,cpu804通过dccm803的队列1,将队列条目发送给cpu802的dccm801的队列1。

响应于从cpu代理807接收了队列1的条目,cpu代理806的队列rx模块860将接收的条目存储到dccm801的队列1,更新队列1的写指针,并向cpu802指示队列1的写指针超前于读指针(dccm801的队列1中被写入条目)。

cpu802意识到队列1中被写入了条目,依据队列1的读指针(可以由cpu802自己维护,也可从cpu代理806的队列rx模块860获取,从dccm801的队列1获取队列条目,并更新cpu802以及cpu代理806的队列rx模块860所维护的队列1的读指针。

图9是根据本申请又一实施例的通过代理进行队列通信的示意图。如图9所示,消息系统包括cpu代理906、cpu代理907、缓存代理909、消息代理920和消息总线908,消息总线908耦合到cpu代理906、cpu代理907、缓存代理909和消息代理920;cpu代理906包括队列tx模块965和队列rx模块960。cpu代理907包括队列tx模块975和队列rx模块975。

cpu代理906与cpu902和dccm901相耦合,cpu代理907与cpu904和dccm903相耦合。dccm901存储队列条目,cpu902直接访问dccm901,以访问dccm901的队列条目。dccm903存储队列条目,cpu904直接访问dccm903,以访问dccm903的队列条目。缓存代理909与消息代理920和存储器924相耦合。

图8的实施例中,受限于dccm的容量,队列的深度难以很大。在图9的实施例中,使用外部于片上系统的存储器924存储队列条目,极大降低了对队列深度的限制。即使在队列消费者无暇处理队列条目时,也可将队列生产者提供的队列条目缓存在存储器924中,降低对队列生产者业务流程的影响。

图9的实施例中,cpu902与cpu904利用各自的代理在消息总线908上进行队列通信。cpu902通过队列0向cpu904发送队列条目,cpu904从队列0接收队列条目。cpu904通过队列1向cpu902发送队列条目,cpu902从队列1接收队列条目。

在图9的实施例中,队列0的队列条目不是直接从dccm901传递到dccm903,而是cpu代理906的队列tx模块965将dccm901中的队列0的队列条目发送给消息代理920(由图9中的(1)指示),消息代理920将队列0的队列条目存储到存储器924(例如,通过缓存代理909)(由图9中的(2)指示)。接下来,消息代理920再从存储器924取出队列0的队列条目(由图9中的(3)指示),发送给cpu代理907(由图9中的(4)指示),由cpu代理907的队列rx模块975将队列条目存储到dccm903的队列0,并使cpu904可访问队列0的队列条目。反之,cpu代理907将cpu904填充到dccm903的队列1的队列条目,发送给消息代理920。消息代理920将队列1的队列条目填充到存储器924,并从存储器924取出队列条目发送给cpu代理906。cpu代理906将队列条目填充到dccm901的队列1,从而cpu902可访问队列1的队列条目。

可选地,以操作队列0为例,cpu代理906的队列tx模块965感知cpu代理907的队列rx模块975提供的队列0的状态。在dccm903的队列0未满时,cpu代理906将队列0的接收方设置为cpu代理907,从而cpu代理906的队列tx模块965发出的数据报文(操作队列0的数据报文)被消息总线908转发给cpu代理907的队列rx模块975,cpu代理906与cpu代理907以图8的实施例所示的方式进行通信。若dccm903的队列0已满而暂时无法接收队列0的数据报文时,cpu代理906将队列0的接收方设置为消息代理920,从而cpu代理906的队列tx模块965发出的数据报文(操作队列0的数据报文)被消息总线908转发给消息代理920,并在存储器924中临时缓存队列0的队列条目。

类似地,cpu代理907的队列tx模块975也可根据dccm901中的队列1的状态,选择的将与队列1相关的数据报文发送给cpu代理906还是消息代理920。

对代理之间消息通路的更改,也可由cpu(cpu902或cpu904)设置,或者由消息接收方根据自身的队列的状态(满或未满)来设置。

消息代理920为组件之间的队列提供了可见或不可见的缓存。使得在队列的生产者看来,队列消费者的能力几乎是无限的,队列中的队列条目总是会被取走,减少了队列被填满而无法使用的情形出现。

而基于队列接收方状态选择数据报文的接收端,在队列通信的效率与可用性之间取舍。在接收方队列未满时,直接将数据报文发送给队列接收方的代理,以提高传输效率,降低传输延迟,而在接收方队列满时,将数据报文发送给缓存的代理(消息代理920),使得队列通信可持续进行,提高了队列通信可用性。

以及可选地,为消息代理920与缓存代理909之间提供单独的数据通路,减少对消息总线908的工作负载的影响。

在消息代理920中可包括队列tx模块与队列rx模块。消息代理920的队列rx模块从cpu代理906或cpu代理907的队列tx模块接收数据报文,而消息代理920的队列tx模块向cpu代理906或cpu代理907的队列rx模块发送数据报文。消息代理920的可维护在cpu代理906与cpu代理907通信的一条或多条队列。

为了在cpu902与cpu904之间建立队列0,cpu902维护在dccm901中队列0,包括维护存储队列0的队列条目的地址,队列0的读指针(头指针)与写指针(尾指针),队列0的队列条目尺寸,队列条目的数量(队列深度),cpu902向cpu代理906的队列tx模块965指示dccm901中队列0的读指针与尾指针(和/或存储队列条目的地址)、队列0的条目尺寸以及队列条目的数量。以类似的方式,可在cpu902与cpu904之间建立多条队列。

cpu902还配置消息代理920的队列rx模块,指示存储器924中队列0的读指针与尾指针(和/或存储队列条目的地址)、队列0的队列条目尺寸以及队列条目的数量。cpu代理906的队列0与消息代理920的队列0可具有不同的队列深度。可依据cpu902所拥有的dccm(存储资源)数量以及存储器924的容量设置各自队列的深度。

cpu902还配置cpu代理907的队列rx模块975,指示dccm903中队列0的读指针与尾指针(和/或存储队列条目的地址)、队列0的队列条目尺寸以及队列条目的数量。cpu代理906的队列0与cpu代理907的队列0可具有不同的队列深度。cpu代理907的队列0与消息代理920的队列0可具有不同的队列深度。

可选地,cpu902还向cpu代理906队列tx模块965设置接收方的代理标识(图9中,消息代理920)。从而,在未经其他指定的情况下,队列tx模块965将消息都发送给消息代理920中的队列rx模块。cpu902还向代理消息代理920的队列tx模块设置队列接收方的代理标识(图9中,cpu代理907)。从而,在未经其他指定的情况下,消息代理920的队列tx模块将消息都发送给cpu代理907中的队列rx模块975。可以理解地,cpu902可更新cpu代理906队列tx模块965和/或消息代理920的队列tx模块的接收方的代理标识。

依然可选地,上述配置,也可由cpu904实施。

为通过队列0进行通信,cpu902依据队列0的写指针,将队列条目写入dccm901中的队列0,更新写指针使写指针指向队列0的下一可写入队列条目,并向cpu代理906的队列tx模块965告知写指针的新值。至此,cpu902已即完成了向队列0添加队列条目的操作。以同样方式,cpu902可向队列0添加一个或多个队列条目。余下的工作由cpu代理906、消息代理920与cpu代理907协作完成。

cpu代理906的队列tx模块965响应于队列0的写指针被更新,识别出队列0中被添加了队列条目,依据队列0的读指针获取队列0的队列条目,将队列条目发送给消息代理920的队列rx模块,消息代理920的队列rx模块将接收到的队列0的队列条目,依据自身维护的队列0的写指针存储到存储器924的队列0,并使消息代理920的队列rx模块所维护的队列0的写指针递增。

消息代理920的队列rx模块响应于将接收的队列0的队列条目存储到存储器924的队列0,还向cpu代理906的队列tx模块965指示队列0的队列条目被成功接收,从而cpu代理906的队列tx模块965知晓队列0的队列条目被消息代理920取走,因而更新自身所维护的队列0的读指针。

以及消息代理920的队列tx模块响应于队列0的写指针超前于读指针,识别出队列0被添加了队列条目。消息代理920的队列tx模块依据队列0的读指针从存储器924获取队列0的队列条目,并通过消息总线发送给cpu代理907的队列rx模块975。cpu代理907的队列rx模块975将接收到的队列0的队列条目,依据自身维护的队列0的写指针存储到dccm903的队列0,并使队列rx模块975所维护的队列0的写指针递增。以及cpu代理907的队列rx模块975响应于队列0的写指针超前于读指针,识别出队列0被添加了队列条目,向cpu904指示队列0被添加了队列条目。cpu904基于队列0的读指针从dccm903中获取被添加到队列0的队列条目。

cpu代理907的队列rx模块975响应于将接收的队列0的队列条目存储到dccm903的队列0,还向消息代理920的队列tx模块指示队列0的队列条目被成功接收,从而消息代理920的队列tx模块知晓队列0的队列条目被cpu代理907取走,因而更新自身所维护的队列0的读指针。

图9的实施例中,消息代理920扩展了队列的容量。在队列接收端处理不及时而在dccm903中累积了队列条目时,消息代理920将队列条目缓存在具有大存储容量的存储器924中,从而及时取走队列生产者的队列条目(例如dccm901的队列0)。

从而cpu902仅需操作本地存储器(dccm901)中的队列0,而无须关注远端存储器(队列0的接收方的存储器),简化了cpu902的操作复杂度,也无须等待队列0的队列条目被从dccm901搬移到dccm903。cpu902甚至无须处理本地存储器队列满的情形,进一步降低cpu902的操作复杂度,提高了处理效率。

以类似的方式,cpu904通过dccm903的队列1,将队列条目发送给cpu902的dccm901的队列1。

响应于从消息代理920接收了队列1的队列条目,cpu代理906的队列rx模块960将接收的队列条目存储到dccm901的队列1,更新队列1的写指针,并向cpu902指示队列1的写指针超前于读指针。

cpu902意识到队列1中被写入了队列条目,依据队列1的读指针(可以由cpu902自己维护,也可从cpu代理906的队列rx模块960获取)从dccm901的队列1获取队列条目,并更新cpu902(以及cpu代理906的队列rx模块960)所维护的队列1的读指针。

图10是根据本申请又一实施例的用于片上系统的消息系统的框图。如图10所示,消息代理1020耦合到消息总线1008和第二消息总线1050。消息代理包括仲裁器1022、译码器1021、第二仲裁器1025、第二译码器1024、队列tx模块1040、队列rx模块1030和配置模块1023。

仲裁器1022将队列tx模块1040、队列rx模块1030与配置模块1023耦合到消息总线1008;译码器1021将消息总线1008耦合到队列tx模块1040、队列rx模块1030与配置模块1023;第二仲裁器1025将队列tx模块1040与队列rx模块1030耦合到第二消息总线1050;第二译码器1024将第二消息总线1050耦合到队列tx模块1040与队列rx模块1030。

消息总线1008和第二消息总线1050通过缓存代理1009相耦合,第二消息总线1050和存储器1060通过缓存代理1009相耦合。

图10的实施例中,消息代理1020包括队列tx模块1040与队列rx模块1030。队列tx模块1040可以是图5的队列tx模块,队列rx模块1030可以是图6的队列rx模块。

消息代理1020还包括配置模块1023。配置模块1023接收来自其他代理(例如cpu代理1006)的配置报文,并对消息代理1020的队列rx模块1030与队列tx模块1040进行配置,例如,设置队列的条目尺寸、队列读指针、队列写指针和/或队列深度。

图10的实施例中,消息代理1020的队列rx模块1030的指针管理器1032与队列tx模块1040的指针管理器1042还互相同步队列指针。队列rx模块1030响应于向队列填充条目,更新队列写指针,并将更新后的队列写指针同步给队列tx模块1040的指针管理器1042。队列tx模块1040响应于将队列条目提供给队列接收方,更新队列读指针,并将更新后的队列读指针同步给队列rx模块1030的指针管理器1032。

消息代理1020所维护的队列的条目存储在例如dram的存储器1060中。消息代理1020的队列rx模块1030与队列tx模块1040通过缓存代理1009访问存储器1060。在图10的例子中,队列rx模块1030与队列tx模块1040通过第二译码器1024与第二仲裁器1025同缓存代理交换报文。第二译码器1024与第二仲裁器1025通过第二消息总线1050耦合到缓存代理1009,并交换根据本申请实施例的报文。可选地,第二消息总线1050是消息总线的又一实例,从而在第二消息总线1050上交换报文,不占用消息总线1008的带宽。依然可选地,第二消息总线1050与消息总线1008是同一实例,从而降低系统硬件资源需求并简化设计。依然可选地,第二仲裁器1025与仲裁器1022可以是同一实例或分别是单独的实例;以及第二译码器1024与译码器1021可以是同一实例或分别是单独的实例。依然可选地,第二译码器1024与第二仲裁器1025可直接耦合到缓存代理1009而省略第二消息总线1050。

在图10的实施例中,队列发送方通过代理(例如,cpu代理1006)向消息代理1020队列0填充条目,以及通过cpu代理1006的队列rx模块从队列1获取条目。

最初,消息代理1020的队列rx模块1030与队列tx模块1040各自的指针管理器中,各队列的读指针与写指针相同(作为举例),都指向队列的起始地址,以指示队列为空。

消息代理1020的队列rx模块1030接收了来自代理(例如cpu代理1006)的向队列0填充条目的报文。队列rx模块1030从自身的指针管理器1032获取队列0的写指针,依据写指针与接收的条目生成访存报文,发送给缓存代理,以将队列0的条目写入存储器1060。队列rx模块1030还更新自身维护的队列0的写指针,使写指针指向存储下一个条目的位置。队列rx模块1030还向队列0的生产者代理(cpu代理1006)发送响应,告知代理cpu代理1006已收到队列0的条目。队列rx模块1030还将自身维护的队列0的写指针的新值发送给队列tx模块1040。队列tx模块1040在自身的指针管理器1042中记录队列0的写指针新值。

队列tx模块1040的指针管理器1042发现自身维护的队列0的写指针超前于读指针,意识到队列0中有被添加的条目。响应于队列0的写指针超前于读指针,队列tx模块1040依据队列0的读指针生成访问报文,通过缓存代理1009从存储器1060读出读指针所指示的队列条目,并发送给队列0的消费者代理(例如,cpu代理1007)。以及响应于从队列0的消费者代理(cpu代理1007)接收到对条目成功接收的响应,队列tx模块1040更新自身维护的读指针。队列tx模块1040向队列rx模块1030发送更新后的队列0的读指针。队列tx模块1040的指针管理器1042发现队列0的读指针与写指针相同,意味着队列0中没有待发送的条目。可选地,响应于收到队列tx模块1040更新的读指针,队列rx模块1030还向队列0的生产者代理(cpu代理1006)发送响应,以告知cpu代理1006,队列0的消费者已收到队列0的条目。

尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1