DataMover
参考链接
一、IP简介
1.什么是DataMover
什么是DataMover?简单从字面意义理解,就是数据搬运,实际来讲,DataMover是DMA(Direct Memory Access,直接内存访问)的一种。即在数据存储中,DMA可以在不需要CPU干预的情况下下,就可以进行数据的搬移,包括但不限于数据从外部存储(DDR)搬运到内部存储(寄存器),或者反之。
DataMover是DMA的一种,和DMA的区别在于,DMA还是由CPU来分配任务的,但是DataMover是FPGA通过逻辑命令总线(cmd)发出命令进行数据搬运。
2.DataMover的端口
和DMA类似,DataMover也分读写端口,下图分别为读写通道的接口示意图:
以读通道为例,可以看到DataMover共有4路AXI4(AXIS)接口,其中Status为状态输出端口,一路AIXS接口为发布命令接口,一路AXIS数据输出接口(即从DDR中取出的数据)以及一路AXI4接口。
当通过DataMover读取外部存储设备(例如DDR)的数据时,都是通过AXI4接口访问的。DDR在FPGA上是以MIG IP方式访问,除了提供Native接口方式访问外,还提供一个AXI4 Slave接口。可以将DataMover的Master接口连接到MIG的Slave接口上进行数据读写。
3.DataMover的命令
DataMover是由逻辑进行控制, 控制方式即为通过控制AXIS_CMD总线输入命令。
DataMover命令实际就是操作IP读写操作的起始地址,传输字节长度。命令格式如下图所示:(一般地址宽度为32bit,即命令长度72bit);
这段命令长度实际为80bit,多了高8bit,具体含义参见pg022;
通常只需关注这些关键字段:
-
BTT:Byte to Transfer:传输字节长度;
-
SADDR: start address:起始地址;
-
Type: 突发传输类型,这个字段在过去的 IP 核版本中没有启用(ISE 时代),默认为 incr;
- 字段为1时,突发传输类型为 incr ,数据会保存在以起始地址开始递增的地址中;
- 字段为 0 时:突发传输类型为 fixed, 数据均保存在起始地址中,覆盖旧值;
-
EOF:帧尾标志,通常设置为1
4.DataMover的状态输出
上文说到有1路AXIS为状态输出端口,STS接口传输的是DataMover 对每次传输,即每个传输命令的完成情况。通过 sts 接口我们可以判断传输的成功与否,或者失败的原因。
STS接口的数据通常为8bit,这8bit分别用于表示成功和失败的原因:
低4bit的TAG用于标识是哪次命令的响应结果,最高位为1表示此次传输成功,剩下3bit为1表示不同的失败原因:
Slave Error 代表从机错误,DataMover 从 AXI 总线的回复信号中读取到从机发送的 response error 信号,再将其回复给发起传输的命令。
Internal Error 这类问题一般是由于命令中的 BTT (Byte to Transfer) 传输字节数字段与 s2MM 总线中实际发送的数据不一致导致的。
命令中的 BTT 字段也会造成内部错误,当 BTT 字段为 0 时,触发 internal error。
5.监控DataMover的传输状态
通常情况下,正式工程中仅仅只是对STS的信号进行简单的检测,但是DataMover比较特殊的是当产生多次错误时,DataMover IP会置低命令总线上的cmd_tready信号,拒绝后续的命令以及产生新的传输,因此可以在设计中添加一个状态监控信号:
datamover_cmd_err = ~cmd_tready && cmd_tvalid
这条命令是指当逻辑希望产生传输命令请求,但IP始终拒绝接受情况下,此时说明DataMover已经出了问题,当然IP还有两个端口:s2mm/mm2s_err
,当此信号置高时,也代表传输出错。
DataMover 的错误状态,只能通过 AXI 总线上的 arest_n 信号清除。