在 FPGA/ASIC 开发的世界中,AXI(Advanced Extensible Interface)协议扮演着至关重要的角色,它为高性能的 SoC(System on Chip)设计提供了一种灵活高效的通信机制。verilog-axi 库,由 Alex Forencich 精心打造,是每一位 FPGA 工程师工具箱中的瑞士军刀,它提供了一系列可参数化的 AXI4 和 AXI4-Lite 总线组件,极大地丰富了设计者的工具选项。
简介
verilog-axi 库是一个针对 FPGA 实现的 Verilog 组件集合,涵盖了从基础的 RAM 和 FIFO 到复杂的 DMA(Direct Memory Access)引擎和交叉开关的各类组件。这些组件不仅支持 AXI4 协议,也支持其精简版本 AXI4-Lite,以满足不同设计的需求。
组件概览
AXI 宽度适配器 (axi_adapter)
宽度适配器允许不同数据和地址宽度的 AXI 接口之间进行通信,支持 INCR 突发类型和狭窄突发。
AXI DMA 引擎 (axi_dma)
DMA 引擎能够将 AXI 流或 AXI 总线的数据高效地传输到内存或其他 AXI 设备,支持全宽 INCR 突发和未对齐传输。
AXI 非阻塞交叉开关 (axi_crossbar)
交叉开关是多主多从系统中的完美选择,提供了完全非阻塞的连接,支持所有类型的突发,并且拥有基于 ID 的事务排序保护逻辑。
AXI 双端口 RAM (axi_dp_ram)
双端口 RAM 支持 FIXED 和 INCR 突发类型,为需要快速读写访问的场合提供了解决方案。
AXI FIFO (axi_fifo)
FIFO 是任何需要缓冲解决方案的系统中的关键组件,支持所有突发类型,并可以选择性地延迟地址通道。
AXI 寄存器 (axi_register)
寄存器组件在所有通道中插入缓冲,可以单独更改或绕过,为时序调整和信号整合提供了灵活性。
AXI 精简版(AXI-Lite)组件
除了标准的 AXI 组件,verilog-axi 库还提供了 AXI-Lite 版本的组件,包括但不限于宽度适配器、时钟域交叉、交叉开关、RAM 和寄存器接口,适用于控制和配置接口,这些场合通常不需要 AXI 的完整功能集。
测试与验证
verilog-axi 库的每个组件都配备了完整的 cocotb 测试台,利用了 cocotbext-axi 库来简化 AXI 协议的测试。测试台可以通过 pytest 直接运行,也可以通过 tox 或 cocotb makefiles 来执行,确保了组件的正确性和可靠性。
结语
verilog-axi 库是 FPGA 开发者在设计 AXI 系统时的宝贵资源。它的组件全面、灵活且经过充分测试,能够满足从简单的数据传输到复杂的 SoC 互连的各种需求。无论你是正在构建一个小型的定制设备还是一个大型的系统级设计,verilog-axi 库都是一个值得考虑的高效工具。
README
更多信息和更新:alexforencich.com/wiki/en/ver…
GitHub 代码库:github.com/alexforenci…
介绍
这是一个AXI4和AXI4精简版总线组件的集合。大多数组件都支持完全参数化的接口宽度。包含了完整的cocotb测试台,这些测试台使用了cocotbext-axi。
文档
axi_adapter 模块
AXI宽度适配器模块,具有可参数化的数据和地址接口宽度。支持INCR突发类型和狭窄突发。是axi_adapter_rd和axi_adapter_wr的包装器。
axi_adapter_rd 模块
AXI宽度适配器模块,具有可参数化的数据和地址接口宽度。支持INCR突发类型和狭窄突发。
axi_adapter_wr 模块
AXI宽度适配器模块,具有可参数化的数据和地址接口宽度。支持INCR突发类型和狭窄突发。
axi_axil_adapter 模块
AXI到AXI精简版转换器和宽度适配器模块,具有可参数化的数据和地址接口宽度。支持INCR突发类型和狭窄突发。是axi_axil_adapter_rd和axi_axil_adapter_wr的包装器。
axi_axil_adapter_rd 模块
AXI到AXI精简版转换器和宽度适配器模块,具有可参数化的数据和地址接口宽度。支持INCR突发类型和狭窄突发。
axi_axil_adapter_wr 模块
AXI到AXI精简版转换器和宽度适配器模块,具有可参数化的数据和地址接口宽度。支持INCR突发类型和狭窄突发。
axi_cdma 模块
AXI到AXI DMA引擎,具有可参数化的数据和地址接口宽度。只生成全宽INCR突发,最大突发长度可参数化。支持未对齐传输,可以通过参数禁用以节省资源消耗。
axi_cdma_desc_mux 模块
AXI CDMA模块的描述符多路复用器/解复用器。允许在多个请求源之间共享AXI CDMA模块,交错请求并分发响应。
axi_crossbar 模块
AXI非阻塞交叉互联,具有可参数化的数据和地址接口宽度以及主从接口数量。支持所有突发类型。完全非阻塞,具有完全独立的读写路径;基于ID的事务排序保护逻辑;每个端口的地址解码、准入控制和解码错误处理。是axi_crossbar_rd和axi_crossbar_wr的包装器。
可以使用axi_crossbar_wrap.py生成包装器。
axi_crossbar_addr 模块
AXI非阻塞交叉互联的地址解码和准入控制模块。
axi_crossbar_rd 模块
AXI非阻塞交叉互联,具有可参数化的数据和地址接口宽度以及主从接口数量。仅限读接口。支持所有突发类型。完全非阻塞,具有完全独立的读写路径;基于ID的事务排序保护逻辑;每个端口的地址解码、准入控制和解码错误处理。
axi_crossbar_wr 模块
AXI非阻塞交叉互联,具有可参数化的数据和地址接口宽度以及主从接口数量。仅限写接口。支持所有突发类型。完全非阻塞,具有完全独立的读写路径;基于ID的事务排序保护逻辑;每个端口的地址解码、准入控制和解码错误处理。
axi_dma 模块
AXI到AXI流DMA引擎,具有可参数化的数据和地址接口宽度。只生成全宽INCR突发,最大突发长度可参数化。支持未对齐传输,可以通过参数禁用以节省资源消耗。是axi_dma_rd和axi_dma_wr的包装器。
axi_dma_desc_mux 模块
AXI DMA模块的描述符多路复用器/解复用器。允许在多个请求源之间共享AXI DMA模块,交错请求并分发响应。
axi_dma_rd 模块
AXI到AXI流DMA引擎,具有可参数化的数据和地址接口宽度。只生成全宽INCR突发,最大突发长度可参数化。支持未对齐传输,可以通过参数禁用以节省资源消耗。
axi_dma_wr 模块
AXI流到AXI DMA引擎,具有可参数化的数据和地址接口宽度。只生成全宽INCR突发,最大突发长度可参数化。支持未对齐传输,可以通过参数禁用以节省资源消耗。
axi_dp_ram 模块
AXI双端口RAM,具有可参数化的数据和地址接口宽度。支持FIXED和INCR突发类型以及狭窄突发。
axi_fifo 模块
AXI FIFO,具有可参数化的数据和地址接口宽度。支持所有突发类型。可以选择性地延迟地址通道,直到写数据完全移位到FIFO中,或者读数据FIFO有足够的容量容纳整个突发。是axi_fifo_rd和axi_fifo_wr的包装器。
axi_fifo_rd 模块
AXI FIFO,具有可参数化的数据和地址接口宽度。仅限AR和R通道。支持所有突发类型。可以选择性地延迟地址通道,直到读数据FIFO为空或者有足够的容量容纳整个突发。
axi_fifo_wr 模块
AXI FIFO,具有可参数化的数据和地址接口宽度。仅限WR、W和B通道。支持所有突发类型。可以选择性地延迟地址通道,直到写数据完全移位到写数据FIFO中,或者当前突发完全填满写数据FIFO。
axi_interconnect 模块
AXI共享互连,具有可参数化的数据和地址接口宽度以及主从接口数量。支持所有突发类型。面积小,但不支持并发操作。
可以使用axi_interconnect_wrap.py生成包装器。
axi_ram 模块
AXI RAM,具有可参数化的数据和地址接口宽度。支持FIXED和INCR突发类型以及狭窄突发。
axi_ram_rd_if 模块
AXI RAM读接口,具有可参数化的数据和地址接口宽度。处理突发并提供一个简化的内部存储器接口。支持FIXED和INCR突发类型以及狭窄突发。
axi_ram_wr_if 模块
AXI RAM写接口,具有可参数化的数据和地址接口宽度。处理突发并提供一个简化的内部存储器接口。支持FIXED和INCR突发类型以及狭窄突发。
axi_ram_wr_rd_if 模块
AXI RAM读写接口,具有可参数化的数据和地址接口宽度。处理突发并提供一个简化的内部存储器接口。支持FIXED和INCR突发类型以及狭窄突发。是axi_ram_rd_if和axi_ram_wr_if的包装器。
axi_register 模块
AXI寄存器,具有可参数化的数据和地址接口宽度。支持所有突发类型。在所有通道中插入简单缓冲区或滑移缓冲区。通道寄存器类型可以单独更改或绕过。是axi_register_rd和axi_register_wr的包装器。
axi_register_rd 模块
AXI寄存器,具有可参数化的数据和地址接口宽度。仅限AR和R通道。支持所有突发类型。在所有通道中插入简单缓冲区或滑移缓冲区。通道寄存器类型可以单独更改或绕过。
axi_register_wr 模块
AXI寄存器,具有可参数化的数据和地址接口宽度。仅限WR、W和B通道。支持所有突发类型。在所有通道中插入简单缓冲区或滑移缓冲区。通道寄存器类型可以单独更改或绕过。
axil_adapter 模块
AXI精简版宽度适配器模块,具有可参数化的数据和地址接口宽度。是axi_adapter_rd和axi_adapter_wr的包装器。
axil_adapter_rd 模块
AXI精简版宽度适配器模块,具有可参数化的数据和地址接口宽度。
axil_adapter_wr 模块
AXI精简版宽度适配器模块,具有可参数化的数据和地址接口宽度。
axil_cdc 模块
AXI精简版时钟域交叉模块,具有可参数化的数据和地址接口宽度。是axi_cdc_rd和axi_cdc_wr的包装器。
axil_cdc_rd 模块
AXI精简版时钟域交叉模块,具有可参数化的数据和地址接口宽度。
axil_cdc_wr 模块
AXI精简版时钟域交叉模块,具有可参数化的数据和地址接口宽度。
axil_crossbar 模块
AXI精简版非阻塞交叉互联,具有可参数化的数据和地址接口宽度以及主从接口数量。完全非阻塞,具有完全独立的读写路径;基于FIFO的事务排序保护逻辑;每个端口的地址解码、准入控制和解码错误处理。是axil_crossbar_rd和axil_crossbar_wr的包装器。
可以使用axil_crossbar_wrap.py生成包装器。
axil_crossbar_addr 模块
AXI精简版非阻塞交叉互联的地址解码和准入控制模块。
axil_crossbar_rd 模块
AXI精简版非阻塞交叉互联,具有可参数化的数据和地址接口宽度以及主从接口数量。仅限读接口。完全非阻塞,具有完全独立的读写路径;基于FIFO的事务排序保护逻辑;每个端口的地址解码、准入控制和解码错误处理。
axil_crossbar_wr 模块
AXI精简版非阻塞交叉互联,具有可参数化的数据和地址接口宽度以及主从接口数量。仅限写接口。完全非阻塞,具有完全独立的读写路径;基于FIFO的事务排序保护逻辑;每个端口的地址解码、准入控制和解码错误处理。
axil_interconnect 模块
AXI精简版共享互连,具有可参数化的数据和地址接口宽度以及主从接口数量。面积小,但不支持并发操作。
可以使用axil_interconnect_wrap.py生成包装器。
axil_ram 模块
AXI精简版RAM,具有可参数化的数据和地址接口宽度。
axil_reg_if 模块
AXI精简版寄存器接口,具有可参数化的数据和地址接口宽度。可以用来在多个模块和层级上组装一组控制寄存器,而不需要复杂的仲裁逻辑。是axil_reg_if_rd和axil_reg_if_wr的包装器。
axil_reg_if_rd 模块
AXI精简版寄存器接口,具有可参数化的数据和地址接口宽度。仅限读方向。可以用来在多个模块和层级上组装一组控制寄存器,而不需要复杂的仲裁逻辑。
axil_reg_if_wr 模块
AXI精简版寄存器接口,具有可参数化的数据和地址接口宽度。仅限写方向。可以用来在多个模块和层级上组装一组控制寄存器,而不需要复杂的仲裁逻辑。
axil_register 模块
AXI精简版寄存器,具有可参数化的数据和地址接口宽度。在所有通道中插入滑移缓冲区。通道寄存器可以单独绕过。是axil_register_rd和axil_register_wr的包装器。
axil_register_rd 模块
AXI精简版寄存器,具有可参数化的数据和地址接口宽度。仅限AR和R通道。在所有通道中插入简单缓冲区。通道寄存器可以单独绕过。
axil_register_wr 模块
AXI精简版寄存器,具有可参数化的数据和地址接口宽度。仅限WR、W和B通道。在所有通道中插入简单缓冲区。通道寄存器可以单独绕过。
通用信号
awid : 写地址ID
awaddr : 写地址
awlen : 写突发长度
awsize : 写突发大小
awburst : 写突发类型
awlock : 写锁定
awcache : 写缓存处理
awprot : 写保护级别
awqos : 写QoS设置
awregion : 写区域
awuser : 写用户侧带信号
awvalid : 写地址有效
awready : 来自从设备的写地址就绪
wdata : 写数据
wstrb : 写数据选通(字节选择)
wlast : 突发中最后的写数据传输
wuser : 写数据用户侧带信号
wvalid : 写数据有效
wready : 来自从设备的写数据就绪
bid : 写响应ID
bresp : 写响应
buser : 写响应用户侧带信号
bvalid : 写响应有效
bready : 来自主设备的写响应就绪
arid : 读地址ID
araddr : 读地址
arlen : 读突发长度
arsize : 读突发大小
arburst : 读突发类型
arlock : 读锁定
arcache : 读缓存处理
arprot : 读保护级别
arqos : 读QoS设置
arregion : 读区域
aruser : 读用户侧带信号
arvalid : 读地址有效
arready : 来自从设备的读地址就绪
rid : 读数据ID
rdata : 读数据
rresp : 读响应
rlast : 突发中最后的读数据传输
ruser : 读数据用户侧带信号
rvalid : 读响应有效
rready : 来自主设备的读响应就绪
通用参数
ADDR_WIDTH : awaddr 和 araddr 信号的宽度
DATA_WIDTH : wdata 和 rdata 信号的宽度
STRB_WIDTH : wstrb 信号的宽度
ID_WIDTH : *id 信号的宽度
AWUSER_ENABLE : 启用 awuser 信号
AWUSER_WIDTH : awuser 信号的宽度
WUSER_ENABLE : 启用 wuser 信号
WUSER_WIDTH : wuser 信号的宽度
BUSER_ENABLE : 启用 buser 信号
BUSER_WIDTH : buser 信号的宽度
ARUSER_ENABLE : 启用 aruser 信号
ARUSER_WIDTH : aruser 信号的宽度
RUSER_ENABLE : 启用 ruser 信号
RUSER_WIDTH : ruser 信号的宽度
源文件
rtl/arbiter.v : 可参数化的仲裁器
rtl/axi_adapter.v : AXI精简版宽度转换器
rtl/axi_adapter_rd.v : AXI精简版宽度转换器(读)
rtl/axi_adapter_wr.v : AXI精简版宽度转换器(写)
rtl/axi_axil_adapter.v : AXI到AXI精简版转换器
rtl/axi_axil_adapter_rd.v : AXI到AXI精简版转换器(读)
rtl/axi_axil_adapter_wr.v : AXI到AXI精简版转换器(写)
rtl/axi_cdma.v : AXI中央DMA引擎
rtl/axi_cdma_desc_mux.v : AXI CDMA描述符复用器
rtl/axi_crossbar.v : AXI非阻塞交叉互联
rtl/axi_crossbar_addr.v : AXI交叉互联地址模块
rtl/axi_crossbar_rd.v : AXI交叉互联(读)
rtl/axi_crossbar_wr.v : AXI交叉互联(写)
rtl/axi_dma.v : AXI DMA引擎
rtl/axi_dma_desc_mux.v : AXI DMA描述符复用器
rtl/axi_dma_rd.v : AXI DMA引擎(读)
rtl/axi_dma_wr.v : AXI DMA引擎(写)
rtl/axi_dp_ram.v : AXI双端口RAM
rtl/axi_fifo.v : AXI FIFO
rtl/axi_fifo_rd.v : AXI FIFO(读)
rtl/axi_fifo_wr.v : AXI FIFO(写)
rtl/axi_interconnect.v : AXI共享互连
rtl/axi_ram.v : AXI RAM
rtl/axi_ram_rd_if.v : AXI RAM读接口
rtl/axi_ram_wr_if.v : AXI RAM写接口
rtl/axi_ram_wr_rd_if.v : AXI RAM读写接口
rtl/axi_register.v : AXI寄存器
rtl/axi_register_rd.v : AXI寄存器(读)
rtl/axi_register_wr.v : AXI寄存器(写)
rtl/axil_adapter.v : AXI精简版宽度转换器
rtl/axil_adapter_rd.v : AXI精简版宽度转换器(读)
rtl/axil_adapter_wr.v : AXI精简版宽度转换器(写)
rtl/axil_cdc.v : AXI精简版CDC
rtl/axil_cdc_rd.v : AXI精简版CDC(读)
rtl/axil_cdc_wr.v : AXI精简版CDC(写)
rtl/axil_crossbar.v : AXI精简版非阻塞交叉互联
rtl/axil_crossbar_addr.v : AXI精简版交叉互联地址模块
rtl/axil_crossbar_rd.v : AXI精简版交叉互联(读)
rtl/axil_crossbar_wr.v : AXI精简版交叉互联(写)
rtl/axil_interconnect.v : AXI精简版共享互连
rtl/axil_ram.v : AXI精简版RAM
rtl/axil_reg_if.v : AXI精简版寄存器接口
rtl/axil_reg_if_rd.v : AXI精简版寄存器接口(读)
rtl/axil_reg_if_wr.v : AXI精简版寄存器接口(写)
rtl/axil_register.v : AXI精简版寄存器
rtl/axil_register_rd.v : AXI精简版寄存器(读)
rtl/axil_register_wr.v : AXI精简版寄存器(写)
rtl/priority_encoder.v : 可参数化的优先编码器
AXI4-Lite接口示例
写操作
___ ___ ___ ___ ___
clk ___/ \___/ \___/ \___/ \___/ \___
_______
awid XXXX_ID____XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
awaddr XXXX_ADDR__XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
awlen XXXX_00____XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
awsize XXXX_0_____XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
awburst XXXX_0_____XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
awprot XXXX_PROT__XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
awvalid ___/ \_______________________________
___________ _______________________
awready \_______/
_______________
wdata XXXX_DATA__________XXXXXXXXXXXXXXXXXXXXXXXX
_______________
wstrb XXXX_STRB__________XXXXXXXXXXXXXXXXXXXXXXXX
_______________
wvalid ___/ \_______________________
_______
wready ___________/ \_______________________
_______
bid XXXXXXXXXXXXXXXXXXXX_ID____XXXXXXXX
_______
bresp XXXXXXXXXXXXXXXXXXXX_RESP__XXXXXXXX
_______
bvalid ___________________________/ \_______
___________________________________________
bready
读操作
___ ___ ___ ___ ___
clk ___/ \___/ \___/ \___/ \___/ \___
_______
arid XXXX_ID____XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
araddr XXXX_ADDR__XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
arlen XXXX_00____XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
arsize XXXX_0_____XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
arburst XXXX_0_____XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
arprot XXXX_PROT__XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_______
arvalid ___/ \_______________________________
___________________________________________
arready
_______
rid XXXXXXXXXXXXXXXXXXXX_ID____XXXXXXXX
_______
rdata XXXXXXXXXXXXXXXXXXXX_DATA__XXXXXXXX
_______
rresp XXXXXXXXXXXXXXXXXXXX_RESP__XXXXXXXX
_______
rvalid ___________________________/ \_______
___________________________________________
rready
测试
运行包含的测试台需要cocotb,cocotbext-axi和Icarus Verilog。测试台可以直接使用pytest运行(需要cocotb-test),通过tox使用pytest,或者通过cocotb makefiles运行。