从WaveJSON语法到实战:手把手教你用Wavedrom画一个完整的AXI总线时序
从WaveJSON语法到实战:手把手教你用Wavedrom画一个完整的AXI总线时序
在数字电路设计中,时序图是工程师沟通协议细节的通用语言。而AXI作为当今片上系统(SoC)中最广泛使用的高性能总线协议,其复杂的握手机制和多通道并行特性,使得传统绘图工具难以清晰表达。这正是Wavedrom展现其独特价值的场景——通过简洁的WaveJSON语法,我们不仅能准确描述AXI时序,还能自动生成可版本控制的矢量图。
本文将带您深入WaveJSON的实战应用,从信号分组到因果箭头标注,逐步构建一个包含突发传输的AXI4时序模型。不同于基础教程,我们会重点解决三个工程实践中的典型问题:
- 如何用
signal数组实现多通道信号的自然分组 - 用
edge元素精确表达VALID/READY的握手依赖 - 通过
config调优呈现效果,适应不同文档需求
1. AXI协议核心与WaveJSON映射
AXI4协议包含五个独立通道:读地址(AR)、读数据(R)、写地址(AW)、写数据(W)和写响应(B)。每个通道都采用VALID/READY握手机制,这种分离特性正好对应WaveJSON的数组分组语法。
1.1 通道信号分组技巧
观察以下基础结构,我们使用嵌套数组实现通道聚合:
{signal: [ ['读通道', {name: 'ARVALID', wave: '01.....0....'}, {name: 'ARREADY', wave: '0..1.0.....'}, {name: 'RDATA', wave: 'x...=x', data: '0x1234'}, {name: 'RVALID', wave: '0....1..0.'}, {name: 'RREADY', wave: '0......1.0'} ], ['写通道', // AW/W/B通道类似结构 ] ]}关键细节:
- 数组首元素作为组标题显示在波形左侧
- 同通道信号保持纵向对齐,利用缩进提升可读性
- 数据总线使用
=填充符配合data字段标注传输值
1.2 握手时序的三种表达方式
AXI协议要求VALID不能依赖READY,这个微妙关系需要精确表达:
| 时序类型 | WaveJSON表示 | 实际含义 |
|---|---|---|
| 主设备发起 | VALID先变高 | wave: "01.." |
| 从设备响应 | READY后变高 | wave: "0..1" |
| 理想握手 | 同步变化 | edge: "a~b 1clk" |
突发传输(Burst)的表示尤为关键。以下代码展示INCR4类型写传输:
{signal: [ {name: 'AWVALID', wave: '01........0', node: '.a.......e'}, {name: 'AWREADY', wave: '0..1......0', node: '..b......d'}, {name: 'WDATA', wave: 'x.=x.=x.=x', data: ['D0','D1','D2','D3']}, {name: 'WVALID', wave: '0..101010.', node: '...cdefgh'}, {name: 'WREADY', wave: '0....1....', node: '.....i...'}, {name: 'BRESP', wave: 'x.....=...', data: 'OKAY'}, {name: 'BVALID', wave: '0......1.0'}, {name: 'BREADY', wave: '0.......1.'} ], edge: [ 'a~b AW握手', 'c~i 首次数据', 'd~e 地址结束', 'h~i 末次数据' ]}2. 高级波形标注实战
2.1 因果箭头与时间标注
edge元素是表达信号间时序关系的利器。在AXI中常见的应用场景:
写地址到首数据的延迟
edge: ['a~>c 2周期', 'b~>d 地址接受']数据间节拍控制
{name: 'WVALID', wave: '0..101010', node: '...a.b.c'}, {name: 'WREADY', wave: '0....1.1.', node: '....d.e'}, edge: ['a~d 首拍', 'b~e 次拍', 'c~e 末拍']
2.2 多时钟域交叉处理
当涉及跨时钟域时,config的phase参数能清晰展现时钟关系:
config: {hscale: 2}, signal: [ {name: 'ACLK', wave: 'P.......', period:2}, {name: 'BCLK', wave: 'P.......', period:3, phase:0.5}, {name: 'SYNC', wave: '0..1....', node: '..a'} ], edge: ['a-|>b 同步周期']3. 工程化调优技巧
3.1 皮肤与布局参数
针对不同输出场景推荐配置:
| 使用场景 | skin参数 | hscale | 特点 |
|---|---|---|---|
| 设计文档 | 'default' | 1 | 宽松布局,便于标注 |
| 会议胶片 | 'narrow' | 1.5 | 紧凑显示,适应幻灯片比例 |
| 网页嵌入 | 'default' | 2 | 提高移动端可读性 |
{ signal: [...], config: {skin: 'narrow', hscale: 1.5}, head: {text: 'AXI4突发传输时序', tick: 0} }3.2 调试辅助标记
在验证阶段可以添加临时标记:
{name: 'ARADDR', wave: 'x.=x', data: '0x4000', node: '..a'}, {name: 'ARLEN', wave: 'x3.x', data: '3', node: '..b'}, edge: ['a~b 突发长度校验']4. 完整AXI4示例与版本控制
最终我们整合所有技巧,构建一个可复用的AXI4突发传输模板:
// axiburst_template.json { signal: [ ['控制通道', {name: 'ACLK', wave: 'P.......'}, {name: 'ARESETn', wave: '10......'} ], ['读通道', {name: 'ARVALID', wave: '01.....0....', node: '.a'}, {name: 'ARREADY', wave: '0..1.0.....', node: '..b'}, {name: 'ARLEN', wave: 'x3.x', data: '3'}, {name: 'RDATA', wave: 'x...=x=x=x', data: ['D0','D1','D2','D3']}, {name: 'RVALID', wave: '0....1010', node: '...cdef'}, {name: 'RREADY', wave: '0......1.', node: '.....g'} ] ], edge: [ 'a~b 地址阶段', 'c~g 数据阶段', 'd~g 第二拍', 'e~g 第三拍' ], config: {skin: 'narrow', hscale: 1} }将此文件纳入版本控制系统后,可通过简单修改数据字段快速生成不同场景的时序图。例如调整ARLEN值即可改变突发长度,而核心时序关系始终保持正确。
