微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > xilinx PCIe 启动DMA传输死机问题

xilinx PCIe 启动DMA传输死机问题

时间:10-02 整理:3721RD 点击:
求助各位大神,本人使用K7 开发了一块PCIe板卡,DMA是自己开发的,目前出现的问题是:
如果只启动DMA写操作,PC机驱动不查询板卡BAR空间寄存器(即板卡不需要回复CPLD包),PC机不会死机(其中DMA所写到内存的数据也是正确的),但是一旦PC机定时查询BAR,那么PC机就会死机,此时发现板卡PCIe core的tx_buf_av已经为0(即发送buffer已经耗尽),用户构建的TLP包就无法发送出去了(此时也无法回复CPLD包),不知道什么原因造成了tx_buf_av突然就将为0了呢,有人说过没有进行流控,但是不知道如何进行流控呢?

软件问题VERILOG

1,检查lnk_up是否一直为高
2,在发送数据时加入tx_buf_av进行判断
3,我觉得可能是的DMA机制的问题:我们的方法是发Memory Write TLP和CPLD采用的是轮流的方式,也就是说你只有一个发送接口,但是你要控制这个发送接口轮流为这两个事务服务
4,我不知道你为什么定期查询BAR空间,我们都是用中断的方式来触发一次DMA读写的完成

首先谢谢三楼的回复,针对你提出的问题,我解释一下:
1、在问题出现前后,lnk_up信号一直为高;
2、目前DMA写操作也是采用中断形式,不过驱动响应中断后首先查询BAR其中一个寄存器(查询内存是否新的数据),如果存在新的数据,就取走数据,否则不进行操作(目前的DMA为Block DMA形式,而非SG DMA)


看描述第3点出问题的概率极大
补充一点,出口检测有没有发错误格式的包

目前的实现机制也是DMA写和回复CPLD包轮训的形式进行的,抓取的发送TLP包,未发现异常包,但是在出现异常的时候,PCIe core 在接收到发送TLP后,tx_buf_av会一直减少,不会增加,直至为零,导致无法再发送TLP包。

刚遇到这个问题,检查后发现是max_payload_size超过对端的接受能力了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top