AXI4 时序波形精读:一次 burst 写加一次 burst 读的逐拍对照
更新时间:2026-10-28。本文是「集成电路大类 · 芯片设计」中间层(intermediate)的一篇波形精读文。AXI4-Full 总线协议入门 已经把 AXI4 的五个独立通道、burst 类型与事务结构讲清楚了;AXI 写通道握手时序 则聚焦写方向的 VALID/READY 契约。但协议结构看懂之后,多数人面对仿真器里一片高低电平仍然发怵:这一拍到底算不算数?WLAST 和 BVALID 谁先谁后?RVALID 举高了但数据没走掉是为什么?本篇不做抽象讲解,直接用 Icarus Verilog 实跑一个最小 AXI4-Full 主从对,把「一次 4-beat 写突发 + 一次 4-beat 读突发」的全部信号按拍摆开,逐拍精读。
本文要回答的问题
- 写突发的 AW、W、B 三个通道在波形上如何接力?BVALID 为什么要等 WLAST 之后才出现?
- 读突发的 AR、R 两个通道如何接力?RVALID 与 RREADY 同拍才举起时,首拍数据为什么要多等一拍?
- WLAST 与 RLAST 这两个「末拍标记」在波形上各自贴在哪一拍?
- 同样的 4 笔数据,AXI4 burst 与 AXI-Lite 单次传输在拍数上差多少?
先把这次实验的关键数字摆上来,全部出自后文日志:
这张卡的读法:橙色 6 拍与蓝色 5 拍是两次突发的「端到端占拍数」,差的一拍来自读通道少一个响应通道(写方向有 B 应答,读方向没有);绿色 4/4 说明写进去再读回来的数据逐拍相等;红色 10 ns 是时钟周期,后文所有「第几拍」都以它为刻度。
一、实验设定与五通道分工
被测对象是一个最小 AXI4-Full 从机(单 outstanding、INCR burst、内部一块 256 字的存储),主机侧是一个 testbench,先发 4-beat 写突发(起始地址 0x40,数据 a5a50001 至 a5a50004),再从同一地址发 4-beat 读突发逐拍比对。五个通道的接力关系一张图看清:
读这张图抓住颜色分组:紫色一组是写方向三通道(AW、W、B),绿色一组是读方向两通道(AR、R),红色单独标出 B 通道——它是全篇时序约束最强的一环,必须等 W 通道的 wlast 握手完成之后才被允许举起。读写两组之间则完全独立,协议允许交织;本实验为便于精读让写事务彻底结束后再发读事务。每通道内部都是同一条规则:VALID 由数据源侧举起表示「我准备好了」,READY 由接收侧举起表示「我能收」,两者在同一时钟沿同时为高,这一拍才算成交——这就是精读一切 AXI 波形的唯一标尺。
围绕这条标尺,协议还规定了三条细则,精读波形时拿来当 checklist 用:
- VALID 不许等 READY:数据侧不能先偷看对方有没有 READY 再决定举不举 VALID,否则两边互相等就是死锁。波形上表现为 VALID 一旦举起,在握手完成前必须保持稳定——数据也一样不许变。
- READY 可以等 VALID:接收侧允许看到 VALID 后再举 READY(本实验的从机就是这么做的),也允许提前举好。这两种风格在波形上的形状不同,但都合法。
- 握手完成前数据不许动:VALID 高而 READY 未高的等待拍里,数据总线上的值必须钉死。后文读通道首拍就有一次这样的等待,可以对照验证。
二、写突发逐拍精读:AW 指路、W 搬数、B 签收
写突发在波形上的真实形状如下,按 VCD 转写(时钟周期 10 ns,横轴一格一拍):
逐拍解读(括号内为仿真时刻,可在 VCD 中核对)。第一拍:awvalid 在 45 ns 举起,同拍从机的 awready 已经为高,于是 55 ns 时钟沿 AW 握手完成——地址 0x40、长度 awlen=3(即 4 beat)被从机锁存,awvalid 随即撤下。注意从机此刻才把 wready 举起来:W 通道的「开门」动作是 AW 握手的直接后果,这正是图二中「AW 指路、W 随后」的可观测痕迹。第二至第五拍:wvalid 与 wready 在 55–95 ns 区间同时为高,65、75、85、95 ns 四个沿各成交一拍,wdata 依次为 a5a50001 到 a5a50004,全程零等待拍——主机供数够快、从机一直能收时,W 通道就是这种「四连击」形状。第五拍(85–95 ns)的关键是 wlast 与最后一拍数据同拍有效,主机用它告诉从机「这是本突发最后一笔」;从机收到这一拍后立刻落 bvalid(95 ns 举起)。第六拍:testbench 的 bready 已于 95 ns 举起,bvalid 与 bready 在 105 ns 沿同时为高,B 握手完成,bresp=OKAY,整个写事务在 105 ns 正式结束。
这里值得盯一眼的协议约束是波形里 a→b→c 的两条箭头:bvalid 的高电平窗口(95–105 ns)严格落在 wlast 落拍(95 ns)之后。如果从机在 wlast 之前就举 bvalid,主机可能误判事务提前结束而撤掉后续数据——这是写通道实现里最常见的违规之一,精读波形时第一件事就是核对这条先后序。
把六个沿的事件汇总成一张时刻表,方便回波形核对:
| 时钟沿 | 成交事件 | 关键信号状态 |
|---|---|---|
| 55 ns | AW 握手 | awvalid=awready=1,锁存地址 0x40 与 awlen=3 |
| 65 ns | W 第 1 拍 | wdata=a5a50001,wlast=0 |
| 75 ns | W 第 2 拍 | wdata=a5a50002 |
| 85 ns | W 第 3 拍 | wdata=a5a50003 |
| 95 ns | W 第 4 拍(末拍) | wdata=a5a50004,wlast=1;bvalid 随后举起 |
| 105 ns | B 握手 | bvalid=bready=1,bresp=OKAY,写事务结束 |
注意一个容易看岔的细节:45–55 ns 这一拍 awvalid 已经举高,但握手并不是在「举起的那一刻」发生,而是在 55 ns 这个采样沿发生。AXI 是同步协议,一切成交都以时钟沿为准——读波形时眼光要始终落在沿上,而不是电平跳变的中间位置。
三、读突发逐拍精读:AR 一次握手,R 逐拍吐数
写事务落幕后,读突发在 115 ns 发起,波形如下:
逐拍解读。115 ns:arvalid 举起,arready 已为高,125 ns 沿 AR 握手完成,地址 0x40、arlen=3 被锁存,arvalid 撤下。125 ns:从机把第一拍数据 a5a50001 摆上 rdata 并举起 rvalid——AR 握手与首拍 rvalid 之间只隔一拍,这是读通道相对写通道的结构红利:读数据天然跟在地址后面,不需要像 W 通道那样的独立数据通道协商。但注意首拍并没有在 125 ns 立刻成交:rready 也是 125 ns 才举起的,与 rvalid 的高电平窗口严格对齐后,首拍握手实际发生在 135 ns 沿。这一拍「rvalid 已高但等 rready」的等待,正是 VALID/READY 解耦的直观教材——数据侧和接收侧各自按自己的节奏表态,只有重叠的那一拍才算数。随后 145、155、165 ns 各成交一拍,rdata 依次为 a5a50002、03、04。rlast 在 155–165 ns 窗口与第四拍同拍举起,165 ns 沿末拍握手完成后 rvalid、rlast 同时撤下,读事务结束。
对比两张波形可以发现读写方向的对称美:写方向是「AW 一拍 + W 四拍 + B 一拍」,读方向是「AR 一拍 + R 四拍」,bresp 的应答职责在读方向被 rresp(随每拍数据同行)和 rlast 分摊掉了,所以读事务少一拍、也没有独立的响应通道。
读通道的逐拍时刻表同样整理如下,与写表对照看更能看清两条通路的结构差异:
| 时钟沿 | 成交事件 | 关键信号状态 |
|---|---|---|
| 125 ns | AR 握手 | arvalid=arready=1,锁存地址 0x40 与 arlen=3 |
| 135 ns | R 第 1 拍 | rdata=a5a50001;rvalid 已高一拍、等 rready 对齐 |
| 145 ns | R 第 2 拍 | rdata=a5a50002 |
| 155 ns | R 第 3 拍 | rdata=a5a50003;rlast 本拍举起 |
| 165 ns | R 第 4 拍(末拍) | rdata=a5a50004,rlast=1;握手后 rvalid 撤下 |
两张表并排看,一个规律浮出来:地址通道(AW/AR)永远只占一拍,数据通道(W/R)占用拍数等于 burst 长度,差异只在收尾——写方向多一拍 B 应答,读方向用 rlast 内联收尾。所以评估一次 burst 的拍数开销有个速算式:写 = 2 + len + 1,读 = 2 + len(外加各类等待拍)。len 越大,地址与应答的固定开销占比越小,这就是下一节对照 AXI-Lite 时 burst 胜出的量化根源。
四、仿真实录:PASS 日志逐行核对
波形是 vcd 里的静态证据,testbench 的动态断言输出同样值得逐行核对——它把「这一拍发生了什么」翻译成了人话:
这份实录的读法:第一行 WRITE burst done: BRESP=OKAY at 105000(时间单位 ps,即 105 ns)对应图二第六拍的 B 握手完成;中间四行 READ beat 0..3 的时刻 135/145/155/165 ns 与图三中 rdata 四个数据相位一一对应,每行尾部的 OK 是 testbench 把 rdata 与 golden 数组逐拍比对后的断言结果;最后一行 TB_RESULT: PASS 是收口——写加读两个 burst、各 4 拍,零错误。完整输出原样摘录:
VCD info: dumpfile axi4.vcd opened for output.
WRITE burst done: BRESP=OKAY at 105000
READ beat 0: rdata=a5a50001 OK at 135000
READ beat 1: rdata=a5a50002 OK at 145000
READ beat 2: rdata=a5a50003 OK at 155000
READ beat 3: rdata=a5a50004 OK at 165000
TB_RESULT: PASS (write+read burst, 4 beats each)日志与波形互相咬合的程度就是这篇精读的可信边界:波形里每一个高电平窗口都能在日志里找到带时间戳的对应行,反过来日志里每个时刻都能在波形上指出具体哪一拍。以后读别人(或自己几个月前)的 AXI 波形时,建议保持同样的习惯——先在日志里找到锚点时刻,再回波形上展开那一拍前后各两个周期,比从 0 时刻开始肉眼扫全图高效得多。
还有一个工程细节值得带走:testbench 里写突发与读突发用的是同一个地址 0x40,读回来的四个值与写入的 golden 数组逐拍相等,等于顺带验证了从机存储的写读一致性。如果哪天这套环境搬到自己的从机上跑挂了,第一刀就切在这里——先确认是握手时序错了(对时刻表),还是数据通路错了(对 golden 值),两类 bug 的修法完全不同。
五、波形精读的三个常见误读
拿着这次实测波形,顺手把新手读 AXI 波形最常踩的三个误读点一遍。
误读一:把 VALID 举起当成成交。 读通道 125–135 ns 这一拍,rvalid 已高、rdata 已经是 a5a50001,但这一拍数据并没有被主机收走——rready 刚举起,双方高电平的重叠窗口要等 135 ns 沿才闭合。只看 VALID 数拍数,会把 4 拍 burst 数成 5 拍。
误读二:以为 READY 必须先于 VALID 举好。 本实验从机的 awready/arready 采用「空闲即举好」风格,而 rready 由主机在 AR 握手后才举——两种风格在同一张波形里并存,都合法。协议只约束 VALID 不许等 READY,反向依赖完全自由。
误读三:忽略 LAST 与响应通道的先后序。 写方向 bvalid 严格在 wlast 落拍之后;读方向 rlast 必须与末拍数据同拍。这两条是协议里为数不多的跨通道时序依赖,也是从机实现最容易写错的地方。精读任何一份 AXI 波形,先把这几个锚点对上,再看中间的数据拍,顺序不能反。
六、与 AXI-Lite 的拍数对照
同样是搬 4 个 32 位字,如果把总线换成 AXI-Lite 从机(不支持 burst,每次传输只能一个地址配一拍数据),拍数会发生什么变化:
三栏摆在一起,burst 的价值就很具体了:AXI4 写方向 6 拍里 4 拍在搬数据,数据通道利用率 4/6;AXI-Lite 走 4 次独立写事务至少 12 拍,同样 4 拍搬数据,利用率降到 1/3,而且每次都要重新走地址握手。地址相位是 burst 里唯一被「摊薄」的开销——这正是大批量搬运场景(DMA、缓存行填充)必须用 burst 的根因。当然本实验是零等待的理想工况,真实系统里 wready/rready 随时可能插入等待拍,精读方法不变:盯 VALID 与 READY 的重叠窗口。
再补一个账本外的视角:拍数差的不只是效率,还有验证复杂度。AXI-Lite 每次传输自包含,出错时波形上定位到某一次事务即可;AXI4 burst 的错误可能藏在 16 拍、256 拍的长突发中间,没有本文这种「锚点时刻 + 逐拍展开」的读法,单靠肉眼翻波形几乎不可行。这也是为什么讲协议结构的入门文之后,必须补一篇逐拍精读——协议给了骨架,波形精读给的才是排错时真正用得上的眼力。
这一篇在知识体系里的位置
- 协议结构前导:AXI4-Full 总线协议入门(五通道与事务结构的系统讲解);
- 写通道专题:AXI 写通道握手时序(VALID/READY 契约的细化讨论);
- 事务全景:AXI4 事务完整生命周期(从发起到应答的端到端视角);
- 对照组:AXI-Lite 从机设计(砍掉 burst 后的最简形态)。
一句话总结
AXI4 时序波形精读的标尺只有一把:VALID 与 READY 在同一时钟沿同时为高,这一拍才算成交。本篇用 iverilog 实跑最小 AXI4 主从对验证了这个标尺——写突发 AW 握手后 W 通道四连击、WLAST 落拍后 BVALID 才敢举起(6 拍收尾,BRESP=OKAY),读突发 AR 握手一拍后首拍数据上总线、RLAST 与末拍同拍(5 拍收尾,4 拍数据逐拍比对全过)。盯重叠窗口、核对 LAST 与响应的先后序,任何 AXI 波形都能按这个套路拆开读。
实验环境
- 机器/系统:云主机 4C8G / Ubuntu 22.04(eda-golden-v1 镜像)
- 工具版本:Icarus Verilog version 11.0 (stable)
- 日期:2026-10-28
- 完整命令:
iverilog -g2012 -o axi4_tb.out tb_axi4.v axi4_slave.v && vvp axi4_tb.out(vvp 运行后产出 axi4.vcd 波形与上文的 PASS 日志)
代码获取
完整 RTL 从机与 testbench 已同步到公开仓库:geek-doc.cn/experiments/axi4-timing-waveform-walkthrough,克隆后进入该目录执行 iverilog -g2012 -o axi4_tb.out tb_axi4.v axi4_slave.v && vvp axi4_tb.out 即可复现本文全部波形与日志。