AXI4 拍数计算:AxLEN、AxSIZE 与总线位宽,beat 数、总字节数和 WRAP 边界速算
更新时间:2026-09-25。本文是「集成电路大类 · 芯片设计」序列里的一篇长尾协议实操文。AXI4 完整协议 给出了字段定义,但看波形时最常被问的三个问题——「这一笔到底多少拍」「一共搬了多少字节」「WRAP 在哪个地址绕回」——答案全部来自 AxLEN、AxSIZE 和总线位宽三个量的组合。本文把这套拍数计算从公式推到边界速算,并给窄传输与 WRAP 各配一张速查表。窄传输的字节 lane 落位见 AXI4 窄传输与非对齐传输。
本文要回答的问题
- AxLEN、AxSIZE 各自编码什么,beat 数和每 beat 字节数怎么从字段值算出来?
- 一笔突发的总传输字节数公式是什么,窄传输时总线拍数为什么和数据量对不上直觉?
- WRAP 突发的回绕边界怎么一眼速算,协议对拍数有什么限制?
- 哪些字段组合是非法的,记分板做拍数检查时最容易踩哪些坑?
一、三个量:AxLEN、AxSIZE、总线位宽
AXI4 的突发长度由地址通道上两个字段编码,它们的语义是分开的:
- AxLEN[7:0]:突发中 beat 的个数减一。beat 数 = AxLEN + 1,取值范围 1~256(AxLEN = 0 是单 beat 传输,AxLEN = 255 是 256 beat 上限)。AXI3 只有 4 位、上限 16 beat,从 AXI3 桥接过来时容易把这个范围搞错。
- AxSIZE[2:0]:每个 beat 的字节数,编码为以 2 为底的幂。每 beat 字节数 = 2^AxSIZE,取值 1~128 字节,对应 beat 位宽 8~1024 位。
- 总线数据位宽 DWIDTH:物理上每拍能搬多少位,总线字节数 B = DWIDTH/8。AxSIZE 编码的 beat 字节数不得超过 B,否则字段非法。
由此得到三个最常用的公式:
beat 数 N = AxLEN + 1
每 beat 字节 S = 2^AxSIZE
总传输字节 T = N × S = (AxLEN + 1) × 2^AxSIZE注意总传输字节数 T 只由 AxLEN 和 AxSIZE 决定,与总线位宽无关;总线位宽决定的是每个 beat 在物理拍上如何落 lane。AxSIZE = B(beat 与总线等宽)时一笔突发占用恰好 N 个数据总线拍;AxSIZE < B 时称为窄传输(narrow transfer),每个总线拍仍只完成一个 beat,beat 数不变,但每拍只用部分 lane——所以搬同样多的总线拍数,实际字节数更少。反过来,窄主机经过 upsizer 后,互连用多拍补齐,物理拍数会被转换器改变,但协议语义上的 beat 数仍是 N。
AxSIZE 编码速查表
| AxSIZE | 每 beat 字节 | beat 位宽 | 要求总线位宽不小于 |
|---|---|---|---|
| 0 | 1 | 8 位 | 8 位 |
| 1 | 2 | 16 位 | 16 位 |
| 2 | 4 | 32 位 | 32 位 |
| 3 | 8 | 64 位 | 64 位 |
| 4 | 16 | 128 位 | 128 位 |
| 5 | 32 | 256 位 | 256 位 |
| 6 | 64 | 512 位 | 512 位 |
| 7 | 128 | 1024 位 | 1024 位 |
二、总字节数与窄传输拍数
先用等宽情形验证直觉:64 位总线(B=8),AxSIZE=3、AxLEN=15,则 N=16、S=8、T=128 字节,恰好是 16 拍搬完两条 64 字节 cache line。若要传输已知大小的载荷 P 字节,拍数直接取整:
所需 beat 数 N = ceil(P / S),余数不足一个 beat 也要占一个 beat窄传输的直觉陷阱在这里:32 位主机(S=4)挂在 64 位总线上发 AxLEN=15,协议上仍是 16 个 beat、16 个数据总线拍,总字节数 T=64,每个总线拍只有低 4 字节或高 4 字节有效。数波形上的 WVALID 拍数会得到 16,而不是「64 字节 / 8 字节每拍 = 8」——后者是 upsizer 合并之后的形态,窄传输本身不会自动把两个 beat 拼进一个总线拍。反过来算带宽时要分清「beat 数」与「物理总线拍数」,两者在等宽时相等,在跨宽度互连里不相等。
拍数 / 总字节速查表(AxLEN → N,列为 AxSIZE)
| AxLEN | N(beat 数) | T,SIZE=2(4B) | T,SIZE=3(8B) | T,SIZE=4(16B) |
|---|---|---|---|---|
| 0 | 1 | 4 B | 8 B | 16 B |
| 3 | 4 | 16 B | 32 B | 64 B |
| 7 | 8 | 32 B | 64 B | 128 B |
| 15 | 16 | 64 B | 128 B | 256 B |
| 31 | 32 | 128 B | 256 B | 512 B |
| 255 | 256 | 1 KB | 2 KB | 4 KB |
再给一个载荷反推的例子:DMA 要搬 100 字节,源端是 32 位(S=4),则 N=ceil(100/4)=25,AxLEN=24,最后一个 beat 只有数据有意义、总线拍照样占满。若源端可按 64 字节 beat(S=8,前提是总线够宽),则 N=ceil(100/8)=13,AxLEN=12,末拍只用 4 字节。拍数减少但总覆盖区间变成 104 字节,多出的 4 字节落在末拍的高位 lane,靠 WSTRB 屏蔽——这也是为什么 DMA 引擎普遍倾向用尽量大的 AxSIZE。
非对齐起始地址(AxADDR 不是 S 的整数倍)不改变 N 和 T:协议上首拍从偏移字节开始、末拍在传输终点截断,中间各拍是完整 beat,总有效字节数仍按 T 计算。不要把首拍少掉的字节从 T 里扣掉——地址覆盖区间长度恒为 T,只是首末拍落在 lane 边界之外的部分不参与。lane 与 strobe 的具体排列见 AXI4 WSTRB 字节使能。
三、WRAP 突发的边界速算
WRAP 突发用于 cache line 回填:从给定的起始地址开始递增,到达回绕边界后跳回窗口起点。它的边界完全由 N 和 S 决定,不必逐拍数:
回绕窗大小 W = N × S = T
边界 = 把 AxADDR 向下对齐到 W 的整数倍,再加 W
拍内地址推进到边界时,下一拍地址跳回 (AxADDR 对齐到 W)协议给 WRAP 加了三条硬限制:N 只能是 2、4、8、16;起始地址必须与 S 对齐;W 必须和 AxADDR 的对齐关系相容(起始地址不能越过其所在回绕窗的末端)。典型例子:N=4、S=8,W=32 字节。AxADDR=0x24 时四拍地址为 0x24、0x2C、0x20、0x28——第二拍到达 0x40 边界前先在窗口内跳回 0x20,这正是 CPU 先取关键字(critical word first)再绕回补齐其余字的顺序。若同样的 N、S 从 0x28 起拍,地址则是 0x28、0x20、0x24、0x2C,第一拍后立刻绕回窗头;起始偏移越靠近窗顶,绕回越早,但四拍覆盖的仍是同一个 32 字节窗口,集合不变、顺序变。
速算技巧是看地址低位:W=32 对应低 5 位(log2W)在窗口内编号,高位固定选窗;地址推进时只有低 log2W 位做加 S、到窗顶归零,高位不变。W=64 看低 6 位,W=128 看低 7 位,一眼就能判断某拍该不该绕。
WRAP 边界速查表
| N | S | W=N×S | 边界地址低位 | 合法 N 取值 |
|---|---|---|---|---|
| 4 | 4 B | 16 B | bit[3:0] 回绕 | 2/4/8/16 |
| 4 | 8 B | 32 B | bit[4:0] 回绕 | 2/4/8/16 |
| 8 | 8 B | 64 B | bit[5:0] 回绕 | 2/4/8/16 |
| 16 | 8 B | 128 B | bit[6:0] 回绕 | 2/4/8/16 |
| 16 | 16 B | 256 B | bit[7:0] 回绕 | 2/4/8/16 |
INCR 突发没有回绕,地址一直递增到 AxADDR + T − S;FIXED 每拍地址相同。burst 类型在地址通道上的完整语义见 AXI4 burst 类型与边界。
四、非法组合与验证检查清单
还有一个容易混淆的点:AxLEN 是逐 ID、逐笔突发独立的,不同 AxID 的突发 beat 数互不影响,不能用一个全局计数器把多笔 outstanding 的拍数混在一起数;写数据通道允许交错时(AXI4 已禁止写数据交错,AXI3 允许)更要按 ID 分别建计数,详见 AXI4 outstanding 与 ID 排序。
实战中还有一个数错总量的隐性路径:非对齐窄突发里,首拍和末拍只有部分字节有效,但拍数公式 N=AxLEN+1 不变,变的只是有效字节数,必须把「总线拍数」和「有效载荷字节数」分开记录;如果用有效字节反推拍数,遇到 WSTRB 稀疏的场景必然算错。窄传输和非对齐的字节车道细节见 AXI4 窄传输与非对齐传输。
字段层面有三类必查的非法组合。第一,AxSIZE 超过总线字节数,例如 32 位接口上出现 AxSIZE=3,协议不允许。第二,WRAP 的 N 不在 {2,4,8,16} 中,或 WRAP 起始地址未按 S 对齐。第三,把 AxLEN 直接当 beat 数用——这是 off-by-one 事故的头号来源:AxLEN=15 是 16 beat,按 15 拍建期望存储会漏掉一拍数据。
记分板侧建议把拍数检查独立成一层:monitor 解出 N、S、T 和 burst 类型,逐 beat 推进期望地址并核对 WLAST/RLAST 恰好出现在第 N 拍;地址生成函数对 INCR/WRAP/FIXED 分别实现,beat 计数和 T 的计算三者共用。握手反压不改变 beat 数——WVALID/WREADY 没握手成功的拍不算 beat,计数只在握手成功时递增,规则见 valid/ready 握手。覆盖率上至少覆盖单 beat、N=16、N=256 边界、两种窄 SIZE、WRAP 的 4 个合法 N、以及非对齐首末拍。落地方式见 AMBA AXI UVM 验证环境,跨宽度后的拍数变换见 AXI crossbar 与互连。
这一篇在知识体系里的位置
协议骨架见 AXI4 完整协议;窄传输与非对齐见 AXI4 窄传输与非对齐传输;字节落位见 AXI4 WSTRB 字节使能;WRAP 与 cache 语义见 AXI4 burst 类型与边界;跨宽度拍数变换见 AXI crossbar 与互连;验证落地见 AMBA AXI UVM 验证环境。
总结
AXI4 拍数计算只靠三个量:beat 数 N = AxLEN+1(1~256),每 beat 字节数 S = 2^AxSIZE(最大不超过总线字节数 B=DWIDTH/8),总传输字节 T = N×S 且与总线位宽无关;窄传输时数据拍数仍是 N、每拍仅部分 lane 有效,非对齐不改变 N 和 T,WRAP 的回绕窗 W=N×S、边界为起始地址向下对齐 W 再加 W,且 N 只能取 2/4/8/16,看地址低 log2W 位即可速算绕回点;把 AxLEN 误当 beat 数、窄传输按总线宽度算字节、WRAP 的 N 非法或起始未对齐,是拍数计算里三类必查的错误。