33 KiB
AXI 总线模块说明
本文档基于 full 分支的 rtl/soc_top.v、各 AXI 外设源码和软件头文件整理,用于说明当前 SoC 中 AXI 总线上的模块作用、端口含义和寄存器地址。
1. 总体连接关系
顶层 AXI 互连为 AxiCrossbar_2x8。它有 2 个 AXI master 输入和 8 个 AXI slave 输出。
1.1 AXI master 输入
| Crossbar 端口 | 顶层连接 | 作用 |
|---|---|---|
axiIn_0_* |
core_top 经 Axi_CDC 后的 cpu_sync_* |
CPU 访问内存、外设和加速器 |
axiIn_1_* |
snix_axil_cdma_mux 的 dma_m_* / mm2mm_* |
DMA/CDMA 作为 AXI master 发起内存和外设数据搬运 |
1.2 AXI slave 输出和地址窗口
| Crossbar 端口 | 物理地址窗口 | 常用非缓存虚拟地址窗口 | 顶层连接 | 作用 |
|---|---|---|---|---|
axiOut_0_* |
0x1c000000 - 0x1c7fffff |
软件通常直接使用物理地址 | axi_wrap_ram_sp_external |
BaseRAM/ExtRAM 存储子系统 |
axiOut_1_* |
0x00000000 - 0x007fffff |
无 | reserved tie-off | 保留窗口,当前返回空响应 |
axiOut_2_* |
0x1f000000 - 0x1f0fffff |
0xbf000000 - 0xbf0fffff |
axi_uart_controller |
UART0 |
axiOut_3_* |
0x1f100000 - 0x1f1fffff |
0xbf100000 - 0xbf1fffff |
axi_dvi |
视频输出 |
axiOut_4_* |
0x1f200000 - 0x1f2fffff |
0xbf200000 - 0xbf2fffff |
confreg |
LED、数码管、按键、开关、定时器、中断 |
axiOut_5_* |
0x1f300000 - 0x1f3fffff |
0xbf300000 - 0xbf3fffff |
axi_axil_adapter -> DMA/CDMA |
DMA 配置窗口 |
axiOut_6_* |
0x1f400000 - 0x1f4fffff |
0xbf400000 - 0xbf4fffff |
fft_mlkem_axi_slave |
FFT、ML-KEM 共享窗口 |
axiOut_7_* |
0x1f500000 - 0x1f5fffff |
0xbf500000 - 0xbf5fffff |
matmul_axi_slave |
矩阵乘法加速器 |
说明:软件中的 0xbfxxxxxx 地址是 Loongson/LoongArch 非缓存映射地址;硬件 crossbar 实际译码使用 0x1fxxxxxx 等物理地址。
2. AXI 信号字典
多个模块使用完全相同的 AXI4 或 AXI-Lite 端口。后续各模块只列出端口前缀,例如 ram_*、uart_*、s_axi_*、dma_m_*。这些前缀下的每个信号含义按本节解释。
2.1 AXI4 slave 接口信号
适用于 axi_wrap_ram_sp_external、axi_uart_controller、axi_dvi、confreg、fft_mlkem_axi_slave、mlkem_axi_slave、matmul_axi_slave 等模块。
| 信号 | 方向,以 slave 模块为准 | 含义 |
|---|---|---|
clk / aclk |
input | AXI 总线时钟。当前大多数 slave 使用 sys_clk。 |
resetn / aresetn / rst_n |
input | 低有效复位,已在顶层同步。 |
s_axi_awid / axi_awid |
input | 写地址事务 ID,用于响应通道返回对应 ID。 |
s_axi_awaddr / axi_awaddr |
input | 写地址。模块通常使用低位做内部寄存器偏移。 |
s_axi_awlen / axi_awlen |
input | 突发长度,表示 beats-1。 |
s_axi_awsize / axi_awsize |
input | 每个 beat 的字节数编码,2 表示 4 字节。 |
s_axi_awburst / axi_awburst |
input | 突发类型,常用 INCR。 |
s_axi_awlock / axi_awlock |
input | AXI lock 属性,本设计基本不使用。 |
s_axi_awcache / axi_awcache |
input | cache 属性,本设计通常透传或忽略。 |
s_axi_awprot / axi_awprot |
input | protection 属性,本设计通常透传或忽略。 |
s_axi_awvalid / axi_awvalid |
input | 写地址有效。 |
s_axi_awready / axi_awready |
output | slave 可接收写地址。 |
s_axi_wid |
input | 写数据 ID。部分 AXI4 实现保留,很多模块不使用。 |
s_axi_wdata / axi_wdata |
input | 写数据。 |
s_axi_wstrb / axi_wstrb |
input | 写字节使能,bit0 对应低 8 位。 |
s_axi_wlast / axi_wlast |
input | 写突发最后一拍。 |
s_axi_wvalid / axi_wvalid |
input | 写数据有效。 |
s_axi_wready / axi_wready |
output | slave 可接收写数据。 |
s_axi_bid / axi_bid |
output | 写响应 ID。 |
s_axi_bresp / axi_bresp |
output | 写响应状态,当前外设一般返回 OKAY=2'b00。 |
s_axi_bvalid / axi_bvalid |
output | 写响应有效。 |
s_axi_bready / axi_bready |
input | master 可接收写响应。 |
s_axi_arid / axi_arid |
input | 读地址事务 ID。 |
s_axi_araddr / axi_araddr |
input | 读地址。 |
s_axi_arlen / axi_arlen |
input | 读突发长度,表示 beats-1。 |
s_axi_arsize / axi_arsize |
input | 每个读 beat 的字节数编码。 |
s_axi_arburst / axi_arburst |
input | 读突发类型,常用 INCR。 |
s_axi_arlock / axi_arlock |
input | AXI lock 属性,本设计基本不使用。 |
s_axi_arcache / axi_arcache |
input | cache 属性,本设计通常透传或忽略。 |
s_axi_arprot / axi_arprot |
input | protection 属性,本设计通常透传或忽略。 |
s_axi_arvalid / axi_arvalid |
input | 读地址有效。 |
s_axi_arready / axi_arready |
output | slave 可接收读地址。 |
s_axi_rid / axi_rid |
output | 读响应 ID。 |
s_axi_rdata / axi_rdata |
output | 读数据。 |
s_axi_rresp / axi_rresp |
output | 读响应状态,当前外设一般返回 OKAY=2'b00。 |
s_axi_rlast / axi_rlast |
output | 读突发最后一拍。 |
s_axi_rvalid / axi_rvalid |
output | 读数据有效。 |
s_axi_rready / axi_rready |
input | master 可接收读数据。 |
2.2 AXI4 master 接口信号
适用于 snix_axil_cdma_mux 的 mm2mm_* / 顶层 dma_m_*。信号名称与 AXI4 slave 一致,但方向相反:awaddr/araddr/wdata/wstrb/valid/ready 等由 DMA master 发起,crossbar/slave 返回 ready、response 和 read data。
| 信号组 | 方向,以 DMA 为准 | 含义 |
|---|---|---|
mm2mm_aw* |
output/input | DMA 写地址通道,用于向目标地址发起写事务。 |
mm2mm_w* |
output/input | DMA 写数据通道。 |
mm2mm_b* |
input/output | DMA 写响应通道。 |
mm2mm_ar* |
output/input | DMA 读地址通道,用于从源地址发起读事务。 |
mm2mm_r* |
input/output | DMA 读数据通道。 |
mm2mm_awqos/arqos |
output | AXI QoS,顶层未使用。 |
mm2mm_awuser/wuser/aruser |
output | AXI user sideband,顶层未使用。 |
mm2mm_buser/ruser |
input | AXI user sideband,顶层绑常量。 |
2.3 AXI-Lite slave 接口信号
适用于 snix_axil_cdma_mux 和 cdma_matmul_bridge 的配置接口。
| 信号 | 方向,以 AXI-Lite slave 为准 | 含义 |
|---|---|---|
s_axil_awaddr |
input | AXI-Lite 写地址。 |
s_axil_awvalid |
input | 写地址有效。 |
s_axil_awready |
output | slave 可接收写地址。 |
s_axil_wdata |
input | 写数据。 |
s_axil_wstrb |
input | 写字节使能。 |
s_axil_wvalid |
input | 写数据有效。 |
s_axil_wready |
output | slave 可接收写数据。 |
s_axil_bresp |
output | 写响应状态。 |
s_axil_bvalid |
output | 写响应有效。 |
s_axil_bready |
input | master 可接收写响应。 |
s_axil_araddr |
input | AXI-Lite 读地址。 |
s_axil_arvalid |
input | 读地址有效。 |
s_axil_arready |
output | slave 可接收读地址。 |
s_axil_rdata |
output | 读数据。 |
s_axil_rresp |
output | 读响应状态。 |
s_axil_rvalid |
output | 读数据有效。 |
s_axil_rready |
input | master 可接收读数据。 |
3. 各 AXI 模块作用与端口
3.1 AxiCrossbar_2x8
作用:系统 AXI 主互连。它将 CPU 和 DMA 两个 master 的读写请求按地址译码转发到 8 个 slave,并负责读写响应返回。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
clk |
input | crossbar 工作时钟,顶层连接 sys_clk。 |
resetn |
input | 低有效复位,顶层连接 sys_resetn。 |
axiIn_0_* |
input/output | CPU 侧 AXI master 接口,信号含义见 AXI4 字典。 |
axiIn_1_* |
input/output | DMA/CDMA 侧 AXI master 接口,信号含义见 AXI4 字典。 |
axiOut_0_* |
output/input | RAM AXI slave 接口。 |
axiOut_1_* |
output/input | 保留 AXI slave 接口,顶层 tie-off。 |
axiOut_2_* |
output/input | UART AXI slave 接口。 |
axiOut_3_* |
output/input | DVI AXI slave 接口。 |
axiOut_4_* |
output/input | confreg AXI slave 接口。 |
axiOut_5_* |
output/input | DMA 配置 AXI slave 接口。 |
axiOut_6_* |
output/input | FFT/ML-KEM AXI slave 接口。 |
axiOut_7_* |
output/input | matmul AXI slave 接口。 |
3.2 core_top 与 Axi_CDC
作用:core_top 是 CPU;Axi_CDC 将 CPU 时钟域的 AXI 请求同步到 sys_clk 域,再送入 crossbar master 0。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
core_top.aclk |
input | CPU 时钟 cpu_clk。 |
core_top.aresetn |
input | CPU 低有效复位 cpu_resetn。 |
core_top.intrpt[7:0] |
input | CPU 中断输入。当前 {4'd0, mlkem_intr, matmul_intr, dma_finish, confreg_int}。 |
core_top.ar*/r*/aw*/w*/b* |
input/output | CPU AXI master 接口。 |
core_top.debug0_* |
output | CPU 写回级调试信号。 |
Axi_CDC.axiInClk/axiInRstn |
input | CPU 侧时钟/复位。 |
Axi_CDC.axiOutClk/axiOutRstn |
input | crossbar 侧时钟/复位。 |
Axi_CDC.axiIn_* |
input/output | CPU 侧 AXI 信号。 |
Axi_CDC.axiOut_* |
output/input | sys_clk 域 AXI 信号,连接 crossbar master 0。 |
3.3 axi_wrap_ram_sp_external
作用:SRAM 子系统的 AXI slave 包装器。它把 AXI 读写转换为异步 SRAM 控制信号,并根据内部地址 bit22 选择 BaseRAM 或 ExtRAM。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
aclk |
input | AXI/SRAM 控制器时钟,连接 sys_clk。 |
aresetn |
input | 低有效复位。 |
axi_ar*/axi_r*/axi_aw*/axi_w*/axi_b* |
input/output | RAM 的 AXI4 slave 接口,连接 crossbar axiOut_0_*。 |
base_ram_data[31:0] |
inout | BaseRAM 双向数据总线。写周期由控制器驱动,读周期为高阻输入。 |
base_ram_addr[19:0] |
output | BaseRAM 字地址,来自 soc_sram_addr[21:2]。 |
base_ram_be_n[3:0] |
output | BaseRAM 字节使能,低有效。 |
base_ram_ce_n |
output | BaseRAM 片选,低有效。 |
base_ram_oe_n |
output | BaseRAM 读使能,低有效。 |
base_ram_we_n |
output | BaseRAM 写使能,低有效。 |
ext_ram_data[31:0] |
inout | ExtRAM 双向数据总线。 |
ext_ram_addr[19:0] |
output | ExtRAM 字地址,来自 soc_sram_addr[21:2]。 |
ext_ram_be_n[3:0] |
output | ExtRAM 字节使能,低有效。 |
ext_ram_ce_n |
output | ExtRAM 片选,低有效。 |
ext_ram_oe_n |
output | ExtRAM 读使能,低有效。 |
ext_ram_we_n |
output | ExtRAM 写使能,低有效。 |
地址说明:0x1c000000 - 0x1c3fffff 选择 BaseRAM,0x1c400000 - 0x1c7fffff 选择 ExtRAM。
3.4 reserved window
作用:axiOut_1_* 是保留窗口,顶层没有接实际模块。读数据返回 0,写请求直接 ready/空响应。该窗口不建议软件使用。
3.5 axi_uart_controller
作用:AXI 到 APB/UART 控制器。CPU 通过 AXI 访问 16550 风格 UART 寄存器,实现串口收发和中断。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
clk |
input | UART AXI/APB 时钟,连接 sys_clk。 |
rst_n |
input | 低有效复位。 |
axi_s_* |
input/output | UART 的 AXI4 slave 接口,连接 crossbar axiOut_2_*。 |
apb_rw_dma |
input | DMA APB 访问方向,顶层绑 0,当前未使用。 |
apb_psel_dma |
input | DMA APB 片选,顶层绑 0。 |
apb_enab_dma |
input | DMA APB enable,顶层绑 0。 |
apb_addr_dma[19:0] |
input | DMA APB 地址,顶层绑 0。 |
apb_valid_dma |
input | DMA APB 请求有效,顶层绑 0。 |
apb_wdata_dma[31:0] |
input | DMA APB 写数据,顶层绑 0。 |
apb_rdata_dma[31:0] |
output | DMA APB 读数据,顶层未使用。 |
apb_ready_dma |
output | DMA APB ready,顶层未使用。 |
dma_grant |
output | APB mux 对 DMA 的授权,顶层未使用。 |
dma_req_o |
output | UART 控制器内部 DMA 请求,顶层未使用。 |
dma_ack_i |
input | DMA ack,顶层绑 0。 |
uart0_txd_i |
input | UART TX 管脚回读输入。 |
uart0_txd_o |
output | UART TX 输出值。 |
uart0_txd_oe |
output | UART TX 输出使能;顶层用它控制三态。 |
uart0_rxd_i |
input | UART RX 输入值。 |
uart0_rxd_o |
output | UART RX 输出值,三态模式下使用。 |
uart0_rxd_oe |
output | UART RX 输出使能。 |
uart0_rts_o |
output | UART RTS 调制解调控制输出。 |
uart0_dtr_o |
output | UART DTR 调制解调控制输出。 |
uart0_cts_i |
input | UART CTS 输入。 |
uart0_dsr_i |
input | UART DSR 输入。 |
uart0_dcd_i |
input | UART DCD 输入。 |
uart0_ri_i |
input | UART RI 输入。 |
uart0_int |
output | UART0 中断,送入 confreg 中断控制。 |
3.6 axi_dvi
作用:AXI 可配置的视频输出控制器。软件写入矩形/方形参数,模块产生 VGA/DVI 时序和 RGB 输出。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
aclk |
input | DVI 控制器和像素时钟来源。 |
aresetn |
input | 低有效复位。 |
s_aw*/s_w*/s_b*/s_ar*/s_r* |
input/output | DVI 的 AXI4 slave 接口,连接 crossbar axiOut_3_*。 |
video_clk |
output | 视频像素时钟输出。 |
hsync |
output | 行同步信号。 |
vsync |
output | 场同步信号。 |
data_enable |
output | 有效显示区域指示。 |
video_red[2:0] |
output | 红色像素分量。 |
video_green[2:0] |
output | 绿色像素分量。 |
video_blue[1:0] |
output | 蓝色像素分量。 |
3.7 confreg
作用:基础外设和中断控制寄存器模块。它负责 LED、数码管、拨码开关、触摸按键、系统定时器、中断状态聚合和仿真标志。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
aclk |
input | AXI 外设时钟,连接 sys_clk。 |
aresetn |
input | 低有效 AXI 复位。 |
cpu_clk |
input | CPU 时钟,当前传入但主要逻辑在 aclk 域。 |
cpu_resetn |
input | CPU 低有效复位。 |
s_aw*/s_w*/s_b*/s_ar*/s_r* |
input/output | confreg 的 AXI4 slave 接口,连接 crossbar axiOut_4_*。 |
led[15:0] |
output | 16 位 LED 输出。 |
dpy0[7:0] |
output | 低位数码管输出。 |
dpy1[7:0] |
output | 高位数码管输出。 |
switch[31:0] |
input | 32 位拨码开关输入。 |
touch_btn[3:0] |
input | 4 位触摸按键输入。 |
uart0_int |
input | UART 中断输入,映射到 confreg 中断源 bit5。 |
fft_finish |
input | FFT 完成输入,映射到 confreg 中断源 bit6。 |
confreg_int |
output | confreg 聚合后的中断输出,送入 CPU intrpt[0]。 |
3.8 axi_axil_adapter
作用:把 crossbar axiOut_5_* 的 AXI4 slave 访问转换为 AXI-Lite 访问,供 DMA/CDMA 配置寄存器使用。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
clk |
input | adapter 时钟,连接 sys_clk。 |
rst |
input | 高有效复位,顶层连接 ~sys_resetn。 |
s_axi_* |
input/output | AXI4 slave 侧,连接 crossbar axiOut_5_*。 |
m_axil_* |
output/input | AXI-Lite master 侧,连接 DMA 配置分流逻辑。 |
3.9 snix_axil_cdma_mux
作用:多通道 CDMA 控制器。它有 AXI-Lite 配置接口、AXI4 mm2mm master 数据搬运接口,以及本地 endpoint 接口。当前顶层参数 PORTS=4,即 4 个软件可见 DMA 通道。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
clk |
input | CDMA 时钟,连接 sys_clk。 |
rst_n |
input | 低有效复位。 |
s_axil_* |
input/output | AXI-Lite 配置 slave 接口,来自 axi_axil_adapter 且未命中 bridge 子窗口时进入本模块。 |
mm2mm_aw* / mm2mm_w* / mm2mm_b* / mm2mm_ar* / mm2mm_r* |
output/input | AXI4 master 数据搬运接口,连接 crossbar axiIn_1_*。 |
ep_wr_valid |
output | 向本地 endpoint 写数据请求有效。当前连接 matmul。 |
ep_wr_id[3:0] |
output | endpoint 编号。当前 matmul 使用 id 0。 |
ep_wr_bank[3:0] |
output | endpoint bank 选择。当前 matmul 使用 bank0/bank1。 |
ep_wr_word_addr[7:0] |
output | endpoint 内部 word 地址。 |
ep_wr_data[31:0] |
output | 写入 endpoint 的 32 位数据。 |
ep_wr_ready |
input | endpoint 可接收写数据。 |
ep_rd_valid |
output | 从 endpoint 读数据请求有效。 |
ep_rd_id[3:0] |
output | endpoint 编号。 |
ep_rd_bank[3:0] |
output | endpoint bank 选择。 |
ep_rd_word_addr[7:0] |
output | endpoint 内部 word 地址。 |
ep_rd_data[31:0] |
input | endpoint 返回的 32 位数据。 |
ep_rd_ready |
input | endpoint 读数据有效/可被采样。 |
ext_rd_req_valid |
input | 外部序列器请求“内存到 endpoint”搬运。当前来自 cdma_matmul_bridge。 |
ext_rd_req_ready |
output | CDMA 可接收外部读请求。 |
ext_rd_req_src[31:0] |
input | 外部读请求的内存源地址。 |
ext_rd_req_bytes[31:0] |
input | 外部读请求字节数。 |
ext_rd_req_ep_id[3:0] |
input | 外部读请求目标 endpoint id。 |
ext_rd_req_ep_bank[3:0] |
input | 外部读请求目标 endpoint bank。 |
ext_rd_req_ep_word_off[7:0] |
input | 外部读请求目标 endpoint word 偏移。 |
ext_rd_req_done |
output | 外部读请求完成脉冲/标志。 |
ext_wr_req_valid |
input | 外部序列器请求“endpoint 到内存”搬运。 |
ext_wr_req_ready |
output | CDMA 可接收外部写请求。 |
ext_wr_req_dst[31:0] |
input | 外部写请求的内存目的地址。 |
ext_wr_req_bytes[31:0] |
input | 外部写请求字节数。 |
ext_wr_req_ep_id[3:0] |
input | 外部写请求源 endpoint id。 |
ext_wr_req_ep_bank[3:0] |
input | 外部写请求源 endpoint bank。 |
ext_wr_req_ep_word_off[7:0] |
input | 外部写请求源 endpoint word 偏移。 |
ext_wr_req_done |
output | 外部写请求完成脉冲/标志。 |
dma_finish |
output | DMA 完成中断/状态输出,送入顶层 dma_finish 合并逻辑。 |
3.10 cdma_matmul_bridge
作用:matmul 专用 CDMA 序列控制器。CPU 配置输入基地址、输出基地址、组数和 stride 后,它自动向 snix_axil_cdma_mux 发起 endpoint 读写请求,并直接控制 matmul 启动、清状态、清 CRC。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
clk |
input | bridge 时钟,连接 sys_clk。 |
rst_n |
input | 低有效复位。 |
s_axil_* |
input/output | AXI-Lite 配置 slave 接口。当 DMA 配置地址 [11:8] == 4'h2 时访问本模块。 |
cdma_rd_req_valid |
output | 请求 CDMA 从内存读取数据到 matmul endpoint。 |
cdma_rd_req_ready |
input | CDMA 可接收读请求。 |
cdma_rd_req_src[31:0] |
output | 读请求内存源地址。 |
cdma_rd_req_bytes[31:0] |
output | 读请求字节数,matmul 输入固定为 128B。 |
cdma_rd_req_ep_id[3:0] |
output | 读请求目标 endpoint id。 |
cdma_rd_req_ep_bank[3:0] |
output | 读请求目标 matmul bank。 |
cdma_rd_req_ep_word_off[7:0] |
output | 读请求目标 endpoint word 偏移。 |
cdma_rd_req_done |
input | CDMA 读请求完成。 |
cdma_wr_req_valid |
output | 请求 CDMA 从 matmul endpoint 写回内存。 |
cdma_wr_req_ready |
input | CDMA 可接收写请求。 |
cdma_wr_req_dst[31:0] |
output | 写请求内存目的地址。 |
cdma_wr_req_bytes[31:0] |
output | 写请求字节数,matmul 输出固定为 192B。 |
cdma_wr_req_ep_id[3:0] |
output | 写请求源 endpoint id。 |
cdma_wr_req_ep_bank[3:0] |
output | 写请求源 matmul bank。 |
cdma_wr_req_ep_word_off[7:0] |
output | 写请求源 endpoint word 偏移。 |
cdma_wr_req_done |
input | CDMA 写请求完成。 |
mat_start_valid |
output | 启动 matmul 计算的有效脉冲。 |
mat_start_bank |
output | 启动哪个 matmul bank。 |
mat_done_clear |
output | 清除 matmul done/error 状态。 |
mat_crc_clear |
output | 清除 matmul CRC 累积值。 |
mat_done |
input | matmul 计算完成状态。 |
seq_done_irq |
output | 整个 matmul 序列完成中断,顶层与 cdma_dma_finish OR 成 dma_finish。 |
3.11 fft_mlkem_axi_slave
作用:共享 AXI slave 地址窗口,按地址低 16 位的 [15:12] 将请求分发到 ML-KEM 或 FFT。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
clk |
input | AXI 时钟,连接 sys_clk。 |
resetn |
input | 低有效复位。 |
s_axi_* |
input/output | 共享加速器 AXI4 slave 接口,连接 crossbar axiOut_6_*。 |
fft_finish |
output | FFT 完成状态,送入 confreg。 |
mlkem_intr |
output | ML-KEM 完成中断,直接送入 CPU intrpt[3]。 |
内部地址分发:
| 偏移范围 | 子模块 |
|---|---|
0x0000 - 0x3fff |
mlkem_axi_slave |
0x8000 - 0xcfff |
fft_controller / FFT |
3.12 mlkem_axi_slave
作用:ML-KEM 加速器 AXI4 slave 包装器,提供 KeyGen、Encaps、Decaps 的配置、输入预加载、输出读回和中断。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
clk |
input | AXI 总线时钟。内部再产生 mlkem_clk = clk/2。 |
resetn |
input | 低有效复位。 |
s_axi_* |
input/output | ML-KEM AXI4 slave 接口,由 fft_mlkem_axi_slave 分发而来。 |
intr |
output | ML-KEM done 锁存后的高电平中断。 |
3.13 fft_controller
作用:1024 点 16-bit FFT 加速器。通过 AXI 写入输入实部/虚部 BRAM,写 CSR 启动计算,完成后从输出实部/虚部窗口读取结果。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
aclk |
input | FFT/AXI 时钟。 |
aresetn |
input | 低有效复位。 |
s_aw*/s_w*/s_b*/s_ar*/s_r* |
input/output | FFT AXI4 slave 接口,由 fft_mlkem_axi_slave 分发而来。 |
fft_finish |
output | FFT done 状态,来自 CSR status bit1。 |
3.14 matmul_axi_slave
作用:矩阵乘法加速器 AXI slave。它既支持 CPU 通过 AXI 访问控制寄存器和 bank 数据,也支持 CDMA 通过本地 endpoint 写入输入、读出结果。模块内部带 CRC32 累积逻辑。
端口说明:
| 端口 | 方向 | 解释 |
|---|---|---|
clk |
input | matmul/AXI 时钟,连接 sys_clk。 |
resetn |
input | 低有效复位。 |
s_axi_* |
input/output | matmul AXI4 slave 接口,连接 crossbar axiOut_7_*。 |
ep_wr_valid |
input | CDMA 本地 endpoint 写请求有效。 |
ep_wr_id[3:0] |
input | endpoint id。当前仅使用 id 0。 |
ep_wr_bank[3:0] |
input | 写入 bank 选择,bit0 选择 bank0/bank1。 |
ep_wr_word_addr[7:0] |
input | 写入 bank 内 word 地址,0-15 为 A,16-31 为 B。 |
ep_wr_data[31:0] |
input | 写入 A/B 矩阵的 32 位数据。 |
ep_wr_ready |
output | matmul endpoint 可接收写数据。当前恒为 1。 |
ep_rd_valid |
input | CDMA 本地 endpoint 读请求有效。 |
ep_rd_id[3:0] |
input | endpoint id。 |
ep_rd_bank[3:0] |
input | 读取 bank 选择。 |
ep_rd_word_addr[7:0] |
input | 读取结果 C 的 word 地址。每个 66-bit 结果拆成 3 个 32-bit word。 |
ep_rd_data[31:0] |
output | endpoint 返回的 32 位结果数据。 |
ep_rd_ready |
output | endpoint 读数据可用。当前恒为 1。 |
mat_start_valid |
input | 来自 bridge 的启动脉冲。 |
mat_start_bank |
input | 启动计算的 bank。 |
mat_done_clear |
input | 清除 done/error。 |
mat_crc_clear |
input | 清除 CRC32 累积值。 |
mat_done |
output | 计算完成状态。 |
intr |
output | matmul 完成中断,送入 CPU intrpt[2]。 |
4. 寄存器地址表
以下地址以软件常用非缓存虚拟地址列出;括号中给出对应物理地址基址。
4.1 UART0 (0xbf000000, physical 0x1f000000)
16550 风格 8-bit 寄存器,软件常用字节访问。
| 地址 | 偏移 | 名称 | 访问 | 说明 |
|---|---|---|---|---|
0xbf000000 |
0x0 |
RBR/THR 或 DLL |
R/W | DLAB=0 时读接收缓冲/写发送保持;DLAB=1 时为 divisor low byte。 |
0xbf000001 |
0x1 |
IER 或 DLM |
R/W | DLAB=0 时为中断使能;DLAB=1 时为 divisor high byte。 |
0xbf000002 |
0x2 |
IIR/FCR |
R/W | 读为中断识别,写为 FIFO 控制;DLAB=1 时部分实现作为 divisor 扩展。 |
0xbf000003 |
0x3 |
LCR |
R/W | 线控制寄存器,bit7 为 DLAB。 |
0xbf000004 |
0x4 |
MCR |
R/W | modem 控制。 |
0xbf000005 |
0x5 |
LSR |
R | 线状态,软件轮询 bit5/bit6 判断发送 FIFO/发送器空。 |
0xbf000006 |
0x6 |
MSR |
R | modem 状态。 |
0xbf000007 |
0x7 |
SCR |
R/W | scratch/mode 寄存器。 |
4.2 DVI (0xbf100000, physical 0x1f100000)
| 地址 | 偏移 | 名称 | 访问 | 说明 |
|---|---|---|---|---|
0xbf100000 |
0x0 |
DVI_RECT_DIR |
R/W | 矩形位置参数,[31:16] 为 x,[15:0] 为 y。 |
0xbf100004 |
0x4 |
DVI_RECT_L_W |
R/W | 矩形尺寸参数,[31:16] 为长度/半宽相关参数,[15:0] 为宽度/高度相关参数。 |
0xbf100008 |
0x8 |
DVI_SQU_DIR |
R/W | 方形位置参数。 |
0xbf10000c |
0xc |
DVI_SQU_R |
R/W | 方形半径/尺寸参数。 |
4.3 confreg (0xbf200000, physical 0x1f200000)
| 地址 | 偏移 | 名称 | 访问 | 说明 |
|---|---|---|---|---|
0xbf20f000 |
0xf000 |
CONFREG_INT_EN |
R/W | 中断使能。 |
0xbf20f004 |
0xf004 |
CONFREG_INT_EDGE |
R/W | 中断边沿/电平模式配置。 |
0xbf20f008 |
0xf008 |
CONFREG_INT_POL |
R/W | 中断极性配置。 |
0xbf20f00c |
0xf00c |
CONFREG_INT_CLR |
W/R | 写 1 清除对应中断状态。 |
0xbf20f010 |
0xf010 |
CONFREG_INT_SET |
W/R | 写 1 软件置位对应中断状态。 |
0xbf20f014 |
0xf014 |
CONFREG_INT_STATE |
R | 当前中断状态。bit0-3 touch_btn,bit4 timer,bit5 UART,bit6 FFT。 |
0xbf20f100 |
0xf100 |
TIMER_VALUE |
R | 系统计数器当前值。 |
0xbf20f104 |
0xf104 |
TIMER_CMP |
R/W | 定时器比较值。 |
0xbf20f108 |
0xf108 |
TIMER_EN |
R/W | bit0 使能定时器。 |
0xbf20f200 |
0xf200 |
DIGITAL_CTRL |
R/W | 数码管控制寄存器。 |
0xbf20f204 |
0xf204 |
DIGITAL_DATA |
R/W | 数码管显示数据。 |
0xbf20f300 |
0xf300 |
LED_DATA |
R/W | LED 输出寄存器,低 16 位连接 leds[15:0]。 |
0xbf20f400 |
0xf400 |
SWITCH_DATA |
R | 32 位拨码开关输入。 |
0xbf20f500 |
0xf500 |
SIMU_FLAG |
R | 仿真标志,值为 {32{SIMULATION}}。 |
4.4 DMA/CDMA (0xbf300000, physical 0x1f300000)
当前 snix_axil_cdma_mux 在顶层例化为 PORTS=4,通道 ch=0..3,每个通道 stride 为 0x40。通道寄存器地址为 0xbf300000 + ch * 0x40 + offset。
| 偏移 | 名称 | 访问 | 说明 |
|---|---|---|---|
0x00 |
SRC_ADDR |
R/W | 源地址。mem2mem/mem2ep 时为内存源地址。 |
0x04 |
DST_ADDR |
R/W | 目的地址。mem2mem/ep2mem 时为内存目的地址。 |
0x08 |
LENGTH |
R/W | 传输字节数。 |
0x0c |
TAG |
R/W | 软件 tag,硬件不参与数据路径。 |
0x10 |
CTRL |
R/W | bit0 写 1 启动;[5:3] 为 AXI AxSIZE;[13:6] 为 AXI AxLEN。 |
0x14 |
STATUS |
R/W | bit0 busy,只读;bit1 done,写 1 清除。 |
0x18 |
MODE |
R/W | 0=mem2mem,1=mem2ep,2=ep2mem。 |
0x1c |
EP_CFG |
R/W | [3:0] bank,[15:8] word offset,[19:16] endpoint id。 |
通道基址:
| 通道 | 基址 |
|---|---|
| channel 0 | 0xbf300000 |
| channel 1 | 0xbf300040 |
| channel 2 | 0xbf300080 |
| channel 3 | 0xbf3000c0 |
matmul 序列控制子窗口由 cdma_matmul_bridge 实现,地址为 0xbf300200 + offset:
| 地址 | 偏移 | 名称 | 访问 | 说明 |
|---|---|---|---|---|
0xbf300200 |
0x200 |
SEQ_CTRL |
R/W | bit0 start;bit1 skip_result_writeback。 |
0xbf300204 |
0x204 |
SEQ_STATUS |
R/W | bit0 busy;bit1 done,写 1 清除。 |
0xbf300208 |
0x208 |
SEQ_SRC_BASE |
R/W | 输入矩阵组的物理源基址。 |
0xbf30020c |
0x20c |
SEQ_DST_BASE |
R/W | 输出矩阵组的物理目的基址。 |
0xbf300210 |
0x210 |
SEQ_GROUPS |
R/W | 自动处理的矩阵组数。 |
0xbf300214 |
0x214 |
SEQ_MAT_BASE |
R/W | 保留兼容字段,软件通常写 0x1f500000。 |
0xbf300218 |
0x218 |
SEQ_SRC_STRIDE |
R/W | 相邻输入组间隔,默认 128B。 |
0xbf30021c |
0x21c |
SEQ_DST_STRIDE |
R/W | 相邻输出组间隔,默认 192B。 |
4.5 FFT/ML-KEM 共享窗口 (0xbf400000, physical 0x1f400000)
4.5.1 ML-KEM 子窗口
| 地址/范围 | 偏移 | 名称 | 访问 | 说明 |
|---|---|---|---|---|
0xbf400000 |
0x000 |
MLKEM_CTRL |
W | bit0 start,启动 CONFIG 指定的操作。 |
0xbf400004 |
0x004 |
MLKEM_STATUS |
R/W | bit0 busy,bit1 done,bit2 preload_busy;写 bit1=1 清 done。 |
0xbf400008 |
0x008 |
MLKEM_CONFIG |
R/W | [2:0] k,[5:4] op,op: 0 KeyGen,1 Encaps,2 Decaps。 |
0xbf400010 - 0xbf40002c |
0x010 - 0x02c |
D[0..7] |
R/W | KeyGen seed d,8 个 32-bit word。 |
0xbf400030 - 0xbf40004c |
0x030 - 0x04c |
Z[0..7] |
R/W | implicit-reject seed z。 |
0xbf400050 - 0xbf40006c |
0x050 - 0x06c |
MSG[0..7] |
R/W | Encaps message m。 |
0xbf400070 - 0xbf40008c |
0x070 - 0x08c |
SS[0..7] |
R | shared secret 输出。 |
0xbf400100 |
0x100 |
PRELOAD_SEL |
R/W | 0=ek_in,1=dk_in,2=c_in。 |
0xbf400104 |
0x104 |
PRELOAD_ADDR |
R/W | 预加载字节地址,写 PRELOAD_DATA 后自动递增。 |
0xbf400108 |
0x108 |
PRELOAD_DATA |
W | 写低 8 位,流入所选输入端口。 |
0xbf40010c |
0x10c |
RDBK_SEL |
R/W | 0=ek,1=dk_pke,2=full-dk,3=ciphertext。 |
0xbf400110 |
0x110 |
RDBK_ADDR |
R/W | 读回字节索引。 |
0xbf400114 |
0x114 |
RDBK_DATA |
R | 读回低 8 位数据。 |
0xbf401000 - 0xbf401fff |
0x1000 - 0x1fff |
EK |
W/R | 写为 preload ek_in,读为 generated ek。 |
0xbf402000 - 0xbf402fff |
0x2000 - 0x2fff |
DK |
W/R | 写为 preload dk_in,读为 generated full dk。 |
0xbf403000 - 0xbf403fff |
0x3000 - 0x3fff |
CT |
W/R | 写为 preload c_in,读为 generated ciphertext。 |
4.5.2 FFT 子窗口
| 地址/范围 | 偏移 | 名称 | 访问 | 说明 |
|---|---|---|---|---|
0xbf408000 - 0xbf408ffc |
0x8000 - 0x8ffc |
FFT_IN_RE[0..1023] |
W | 输入实部 BRAM,每项低 16 位有效。 |
0xbf409000 - 0xbf409ffc |
0x9000 - 0x9ffc |
FFT_IN_IM[0..1023] |
W | 输入虚部 BRAM,每项低 16 位有效。 |
0xbf40a000 - 0xbf40affc |
0xa000 - 0xaffc |
FFT_OUT_RE[0..1023] |
R | 输出实部,符号扩展到 32 位,读出时使用 bit-reverse 地址。 |
0xbf40b000 - 0xbf40bffc |
0xb000 - 0xbffc |
FFT_OUT_IM[0..1023] |
R | 输出虚部,符号扩展到 32 位,读出时使用 bit-reverse 地址。 |
0xbf40c000 |
0xc000 |
FFT_CSR |
R/W | [7:4] 为 ctrl,写 bit4 启动/清 done;[3:0] 为 status,bit0 busy,bit1 done。 |
4.6 Matmul (0xbf500000, physical 0x1f500000)
| 地址/范围 | 偏移 | 名称 | 访问 | 说明 |
|---|---|---|---|---|
0xbf500000 |
0x000 |
MAT_CTRL |
R/W | bit0 启动 bank0,bit1 启动 bank1。 |
0xbf500004 |
0x004 |
MAT_STATUS |
R/W | bit0 busy,bit1 done,bit2 error;写 bit1 清 done,写 bit2 清 error。 |
0xbf500010 |
0x010 |
MAT_CRC |
R/W | 读返回 crc_reg ^ 0xffffffff;写该地址或 bridge 的 mat_crc_clear 清 CRC。 |
0xbf500100 - 0xbf50013c |
0x100 - 0x13c |
B0_A[0..15] |
R/W | bank0 输入矩阵 A,16 个 32-bit word。 |
0xbf500140 - 0xbf50017c |
0x140 - 0x17c |
B0_B[0..15] |
R/W | bank0 输入矩阵 B。 |
0xbf500180 - 0xbf50023c |
0x180 - 0x23c |
B0_C |
R | bank0 输出矩阵 C,16 个 66-bit 结果,每个结果拆成 3 个 32-bit word,共 192B。 |
0xbf500300 - 0xbf50033c |
0x300 - 0x33c |
B1_A[0..15] |
R/W | bank1 输入矩阵 A。 |
0xbf500340 - 0xbf50037c |
0x340 - 0x37c |
B1_B[0..15] |
R/W | bank1 输入矩阵 B。 |
0xbf500380 - 0xbf50043c |
0x380 - 0x43c |
B1_C |
R | bank1 输出矩阵 C,格式同 bank0。 |
5. 关键数据路径说明
- CPU 访问任意外设或内存:
core_top -> Axi_CDC -> AxiCrossbar_2x8 -> 对应 AXI slave。 - DMA 访问 SRAM:
snix_axil_cdma_mux mm2mm master -> AxiCrossbar_2x8 -> axi_wrap_ram_sp_external -> BaseRAM/ExtRAM。DMA 和 SRAM 没有直接物理连线。 - DMA 访问 matmul 本地 endpoint:
snix_axil_cdma_mux -> ep_wr/ep_rd -> matmul_axi_slave。这条是本地 endpoint 通路,不经过 AXI crossbar。 - matmul 批处理序列:CPU 写
0xbf300200等寄存器配置cdma_matmul_bridge,bridge 自动发起 CDMA 读/写请求并控制 matmul 启停。 - FFT/ML-KEM 共用
0xbf400000窗口,由fft_mlkem_axi_slave依据偏移分发。