BWM(带宽管理,corePac中的模块,每个corePac有一个BWM)的目的是避免一个请求对一个资源的长期存取而造成的阻塞,BWM确保所有请求者都能获取一定大的带宽资源。
BWM是全局定义(对于整个corePac来说),局部实现(在每一个corePac中实现)。
初始化带宽管理既是设置一系列寄存器(arbitration registers),配置时需要在每个CPU上对同一寄存器设置(即每个仲裁寄存器都是CPU specific的,所有的CPU都有同样的一组仲裁寄存器,寄存器地址也是CPU specific的)。
BWM资源:
L1P SRAM/cache,L1D SRAM/cache,L2 SRAM/cache,配置总线。
BWM对以上源的带宽管理是通过优先级仲裁来实现的。当同时出现对一个源的多个请求,则优先级最高的请求首先获得访问权,以此来解决冲突。如果出现资源被连续抢占的情况,则由一个抢夺计数器(contention counter)来解决低优先级请求的服务,由它来保证每n个仲裁cycles必须响应一次低优先级请求,这个n可以通过对寄存器的MAXWAIT域编程来决定。资源请求受阻一次,则contention counter加1,当contention counter达到n时,则低优先级请求的优先级设为-1,并对该请求做出响应。因此,除了从高到低(0~8)9种优先级外,硬件还使用一个-1的优先级,表示某个传输请求因contention counter耗尽到n,使得该请求优先级获得提高。但用户不可对BWM仲裁控制寄存器直接写入-1的优先级。对L1P来说,没有可编程的BWM寄存器,但在L1P控制器中有固定带宽管理特性。对每个源(L1D,L2,EMC)都有一系列仲裁寄存器(CPUARBD/ IDMAARBD/ SDMAARBD/ UCARBD& MDMAARBE),每个寄存器对应一个不同的请求。对应每个源的一组寄存器有相同的初始化值,对大多数应用来说CPUARBD/ IDMAARBD/ SDMAARBD/ UCARBD的初始化值不需要修改。但MDMAARBE定义的优先级用于C66x corePac以外数据传输,可能需要根据对应系统手册做些调整,大多数情况下,MDMAARBE应该通过编程提高优先级(赋更小值)。
请求集:
1,CPU发起的数据访问(load/store),程序访问(包括访问自己所属corePac的资源以及其他corePac的资源以及MSM,DDR);
2,IDMA发起的传输(以及产生的一致性操作);
3,cache一致性操作(eg,Wb) - global与block-based;
4,corePac外部发起的SDMA(以及产生的一致性操作)操作,即协处理器(DMA)或其他CPU访问当前CPU所在的corePac资源。
如下图,在L2内存控制器中实现了下面的仲裁寄存器:
CPUARBU:当前CPU(指当前CPUARBU寄存器所作用的CPU)访问L2内存(当前corePac)的仲裁寄存器;
IDMAARBU:当前CPU所在的corePac的IDMA模块访问L2内存的仲裁寄存器;
SDMAARBU:外设或其他CPU访问当前CPU所属的corePac的L2内存时的仲裁寄存器。注意这个仲裁寄存器是在L2内存控制器上实现,不是在EMC模块上实现。这里的L2内存控制器作为slave接收其他CPU以及外设对本corePac L2内存的访问请求并仲裁(对于L1D内存控制器,有相应的SDMAARBD);
UCARBU:对L2内存的一致性操作的仲裁寄存器;
MDMAARBU:当前CPU访问当前corePac之外的资源时的仲裁寄存器,注意这个仲裁寄存器是在L2内存控制器上实现,不是在XMC模块上实现。这里L2内存控制器作为master发起对其他corePac资源以及MSM,DDR的访问。