探索 Verilog-AXI 库:FPGA/ASIC设计的瑞士军刀

512 阅读15分钟

在 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_rdaxi_adapter_wr的包装器。

axi_adapter_rd 模块

AXI宽度适配器模块,具有可参数化的数据和地址接口宽度。支持INCR突发类型和狭窄突发。

axi_adapter_wr 模块

AXI宽度适配器模块,具有可参数化的数据和地址接口宽度。支持INCR突发类型和狭窄突发。

axi_axil_adapter 模块

AXI到AXI精简版转换器和宽度适配器模块,具有可参数化的数据和地址接口宽度。支持INCR突发类型和狭窄突发。是axi_axil_adapter_rdaxi_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_rdaxi_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_rdaxi_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_rdaxi_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_ifaxi_ram_wr_if的包装器。

axi_register 模块

AXI寄存器,具有可参数化的数据和地址接口宽度。支持所有突发类型。在所有通道中插入简单缓冲区或滑移缓冲区。通道寄存器类型可以单独更改或绕过。是axi_register_rdaxi_register_wr的包装器。

axi_register_rd 模块

AXI寄存器,具有可参数化的数据和地址接口宽度。仅限AR和R通道。支持所有突发类型。在所有通道中插入简单缓冲区或滑移缓冲区。通道寄存器类型可以单独更改或绕过。

axi_register_wr 模块

AXI寄存器,具有可参数化的数据和地址接口宽度。仅限WR、W和B通道。支持所有突发类型。在所有通道中插入简单缓冲区或滑移缓冲区。通道寄存器类型可以单独更改或绕过。

axil_adapter 模块

AXI精简版宽度适配器模块,具有可参数化的数据和地址接口宽度。是axi_adapter_rdaxi_adapter_wr的包装器。

axil_adapter_rd 模块

AXI精简版宽度适配器模块,具有可参数化的数据和地址接口宽度。

axil_adapter_wr 模块

AXI精简版宽度适配器模块,具有可参数化的数据和地址接口宽度。

axil_cdc 模块

AXI精简版时钟域交叉模块,具有可参数化的数据和地址接口宽度。是axi_cdc_rdaxi_cdc_wr的包装器。

axil_cdc_rd 模块

AXI精简版时钟域交叉模块,具有可参数化的数据和地址接口宽度。

axil_cdc_wr 模块

AXI精简版时钟域交叉模块,具有可参数化的数据和地址接口宽度。

axil_crossbar 模块

AXI精简版非阻塞交叉互联,具有可参数化的数据和地址接口宽度以及主从接口数量。完全非阻塞,具有完全独立的读写路径;基于FIFO的事务排序保护逻辑;每个端口的地址解码、准入控制和解码错误处理。是axil_crossbar_rdaxil_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_rdaxil_reg_if_wr的包装器。

axil_reg_if_rd 模块

AXI精简版寄存器接口,具有可参数化的数据和地址接口宽度。仅限读方向。可以用来在多个模块和层级上组装一组控制寄存器,而不需要复杂的仲裁逻辑。

axil_reg_if_wr 模块

AXI精简版寄存器接口,具有可参数化的数据和地址接口宽度。仅限写方向。可以用来在多个模块和层级上组装一组控制寄存器,而不需要复杂的仲裁逻辑。

axil_register 模块

AXI精简版寄存器,具有可参数化的数据和地址接口宽度。在所有通道中插入滑移缓冲区。通道寄存器可以单独绕过。是axil_register_rdaxil_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

测试

运行包含的测试台需要cocotbcocotbext-axiIcarus Verilog。测试台可以直接使用pytest运行(需要cocotb-test),通过tox使用pytest,或者通过cocotb makefiles运行。