仅对英特尔可见 — GUID: nik1410905619848
Ixiasoft
10.5.1. ebfm_barwr规程
10.5.2. ebfm_barwr_imm处理过程
10.5.3. ebfm_barrd_wait处理过程
10.5.4. ebfm_barrd_nowt处理过程
10.5.5. ebfm_cfgwr_imm_wait处理过程
10.5.6. ebfm_cfgwr_imm_nowt处理过程
10.5.7. ebfm_cfgrd_wait处理过程
10.5.8. ebfm_cfgrd_nowt处理过程
10.5.9. BFM配置处理过程
10.5.10. BFM共享存储器访问处理过程
10.5.11. BFM日志和消息处理过程
10.5.12. Verilog HDL格式化函数
仅对英特尔可见 — GUID: nik1410905619848
Ixiasoft
8.3. 同时间读写DMA的软件编程
按以下步骤编程实现DMA同时传送:
- 为Read和Write DMA描述符列表分配 PCIe* 系统存储大小。例如,每个列表最多支持128个,8-DWORD描述符和128个,1-DWORD状态条目,总共1152个DWORD。则用于Read和Write DMA描述符列表的总存储大小为2304个DWORD。
- 分配 PCIe* 系统存储并通过Read Data Mover要读取的数据将其初始化。
- 为Write Data Mover分配 PCIe* 系统存储以写入。
- 为读DMA描述符列表创建所有描述符。逐步分配DMA Descriptor ID,从0开始,最多到127。对于读DMA来说,源地址是步骤2中分配的存储器空间。目的地址是Read Data Mover写入的Avalon‑MM地址。以DWORD为单位指定DMA长度。每个描述符传送相邻存储内容。假设用于Read DMA的基地址为0,以下约束说明一个读描述符的构成:
- RD_LOW_SRC_ADDR = 0x0000(PCIe系统存储器中读描述符列表的基地址。)
- RD_HIGH_SRC_ADDR = 0x0004
- RD_CTRL_LOW_DEST_ADDR 0x0008
- RD_CTRL_HIGH_DEST_ADDR = 0x000C
- RD_DMA_LAST_PTR = 0x0010
写RD_DMA_LAST_PTR寄存器开始操作。 - 关于Write DMA,源地址是Write Data Mover模块应读取的Avalon‑MM地址。目的地址是步骤3中所分配的 PCIe* 系统存储空间。以DWORD为单位指定DMA大小。假设用于Write Data Mover的基址为0x100,以下约束说明写描述符的构成:
- RD_LOW_SRC_ADDR = 0x0100( PCIe* 系统存储器中读描述符列表的基地址)
- WD_HIGH_SRC_ADDR = 0x0104
- WD_CTRL_LOW_DEST_ADDR 0x0108
- WD_CTRL_HIGH_DEST_ADDR = 0x010C
- WD_DMA_LAST_PTR = 0x0110
写WD_DMA_LAST_PTR寄存器开始操作。 - 为提高吞吐量,Read DMA模块在操作开始之前就将描述符列表复制到Avalon-MM存储器。通过写Descriptor Table Base (Low)和(High)寄存器指定存储器地址。
- 为每个WD_DMA_LAST_PTR或RD_DMA_LAST_PTR完成发送一个MSI中断。这些完成会对Update位进行更新。然后主机软件可通过读Update位来确定已完成的DMA操作。
注: 如果读DMA的传送大于最大读请求,则Read DMA创建多个读请求。例如,若最大读请求为512字节,Read Data Mover会将一个4 KB读请求分成8个不同标记的8个请求。读完成(Read Completion)可以任意顺序返回。Read Data Mover的Avalon-MM主端口将读完成中的已接收数据,按照完成过程中的接收顺序写入 Avalon® -MM存储器中正确位置。该顺序不一定增加地址顺序。因为数据mover中没有内部重排序缓冲器。如果系统允许无序读完成,则最后一个条目仅在编号上为最新,但时间顺序上可能早于其他完成。