一、DW_ahb框图
Arbiter: 一次只允许一个master发起数据传输,同时可以选择slave
Optional Internal Decoder: 通过解码系统地址总线为AHB上的从机生成外设选择。每个slave都可以指定一个起始和结束地址,该地址必须与1kb边界对齐。
Optional External Decoder: 当选择此选项时,不包括内部解码器
Mulplexer: master的地址和控制信号是多路复用的,这取决于哪个master拥有系统数据总线。每个slave的所有数据都是多路复用的,这取决于哪个slave在前一个周期中被寻址。
二、特征
- 可以配置15个masters和31个slaves
- 数据总线宽度为8,16,32,64,128 or 256 bits ; 地址总线宽度为32bits和64bits
- 可以通过外部输入选择大端序和小端序。 大端序 (Big-endian):高位字节存储在低地址,低位字节存储在高地址。小端序 (Little-endian):低位字节存储在低地址,高位字节存储在高地址。
大端序通常用于网络协议(如 TCP/IP),因为它具有更好的可读性和与人类理解的顺序一致性。小端序则更适合计算机的处理方式,尤其是在现代处理器中,处理低字节优先的操作更为高效。
- 支持split, burst, and locked 传输
- 从端内存的连续与非连续分配
三、Arbiter仲裁器
Arbiter最多支持16个优先级(0到15)——0是禁用的设置,1是最低优先级,15是最高优先级——这样每个master都可以被分配一个单独的优先级。
在DW_ahb中,优先级值越高,Master的优先级越高。
在DW_ahb_icm中,优先级值越低,层的优先级越高。
在配置时,每个master都需要被分配一个初始优先级。缺省情况下,每个master的优先级与master序号相同。
3.1 第一层仲裁(First Tier Arbitration )
当两个或更多的masters同时请求总线时,具有最高优先级的master被授予总线。
在固定优先级仲裁中,低优先级的设备可能长期得不到资源,导致饥饿问题。
3.2 第二层仲裁(Second Tier Arbitration)
如果两个masters有相同的优先级,则使用“Fair Among Equals”算法进行仲裁。
FAE 经常采用循环仲裁(Round-Robin)的方法,在平等设备间轮流分配资源,确保每个设备都有机会获得访问权,而不至于某个设备被长时间饥饿(starvation)。
历史记录:一些 FAE 实现可能会记录每个设备的历史访问情况,以便在相同条件下,优先考虑那些最近没有获得过资源的设备。
动态优先级:在某些实现中,FAE 可能会根据系统运行时的条件(如当前负载、历史访问频率等)动态调整优先级。
3.3 加权令牌仲裁(Weighted Token Arbitration)
每个master都会被分配一个权重值,这个值通常与该设备的优先级、重要性或对资源的需求相关联。系统根据每个master的权重分配令牌(Token),在某一仲裁周期内,每个master可以获得的令牌数量与其权重成正比。
当多个master请求访问同一个资源时,仲裁器根据各自持有的令牌数量来决定哪个master可以获得访问权。权重高的master由于持有更多的令牌,因此在竞争中更有优势。虽然高权重的master更有优势,但低权重的master仍然有机会获得资源,从而避免了长期饥饿(starvation)问题。
0的值表示无限个令牌。
每个master的token值为最大周期数减2个周期
Master 1的优先级为15(最高),拥有4个tokens,而Master 2的优先级级别为1(最低),令牌为0,也即拥有无限个tokens。
虽然req_m1和req_m2都为高,但是master1优先级更高,所以master 1被授予总线所有权(hgrant_m1)时,hmaster = 1。此时,master1令牌计数器开始(count_m1)计数。当master 1的令牌用完时,他会产生一个mask,使其不会进入下一次arbitation, 因此master 2被授予所有权(hgrant_m2),直到仲裁周期结束。然后下一个仲裁周期开始,hgrant_m1和hgrant_m2都为高电平,但是由于master1优先级高,因此master1再次被授予总线所有权,并且此时master1令牌计数器被重置为4。虽然hgrant_m1只维持了两拍,但是必须要等master1的token被消耗完后才会进行下一次仲裁,由于后面没有mask操作,所以第三次仲裁任然是master1拿到权限,但是为什么hmaster后面还有一个次为2 ??hgrant_m2还有两拍为高??
注意:
即使master1的数据已经发送完了,但也要等到token被消耗完才会进行下一次arbitation。
ahb_wt_aps表示的是仲裁周期,master的token值加上2是最小仲裁周期。当计数开始时,该脉冲在一个周期内处于高位。仲裁周期可以硬编码或可编程
问题:
为什么hmaster后面还有一个次为2 ,为什么hgrant_m2还有两拍为高。
目前的理解是,先有req拉高,然后根据优先级确定哪一个master的grant拉高,然后再确定hamster为哪个master的ID。
哦~我懂了,因为master1 的req被拉低后,master2的req还维持了两拍为高,因此在这两拍内hgrant_m2为高,hmaster为2.但是由于master1的token还没被消耗完,因此还不会进行下次总线仲裁(但是为何hmaster=2呢,不应该仍然是master1占据总线吗?),当token被消耗完时,req2已经为低了
3.4 Weighted Token Arbitration 与 First Tier Arbitration 的异同
First Tier Arbitration:通常基于一个简单的规则集,如固定优先级、循环仲裁(Round-Robin)、或先到先得(First-Come, First-Served)。它可能不考虑复杂的动态条件,而是直接根据设定的优先级或顺序来做出仲裁决策。
Weighted Token Arbitration:基于权重和令牌的机制,设备根据其权重获得令牌,仲裁过程通过比较令牌数量来决定哪个设备获得资源。它可以动态调整权重以适应系统需求,具有更灵活的控制能力。
3.5 Arbiter Slave Interface
通过这个接口来控制Arbiter的一些功能。如Master priorities、Default master、Early burst termination、Weighted token registers、coreKit version ID等
3.6 波形图
AHB仲裁信号:
hburstseqx: 是主机请求访问总线信号
htrans: htrans=0是IDLE,1是BUSY, 2是NONSEQ, 3是SEQ
hgrantx:Arbiter通过hgrantx信号来表示请求总线的master中哪个的优先级最高
hmaster:表示哪一个主机当前被授予总线
hready:表示当前传输完成
具有多个主机请求所有权的固定长度突发的时间。当主机具有不同的优先级时,总线所有权从高到低。当主节点具有相同的优先级时,总线的所有权是随机的。
当具有未定义长度突发和相同优先级级别的主机被相同或更高优先级的主机提前终止时。也即,由于不知道突发长度,可能在一个master发送的途中被其他master打断
来自具有不同优先级级别的主机的未指定长度的突发的时间。
最高优先级每次都赢得总线的所有权。在爆发之间有一个额外的IDLE周期,因为请求必须保持到最后一次传输开始
这几个波形图没咋看懂
四、传输
支持分割传输(split)和锁定传输(locked)
重点介绍分割传输,
通过根据从机的响应操作来分离(或者分块)主机操作,以给从机提供地址和合适的数据,提高了总线的总体使用率。
当传输产生时,如果从机认为传输的执行将占据大量的时钟周期,那么从机能够决定发出一个 SPLIT 响应。该信号提示仲裁器尝试这次传输的主机不应该被授予访问总线,直到从机表示它准备好了完成传输时。因此,仲裁器负责监视响应信号,并且在内部屏蔽已经是 SPLIT 传输主机的任何请求。
在传输的地址周期,仲裁器在 HMASTER[3:0]产生一个标记,或者总线主机序号,以表示正在执行传输的主机。任何一个发出 SPLIT 响应的从机必须表示它有能力完成这个传输,并且通过记录 HMASTER[3:0]信号上的主机序号来实现。
之后,当从机能够完成传输时,它就根据主机序号在在从机到主机的 HSPLITx[15:0]信号上生效适当的位。然后仲裁器使用这个信息来解除来自主机请求信号的屏蔽,并且主机将被及时授予访问总线以重试传输。仲裁器在每个时钟周期采样 HSPLITx 总线,因此,从机只需要生效适当的位一个周期,以便仲裁器能够识别。
如果系统中有多个具有 SPLIT 能力的从机,那么每个从机的 HSPLITx 总线可以逻辑或在一起以提供给仲裁器单个 HSPLIT 总线。大多数系统中并没有用到最大 16 个总线主机的能力,因此,仲裁器仅要求一个位数和总主机数量一样的 HSPLIT 总线。但是,建议所有具有 SPLIT 能力的从机被设计成支持高达16个主机。
更多内容参考博客AMBA总线协议(8)——AHB(六):分割传输_ahb协议分块-CSDN博客
五、默认(default)master与虚拟(dummy)master
Deafult Master:当没有其他主设备正在使用总线时,作为默认控制总线的主设备。它的作用是保证总线始终有一个主设备处于控制状态,即使没有具体的传输请求
Dummy Master: 是一种用于测试或占用总线的虚拟主设备。它通常在仿真环境或测试环境中使用,模拟一个实际的主设备,但并不执行实际的数据传输任务
当启用weight-token-arbitation时,默认的master就是是dummy主机。
dummy master的驱动是IDLE状态
六、 暂停模式
可选的。当系统处于暂停模式时,dummy master拥有总线。来自主机的请求将被忽略,直到系统退出暂停模式。使用DW_apb_rap模块或类似的功能可以退出Pause Mode。默认情况下,coreConsultant中启用了仲裁者暂停模式特性
七、延迟暂停( Delayed Pause Action)
当在配置时设置延迟暂停动作时,当设置暂停信号时,如果从机给的hready仍为high时,暂停不会生效,但是此时该主机的htrans改为IDLE。如果未设置此操作,则一旦设置了暂停信号,DW_ahb将在下一个hclk边缘处进入暂停模式。通过延迟暂停操作,可以保证在暂停之前该master的所有传输传完
当发生资源冲突时,从设备的某些资源被其他任务占用时,需要一定的时间才能释放资源并响应主设备的请求。就需要这个信号了
八、突发提前终止(Early Burst Termination)
可选的, EBTEN = 1时被开启。可以提高总线利用率。当arbiter slave interface被使能的时候,可以配置。提前突发终止(EBT)使得在主master保持总线的周期过多时提前终止突发成为可能。总线被交给dummy master,经过一个clk后再重新进行arbitation。但是当传输被locked时,不会被提前终止。
当EBTEN = 0时,突发提前终止在下面两种情况下也可能发生:
- 当更高优先级的主机请求总线时,非指定长度的INCR传输(仅当配置参数AHB_FULL_INCR为false时)。
- 固定长度突发的最后两个节拍之间的繁忙周期(没懂)
九、Full Incrementing Bursts
当一个未指定长度的突发从主服务器发出时,您可以控制内部仲裁器的更新。通过支持完全递增的突发,仲裁器不会“提前终止”未指定长度的突发传输。整个burst被允许完成。但如果是不支持完全递增的突发(这是默认的操作模式),当master发出未指定长度的突发传输时,仲裁器可以自由地将总线使用权授予最高优先级的master。这实际上提前终止了传输。
十、可选的内部解码器(Optional Internal Decoder)
具有以下功能:
10.1 Remap Operation
Remap操作主要用于系统中地址空间的重新映射,以便外设或存储器可以访问不同的地址空间。
处理器可以从一个内存启动,然后在另一个内存运行。这通常意味着地址0x00000000需要从一个内存重新映射到另一个内存。DW_ahb有两种操作模式来支持这种类型的场景:引导模式(Boot Mode)和正常模式(Normal Mode)。每种模式都有自己的内存映射,根据您的配置,可以与其他模式相同,也可以不同。此功能被称为DesignWare Remap Feature。如果未启用此特性,则配置选项仅在正常模式下可用。
在启动模式的例子中,一个ROM(从机1)占用基址0x00000000,而一个嵌入式RAM(从机5)在正常模式下被重新映射到占用0x00000000的地址位置。有些slave映射前后地址一样,有些不一样
不同内存映射的选择是在输入信号remap_n的控制下进行的。在引导模式下,remap_n信号是逻辑0,而在正常模式下是逻辑1。如果不启用Remap功能,则remap_n在内部默认设置为1。
10.1.1 Boot Mode
启动代码的定位: 在系统上电复位(Power-On Reset)后,处理器需要从特定的地址开始执行启动代码。通常,这个地址是0x00000000。
非易失性存储器: 启动代码通常存储在非易失性存储器中,例如ROM(只读存储器)或闪存(Flash),因为RAM(随机存取存储器)在上电时可能还未初始化
在启动模式下,通过Remap操作,将包含启动代码的非易失性存储器映射到地址0x00000000处。这确保了处理器在复位后能够正确地从启动代码开始执行。
10.1.2 Normal Mode
运行时性能优化: 在启动完成后,为了优化系统性能,可能需要将更快的存储器(如SRAM)映射到地址0x00000000处,以加快指令和数据的访问速度。
资源的有效利用: 将RAM映射到低地址空间可以方便操作系统或应用程序的运行。
重新映射地址空间: 在启动完成并满足特定条件后,通过Remap操作,将SRAM或其他需要的存储器重新映射到地址0x00000000处。
10.1.3 Remap操作的流程示例
系统复位: 系统上电复位,处理器指向地址0x00000000。
启动模式: 由于Remap操作,启动存储器(如Flash)被映射到0x00000000,处理器开始执行启动代码。
初始化: 启动代码负责初始化系统,包括设置时钟、初始化RAM等。
切换到正常模式: 初始化完成后,通过软件触发Remap操作,将SRAM映射到0x00000000。
继续执行: 系统进入正常运行模式,操作系统或应用程序在新的内存映射下运行。
10.2 多地址区域(Multiple Address Regions)
存储器控制器具有用于内部寄存器的区域和用于外部存储器的区域。slave不需要占用内存映射的连续区域,最多可以被划分为8个区域(见上图)
10.3 Default Slave
当master试图访问一个未分配的地址时,DW_ahb返回一个错误响应。DW_ahb中提供此响应的代理称为Default Slave。