【芯片设计】AXI协议中那些“先不管”信号——AxBURST

640 阅读6分钟

Burst

在AXI(Advanced eXtensible Interface)协议中,BURST信号用于指定突发传输(burst transfer)的类型。突发传输是一种传输模式,允许多个数据项在一个事务(transaction)中连续传输,从而提高总线的效率和吞吐量。它可以是固定突发(地址不变)、递增突发(地址线性递增)或包装突发(地址循环)。通过设置BURST和LEN信号,AXI协议可以高效地传输大量连续数据,提高总线利用率和系统性能。

BURST信号的定义

BURST信号是3位宽的,它定义了突发传输的类型。AXI协议支持以下几种突发类型:

  1. 固定突发(FIXED burst):在整个突发传输过程中,地址保持不变。
  2. 递增突发(INCR burst):每次传输后,地址递增一个数据项的大小。
  3. 包装突发(WRAP burst):地址在一个固定长度内循环(环形地址)。

具体的BURST信号编码如下:

BURST 值突发类型描述
0b000FIXED固定地址,不随传输而递增
0b001INCR地址递增,适用于线性数据传输
0b010WRAP地址循环,用于缓存线等
0b011保留
0b100保留
0b101保留
0b110保留
0b111保留

各突发类型详细说明

  1. 固定突发(FIXED burst)

    • 地址保持不变,每次传输的数据项都从相同的地址读取或写入。
    • 适用于FIFO缓冲区等场景。
  2. 递增突发(INCR burst)

    • 每次传输后,地址递增一个数据项的大小(由AWSIZE定义)。
    • 适用于线性存储器访问,如连续的数据块传输。
    • 例如,如果AWSIZE为4字节(32位),每次传输后地址递增4字节。
  3. 包装突发(WRAP burst)

    • 地址在一个固定长度内循环(环形地址)。
    • 适用于缓存线(cache line)填充等场景。
    • 地址在达到指定边界后,返回到起始地址继续传输。

image.png

突发长度

除了突发类型,AXI协议中还有一个LEN信号用于指示突发传输的长度,即在一个突发传输中传输的数据项数量。LEN信号是8位宽的,它的值表示传输的数据项数目减去1。例如,LEN值为0x03表示传输4个数据项。

示例

假设一个64位数据总线(8字节),需要传输16个连续的数据项,每个数据项为64位(8字节),使用递增突发(INCR burst):

  • BURST = 0b001(递增突发)
  • LEN = 0x0F(16个数据项 - 1)
  • AWSIZE = 0b011(每个数据项8字节)

在这个例子中,传输的每个数据项地址将递增8字节,直到所有16个数据项传输完毕。

FIXED burst模式使用场景

FIXED burst模式在某些特定场景下非常有用,主要是当数据需要持续从同一地址进行读写时。

场景一:FIFO缓冲区读写

FIFO(First In, First Out)缓冲区通常用于数据流处理,例如音频或视频数据流。FIFO缓冲区中的数据通常需要以固定地址进行读写,因为数据是按照先入先出的顺序处理的。

示例:FIFO缓冲区写入

假设有一个音频处理系统,其中音频数据从一个固定的FIFO缓冲区地址写入。FIFO缓冲区的基地址是0x1000,每次写入一个32位的数据(4字节),总线宽度为32位。

  • AWADDR(地址) = 0x1000
  • AWSIZE = 0b010(4字节)
  • BURST = 0b000(FIXED burst)
  • LEN = 0x0F(16个数据项 - 1)

在这个例子中,写操作的地址始终为0x1000,即使传输了多个数据项。所有的数据项都写入到同一个FIFO缓冲区地址。

场景二:寄存器文件访问

在某些硬件设计中,可能需要频繁访问同一地址的寄存器。例如,状态寄存器或控制寄存器在系统运行期间需要频繁更新或读取,这些寄存器通常位于固定地址。

示例:状态寄存器写入

假设有一个状态寄存器,其地址是0x2000,每次写入一个32位的数据(4字节),总线宽度为32位。

  • AWADDR(地址) = 0x2000
  • AWSIZE = 0b010(4字节)
  • BURST = 0b000(FIXED burst)
  • LEN = 0x00(1个数据项 - 1)

在这个例子中,写操作的地址始终为0x2000。即使有多个数据项传输,它们都写入到同一个状态寄存器地址。

场景三:DMA传输中的外设访问

在DMA(Direct Memory Access)传输中,某些外设(如UART、SPI)需要连续读写同一个地址。这种情况下,FIXED burst模式可以用来确保数据项传输到固定地址。

示例:UART外设读写

假设有一个UART外设,其接收缓冲区地址是0x3000,需要从固定地址连续读取数据,每次读取一个8位的数据(1字节),总线宽度为32位。

  • ARADDR(地址) = 0x3000
  • ARSIZE = 0b000(1字节)
  • BURST = 0b000(FIXED burst)
  • LEN = 0x0F(16个数据项 - 1)

在这个例子中,读取操作的地址始终为0x3000,即使有多个数据项传输,它们都从同一个UART接收缓冲区地址读取。

WRAP Burst模式使用场景

场景一:缓存(Cache)填充

在现代计算系统中,缓存用于加速数据访问。缓存控制器在从主存中填充缓存行时,通常会使用WRAP burst模式。这样做的原因是,缓存行的大小是固定的,并且在缓存行填充过程中,地址会循环回到缓存行的起始位置。

场景二:图像处理

在图像处理应用中,图像数据通常以块或行的形式存储和处理。使用WRAP burst模式,可以有效地循环访问图像数据块,从而提高处理效率。

场景三:音频和视频数据缓冲

音频和视频数据流通常需要以循环缓冲的形式进行处理,以确保连续播放。WRAP burst模式可以帮助在缓冲区内循环传输数据,避免缓冲区溢出或不足。

WRAP Burst模式的地址计算

  • start_addr:起始地址
  • byte_num:2^axsize,如axsize = 2则byte_num = 4byte。需要尤其注意窄传输的场景,即axsize与总线位宽不一致
  • burst_len:axburst + 1

计算地址下界则为:

wrap_l=int(start_addr/(byte_numburst_len))(byte_numburst_len)wrap\_l = int(start\_addr/(byte\_num*burst\_len)) * (byte\_num*burst\_len)

如start_addr = 'h14 = 20,size = 2即byte_num = 4, burst_len = 3,那么可得:

wrap_l = int(20/16) * 16 = 16 = 'h10

计算地址上届为:

wrap_h=wrap_l+(byte_numburst_len)wrap\_h = wrap\_l + (byte\_num*burst\_len)

还是刚刚的情况,此时计算的地址上届为:

wrap_h = 16 + 16 = 32 = 'h20,注意使用地址是不包括上届的。那么在这个情况下,四笔数据的写入地址依次为:

  • 数据1 -> 'h14
  • 数据2 -> 'h18
  • 数据3 -> 'h1C
  • 数据4 -> 'h10(到达了上边界'h20所以返回写0x10)

简单来说,WRAP Burst模式就是以byte_num*burst_len定义了一个“环区间”大小然后以该区间进行地址对其后确定该区间的具体位置,再进行循环读写。