首页 菜鸟5小时速成FPGA_PCIE设计高手教程

菜鸟5小时速成FPGA_PCIE设计高手教程

举报
开通vip

菜鸟5小时速成FPGA_PCIE设计高手教程 PCIe Solutions on Xilinx FPGAs 初学者指南初学者指南初学者指南初学者指南 V1.0 hanson@comtech.com.cn PCIe on Xilinx 初学者指南 ............................................................................................................... 1 前言.....................................

菜鸟5小时速成FPGA_PCIE设计高手教程
PCIe Solutions on Xilinx FPGAs 初学者指南初学者指南初学者指南初学者指南 V1.0 hanson@comtech.com.cn PCIe on Xilinx 初学者指南 ............................................................................................................... 1 前言........................................................................................................................................... 1 步步为营 ................................................................................................................................... 3 一,PCIe 层次结构 .......................................................................................................... 3 事物 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 ........................................................................................................................... 3 头标 ................................................................................................................................... 4 BAR 空间 ........................................................................................................................... 6 中断 ................................................................................................................................... 7 二,器件选型 ................................................................................................................... 9 三,仿真环境搭建 ........................................................................................................... 9 四,调试 ......................................................................................................................... 14 五,驱动编写 ................................................................................................................. 15 六,总结 ......................................................................................................................... 16 进阶......................................................................................................................................... 22 DMA 模式 ....................................................................................................................... 22 DDR 缓冲......................................................................................................................... 23 经验、教训总结 ............................................................................................................. 24 前言前言前言前言 北京奥运会那年接手了一个项目,需要将远程的 80MBps 的数据量传输到服务器,同时 不能占用太多的处理器时间,因为服务器上同时运行着一套大型数据库软件。最后排除了 USB 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 、以太网方案,选用 Xilinx 的 PCIe 解决方案。经过漫长的摸索、学习过程,最后项 目做成功的做完了,各种指标参数也都达到了。再后来做 FAE,见识了更多的 PCIe 应用,也 有幸结识了更多的开发工程师。有的对 PCIe 的理解非常深入了,无论在性能和功能上都达 到相当的深度;有的也和我原来一样,刚开始学习理解 PCIe 的应用,看书、看文档,有时 候迷茫的找不到如何下手。对于前一种高手,这篇应用笔记可以略过了;对于后一种正在做 产品、项目的工程师,希望能对您有所帮助。 什么时候需要用到什么时候需要用到什么时候需要用到什么时候需要用到 PCIe???? 首先需要定位的是什么时候需要用到 PCIe 的问题。(PCIe 是什么这里就不做介绍了,不 然冗长的像写 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 了。) 翻开电脑(台式机),主板上可以清晰的看到常用的接口,能和外面连接的插槽主要有: USB、Ethernet、PCIe、PCI、SATA/PATA、Audio、VGA/DVI/HDMI,UART/并口。其中 Audio、 VGA/DVI/HDMI 制作专用数据输出,UART/并口的速率摆在那里,不适合高速数据传输,剩 下的接口最大吞吐率最大吞吐率最大吞吐率最大吞吐率如下: 接口 最大速率 USB USB2.0 480Mbps, USB3.0 5Gbps(USB2.0 速率的 10 倍) Ethernet 1Gbps PCIe X8 Gen1 双向各 16Gbps,X8 Gen2 双向各 32Gbps PCI 2.112Gbps@66Mhz*32 位 SATA/PATA SATA II 3.0Gbps, SATA III 6.0Gbps 排除协议开销,OS 开销,平常使用中 USB 能达到的速度 USB2.0 一般在 30-40MB;Ethenet 如果用硬件实现较低层次的协议在 70-80MBps;PCI 有 64 位的,但是普通 PC 或服务器一般 是 32 位的,见过效率发挥的较好的能达到 120MB,但是 PCI 是共享总线的,如果总线有多 个设备开销,这个速度就难保证了;SATA/PATA 在 PC 中一般用于存储,用于自定义设备的 很少见。因此,如果数据量超过 100M,那 PCIe 最合适了。 速度是一方面考虑的原因,能否快速实现(有无成熟的设计方案),并且产品稳定、可 靠是另外一个需要考虑的原因。 USB 有 Cypress 的 USB2.0 芯片,然后将总线接到 FPGA 上。网上有很多 USB 芯片的程 序、驱动程序,甚至有公开的 GUI 程序,可以方便的完成 FPGA 到 PC 的通讯。 Ethernet 以太网也是比较成熟的接口。FPGA 外接 PHY 就可以和 PC 通讯了。以太网的 协议非常复杂,FPGA 如果内部运行 CPU 加以太网协议栈,那可以支持高层的以太网协议, 但是这样速度就打折扣了,并且 FPGA 的开发难度也增加很多。如果只实现 MAC 层数据收 发,难度相对简单一些。 开发难度开发难度开发难度开发难度: PCI PCI 卡的方案也比较成熟了,既可以用 PLX 公司的桥片+FPGA 的方案,也可以直接 用 FPGA 接 PCI IP 核的方式。PCI 经过长时间的积累,已经有相当多的上层和底层设计、调试 软件,如果是购买的桥片,还有配套的开发工具简化设计流程。 SATA/PATA 通过 SATA/PATA 接口和 PC 进行数据通讯的方案比较少见,有 Intelliprop 一 些列的 SATA Device IP Core,同时提供一些底层的软件支持。 PCIe PCIe 的方案种类延续了 PCI 的多样性。1,完全采用 FPGA 方案。Xilinx 早在 10 年 前就把 PCIe 作为重要的支持方向,在高、中、低端 FPGA 内都集成有免费的 PCIe 硬核,同 时提供了数种源码(包括驱动、软件)开放的参考设计,还有丰富的文档。无论是学习、还 是产品设计,都能在众多的资料中找到相关的信息,减少设计、调试的时间(例如,Xilinx 的 PCIe 用户手册,xapp1052 DMA 参考设计,PIO 参考设计)。2,采用桥片方案,例如 PLX,IDT 等芯片,然后将转换的局部总线接入 FPGA。 研发产品需从多方面考虑,成本、可靠性、兼容性、性能等。单片 FPGA 方案越来越多 的应用在各种产品的研发中。如果确定需要使用 FPGA 的 PCIe 方案,而此时对这一流程比较 迷茫,那希望这篇指南能对您有所帮助。 步步为营步步为营步步为营步步为营 PCIe 相关知识 引用 Wiki http://zh.wikipedia.org/zh-cn/PCI-E,简单介绍 PCIe 的基本特性,其他不理解的 没关系,要么等一个流程下来自然而然明白了,要么…就不需要知道(Xilinx 封装好了)。 Wiki 上列出各版本 PCIe 的链路速度,通道数。说白了,链路速度高,单位时间内传输 的有效数据多;通道数多,同时传递的数据多。此外,还有很给力的一点就是兼容,板卡和 主板自适应的匹配到最大的链路速度和通道数。也就是说,如果这个板卡只支持 PCIe1.1 x8, 放在支持PCIe2.0 x16的槽上,那两端会是应在PCIe1.1 x8的速率上;如果有一天板卡升级了, 到 PCIe2.0 x8,那主板会适应成 PCIe2.0 x8 上,并且 PC 上的驱动和软件都不用变化。 接下来有点晦涩了,但是建议耐着性子看完吧。 一,PCIe 层次结构 PCIe 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 对于设备的设计采用分层的结构,有事务层、数据链路层和物理层组成,各层有都 分为发送和接收两功能块。 在设备的发送部分,首先根据来自设备核和应用程序的信息,在事务层形成事务层包(TLP), 储存在发送缓冲器里,等待推向下层;在数据链路层,在 TLP 包上再串接一些附加信息,这 些信息是对方接收 TLP 包时进行错误检查要用到的;在物理层,对 TLP 包进行编码,占用链 路中的可用通道,从查封发送器发送出去。1 事务层包(TLP),数据链路层包(DLLP),物理层(PLP)产生于各自所在层,最后通过电或 光等介质和另一方通讯。这其中数据链路层包(DLLP),物理层(PLP)的包平常不需要关心, 在 IP 核中封装好了。在 FPGA 上做 PCIe 的功能,变成完成事务层包完成事务层包完成事务层包完成事务层包((((TLP))))的处理的处理的处理的处理。 事物协议 上面提高过,用 FPGA 实现需要的 PCIe 功能,简单的说是在完成 TLP 的处理。TLP 有三部分 组成,帧头、数据、摘要(或者称 ECRC)。TLP 头标长 3 或者 4 个 DW,格式和内容随事物 类型变化;数据端为 TLP 帧头定义下的数据段,如果该 TLP 不携带数据,那该段为空。Digest 段(Optional)是基于头标、数据字段计算出来的 CRC,成为 ECRC,一般 Digest 段有 IP 核填 充。所以,PCIe 的处理在用户层表现为处理 TLP 中头标和数据段。 图 1 TLP结构 头标定义定义定义定义 图 2 TLP头标中的通用字段 TLP 头标长 3DW(Double Word,32bit)或者 4DW,格式和内容虽事物类型变化。上图示 出了头标的通用字段, Fmt 是关于头标长度和该 TLP 是否有数据在和的信息:00=3DW 头标,无数据;01=4DW 头标,无数据;10=3DW,有数据;11=4DW 有数据。 Type 的 5 位编码与 Fmt 字段一起用于规定事物类型、头标长度和是否有数据载荷。如 下表所示: TLP FMT[1:0] TYPE [4:0] Memory Read Request (MRd) 存储器读请求 00 = 3DW, no data 01 = 4DW, no data 0 0000 Memory Read Lock Request (MRdLk) 锁定存储器读请求 00 = 3DW, no data 01 = 4DW, no data 0 0001 Memory Write Request (MWr) 存储器写请求 10 = 3DW, w/ data 11 = 4DW, w/ data 0 0000 IO Read Request (IORd) IO 读请求 00 = 3DW, no data 00010 IO Write Request (IOWr) IO 写请求 10 = 3DW, w/ data 0 0010 Config Type 0 Read Request (CfgRd0) Type 0 配置读请求 00 = 3DW, no data 0 0100 Config Type 0 Write Request (CfgWr0) Type 0 配置写请求 10 = 3DW, w/ data 0 0100 Config Type 1 Read Request (CfgRd1) Type 1 配置读请求 00 = 3DW, no data 0 0101 Config Type 1 Write Request (CfgWr1) 10 = 3DW, w/ data 0 0101 Type10 配置写请求 Message Request (Msg) 消息请求 01 = 4DW, no data 1 0 rrr* Message Request W/Data (MsgD) 带数据的消息请求 11 = 4DW, w/ data 1 0rrr* Completion (Cpl) 完成 00 = 3DW, no data 0 1010 Completion W/Data (CplD) 带数据的完成 10 = 3DW, w/ data 0 1010 Completion-Locked (CplLk) 锁定完成 00 = 3DW, no data 0 1011 Completion W/Data (CplDLk) 带数据的锁定完成 10 = 3DW, w/ data 0 1011 表 1 TLP Header Type and Format Field Encodings � Non-Posted & Posted 如果设备发起端发出一个 Non-Posted 请求,在一定时间后,接收端需要回复一个完成包给 发起端,如果不回复可能会遇到特别的情况,例如蓝屏。 Posted 请求就好理解了,不需要回复完成包给发起端。 Transaction Type Non-Posted or Posted Memory Read Non-Posted Memory Write Posted Memory Read Lock Non-Posted IO Read Non-Posted IO Write Non-Posted Configuration Read (Type 0 and Type 1) Non-Posted Configuration Write (Type 0 and Type 1) Non-Posted Message Posted 表 2 PCI Express Non-Posted and Posted Transactions2 � Xilinx 例程 用 Coregen 生成的 PCIe 控制器,默认有一个 PIO 的参考设计,其中包含能够直接用于仿真 的脚本,这里就用 Xilinx PCIe 附带的 PIO 例子解释如何处理上面的 TLP 事物。这里的例子采 用的 LocalLink 接口,信号定义或使用方法参考 ug517,开发 PCIe 的应用,就相当于使用 LocalLink 接口发送或者相应 TLP 事物。 在左下框,sof 代表帧的开始,eof 代表帧的结束,收到的帧数据为 0x0000_0001_01a0_0a0f, 0x0000_0010_de03_7320 , rem_n 为高代表后面最后一个 DW 是无效的,因此,收到的完 整的帧为 0x0000_0001_01a0_0a0f_0000_0010 。按照上述包格式分析,Fmt 是 2’b00,Type 是 5’b0000,接收的是 Non-Posted 3DW 存储器读请求包(MRd)(具体请求的是什么下文 再讲)。既然是 Non-Posted 的请求包,就需要有完成包作为回复。 在右上框,发送的数据帧数据为 0x4a00_0001_01a0_0004,0x01a0_0a10_0403_0201。Fmt 是 2’b10,Type 是 5’b01010,判断为 3DW 带数据的完成包,0x4a00_0001_01a0_0004_ 01a0_0a10 是头标,0x0403_0201 是所带的数据。 PCIe 设计很大一部分工作就是判断 RX 收到什么 TLPs,通过 TX 发送什么样的 TLPs。有时候 发现异常,分析这些最基本的 TLP 包结构是非常有效的诊断方式。 BAR 空间空间空间空间 上面讲到 PCIe 通讯是靠发送 TLP 包,如果再进一步参考了 PCIe 更详细的书籍就能发现读写 包里都有地址信息。如果板卡向 PC 发送 TLP 包,例如 MWr 包,那很好理解,地址信息就是 PC 的物理地址(注意这里说的是物理地址);如果是 MRd 包,那 PC 收到后回复一个完成包, 板卡从完成包分析出数据即得到 MRd 读取地址的数据。那 PC 如何读写板卡的数据呢? 简单的解释,PC 启动是,BIOS 探测所有的外设。对 PCIe(PCI)设备来说,BIOS 检测 工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训 到板卡 有多少个 BAR 空间,每个空间有多大,然后对应为这些 BAR 空间分配地址。对 PC 设备来说, 它能“看”到 PCIe 板卡的空间只有 BAR 空间,也就只能访问这些 BAR 空间。也就是说,板 卡可以发送合法的 PCIe TLP 包,并得到 PC 端的相应;但是 PC 端访问板卡被局限在 BAR 空 间。例如,下图是 Realtek 网卡的 BAR 空间分配图:该网卡有 3 个 BAR 空间,BAR0、BAR2、 BAR4,BAR0 空间配置为 I/O 空间,BAR2 和 BAR4 配置为 Memory 空间。 图 3 Realtek网卡的 BAR空间 图 4 Realtek网卡 Memory空间大小 图 5 Realtek网卡 IO空间大小 从上两幅图来看,BAR2 空间大小为 0x1000,在 PC 的其实地址为 0xFDEF_F000;BAR4 空间 大小为 0x4000,起始地址为 0xFDEF_8000;BAR0 空间为 0x100,其实地址为 0x0000_DE00。 大小在接口芯片中已经定义好了,而起始地址在不同的 PC 上分配的地址是不同的,但是偏 移地址相同,访问板卡的效果就是相同的。例如,假设需要访问该板卡BAR2空间的地址0x80, 在 PC 上访问 0xFDEF_8080 就对应读写 BAR2 空间的 0x80 地址了。 在 FPGA 中,BAR 空间的设置根据用户逻辑设计的需求来定义大小。假设我们需要和上面网 卡相同的设置,PCIe 核定制的时候就可以按照下列的选项: 图 6 PCIe核 BAR空间设置 中断中断中断中断 做过嵌入式和工程师应该对中断有较深的理解,中断处的调试相对于 BAR 空间也复杂 一些。 PCIe 可以发出两种中断,一种是虚拟 INTx 信号线的,一种是 MSI 的。 过去 PCI 板卡发送中断通过拉低 INTx(INTA#,INTB#,INTC#,INTD#)来申请中断,PC 检测到 INTx 的中断,就跳转执行 INTx 对应的中断驱动程序,驱动程序里需要操作板卡 将 INTx 拉回去,不然就发生嵌套中断了。用下面两个时序图来解释 INTx 中断,收到的 数据包内容为 0x3400_0000_0100_0020, 0x0000_0000_0000_0000,根据事物协议的章节 分析该包,Fmt 为 2’b01,Type 为 5’b10100,是消息请求,Message Code 为 8’b0010_0000, 是中断(INTx)消息。根据下图可以看到 received_assert_inta 为 1,收到 INTA#中断了。 图 7 INTA# Assert 收到 INTA#中断后的处理程序需要将 INTA#拉高,如下图,收到的数据包内容为 0x3400_0000_0100_0024, 0x0000_0000_0000_0000,Fmt 为 2’b01,Type 为 5’b10100,是消 息请求,Message Code 为 8’b0010_0100,是中断( INTx)撤销消息。下图可以看到 received_deassert_inta 为 1,收到 INTA#中断撤销消息。 图 8 INTA# Deassert MSI 是基于消息机制的,PC 启动后为 PCIe 板卡分配一个或多个消息地址,板卡发送中 断只需要向对应的地址内发送消息即可。消息内容中包含消息号,每个消息号对应在 PC 端的某一地址。 对比两种方式,INTx 是模拟 PCI 上中断线,MSI 是基于消息机制的。具体更细节的内容 可以参考文献。需要注意的是,Windows XP 是不支持 MSI 的,到了 WinNT 和 Win7 才 支持。 Xilinx 的 PCIe 支持 INTx 和多达 256 条的 MSI 消息。有人担心了,组织这些中断包发送, 那设计会不会很复杂?在 Xilinx 的平台上,中断和其他包是分开的,中断发送是非常简 单的,并不需要用到 LocalLink 的 TX 接口,只需要简单操作几条信号线就可以实现,具 体可参考对应 PCIe Core 的手册,例如 V6 就可以参考 UG517。中断只需要操作 5 条信号 线,PCIe 核就可以自己组织需要的中断包向外发送。 二二二二,,,,器件选型器件选型器件选型器件选型 Xilinx 在 Virtex 5 系列,Virtex 6 系列,Spartan 6 系列,还有刚刚发布的 7 系列 FPGA, Zynq-7000 系列都有 PCIe 的硬核 IP Core。各系列支持的 PCIe 硬核的速度分别为: Product Name FPGA Architecture User Interface Width Lane Widths Supported Link Speeds Support PCI Express Base Specification Compliance 8-lane Virtex-5 64 x1, x2, x4, x8 2.5 Gb/s V1.1 1-lane Spartan-6 32 x1 2.5 Gb/s V1.1 8-lane Virtex-6 64, 128 x1, x2, x4, x8 2.5 Gb/s, 5.0 Gb/s V2.0 4-lane Artix-7 64 X1, x2, x4 2.5 Gb/s, 5.0 Gb/s V2.0 8-lane Kintex-7 64,128 x1, x2, x4, x8 2.5 Gb/s, 5.0 Gb/s V2.0 8-lane Virtex-7 64, 128, 256 x1, x2, x4, x8 2.5 Gb/s, 5.0 Gb/s, 8.0 Gb/s V3.0 表 3 个系列支持的 PCIe硬核规格 在决定设计的时候,就需要综合考虑成——选择芯片的系列、容量、速度等级;所需 PCIe 的速——选择 PCIe 最大的带宽;产品的无缝升级性——考虑位宽的变化对设计带来的影响 等。 三三三三,,,,仿真环境搭建仿真环境搭建仿真环境搭建仿真环境搭建 有时候接到 PCIe 方面的电话,问题是:我那边一个 FIFO 产生数,通过 PCIe 发到电脑上 来,为啥最后(第一个)数据总是错误的?或是,我明明写 DMA 开始的寄存器了,怎么感 觉板卡什么数据都没发呢?我用 Chipscope 抓数据,FPGA 太小了,抓的长度不够怎么办? 这些问题我都只能回答一个方法,先把仿真环境搭建起来吧。 从我自己做 PCIe 的设计来说,大部分时间都在设计->仿真->修改->仿真中,即使遇到需 要用 Chipscope 捕捉数据,那也是捕捉到仿真中没有考虑到的数据包,然后修改仿真激励, 然后在仿真中复现刚才捕捉到的错误,然后再考虑修改设计。所以说做 PCIe 的设计,仿真 是 too important to emphasis. 在 Xilinx 的平台,已经有完整的仿真平台框架了,在 PCIe 的用户手册中也有相当长的篇 幅讲仿真。仿真平台的作用就是模拟一个设备,如果编写的是 PCIe 的 Device 设备,那就需 要仿真出一个 Root Complex(可以理解为 PC 机);如果编写的是 Root Complex(例如, FPGA 做主操作一个 PCIe RAID 卡),那就需要仿真出一个 Device 设备。这里简单介绍一下 我用过的仿真。 1,Xilinx 的 DSPORT 用 Coregen 生成一个 PCIe 的工程,在 simulaion/dsport 中即是 DSPORT 的开源代码。该 仿真搭建起一个框架,已经完成了很多的发包、检测包等功能。例如,下面定义的 TASK 是 Type0 的配置读请求: /************************************************************ Task : TSK_TX_TYPE0_CONFIGURATION_READ Inputs : Tag, PCI/PCI-Express Reg Address, First BypeEn Outputs : Transaction Tx Interface Signaling Description : Generates a Type 0 Configuration Read TLP *************************************************************/ task TSK_TX_TYPE0_CONFIGURATION_READ; input [7:0] tag_; input [11:0] reg_addr_; input [3:0] first_dw_be_; begin if (trn_lnk_up_n) begin $display("[%t] : Trn interface is MIA", $realtime); $finish(1); end TSK_TX_SYNCHRONIZE(0, 0); trn_td <= #(Tcq) { 1'b0, // Researved Field 2'b00, // Fmt 5'b00100,// Type 1'b0, 3'b000, 4'b0000, 1'b0, 1'b0, 2'b00, 2'b00, 10'b0000000001, // 32 COMPLETER_ID_CFG, tag_, 4'b0000, first_dw_be_ // 64 }; trn_tsof_n <= #(Tcq) 0; trn_teof_n <= #(Tcq) 1; trn_trem_n <= #(Tcq) 0; trn_tsrc_rdy_n <= #(Tcq) 0 ; TSK_TX_SYNCHRONIZE(1, 0); trn_td <= #(Tcq) { COMPLETER_ID_CFG, 4'b0000, reg_addr_[11:2], 2'b00, 32'b0 }; trn_tsof_n <= #(Tcq) 1; trn_teof_n <= #(Tcq) 0; trn_trem_n <= #(Tcq) 8'h0F; trn_tsrc_rdy_n <= #(Tcq) 0 ; TSK_TX_SYNCHRONIZE(1, 1); trn_teof_n <= #(Tcq) 1; trn_trem_n <= #(Tcq) 0; trn_tsrc_rdy_n <= #(Tcq) 1; end endtask // TSK_TX_TYPE0_CONFIGURATION_READ 对照着事物协议将的内容,这个 TASK 组织了一个 Fmt=2’b00, Type=5’b00100 的包,TASK 中需要数据 Tag 和需要读取配置空间的地址 Addr。 在 pci_exp_expect_tasks.v 中定义有接收包的 TASK,例如下面就是等待接收 MRd 包的 TASK。 /************************************************************ Task : TSK_EXPECT_MEMRD Inputs : traffic_class, td, ep, attr, length, last_dw_be, first_dw_be, address Outputs : status 0-Failed 1-Successful Description : Expecting a memory read (32-bit address) TLP from Rx side with matching header fields *************************************************************/ task TSK_EXPECT_MEMRD; input [2:0] traffic_class; input td; input ep; input [1:0] attr; input [9:0] length; input [15:0] requester_id; input [7:0] tag; input [3:0] last_dw_be; input [3:0] first_dw_be; input [29:0] address; output expect_status; reg [2:0] traffic_class_; reg td_; reg ep_; reg [1:0] attr_; reg [9:0] length_; reg [15:0] requester_id_; reg [7:0] tag_; reg [3:0] last_dw_be_; reg [3:0] first_dw_be_; reg [29:0] address_; integer i_; reg wait_for_next; begin wait_for_next = 1'b1; //haven't found any matching tag yet while(wait_for_next) begin @ rcvd_memrd; //wait for a rcvd_memrd event traffic_class_ = frame_store_rx[1] >> 4; td_ = frame_store_rx[2] >> 7; ep_ = frame_store_rx[2] >> 6; attr_ = frame_store_rx[2] >> 4; length_ = frame_store_rx[2]; length_ = (length_ << 8) | (frame_store_rx[3]); requester_id_= {frame_store_rx[4], frame_store_rx[5]}; tag_= frame_store_rx[6]; last_dw_be_= frame_store_rx[7] >> 4; first_dw_be_= frame_store_rx[7]; address_[29:6] = {frame_store_rx[8], frame_store_rx[9], frame_store_rx[10]}; address_[5:0] = frame_store_rx[11] >> 2; $display("[%t] : Received MEMRD --- Tag 0x%h", $realtime, tag_); if(tag == tag_) //find matching tag begin wait_for_next = 1'b0; if((traffic_class == traffic_class_) && (td === td_) && (ep == ep_) && (attr == attr_) && (length == length_) && (requester_id == requester_id_) && (last_dw_be == last_dw_be_) && (first_dw_be == first_dw_be_) && (address == address_)) begin // header matches expect_status = 1'b1; end else // header mismatches, error out begin $fdisplay(error_file_ptr, "[%t] : Found header mismatch in received MEMRD - Tag 0x%h: \n", $time, tag_); $fdisplay(error_file_ptr, "Expected:"); $fdisplay(error_file_ptr, "\t Traffic Class: 0x%h", traffic_class); $fdisplay(error_file_ptr, "\t TD: %h", td); $fdisplay(error_file_ptr, "\t EP: %h", ep); $fdisplay(error_file_ptr, "\t Attributes: 0x%h", attr); $fdisplay(error_file_ptr, "\t Length: 0x%h", length); $fdisplay(error_file_ptr, "\t Requester ID: 0x%h", requester_id); $fdisplay(error_file_ptr, "\t Tag: 0x%h", tag); $fdisplay(error_file_ptr, "\t Last DW byte-enable: 0x%h", last_dw_be); $fdisplay(error_file_ptr, "\t First DW byte-enable: 0x%h", first_dw_be); $fdisplay(error_file_ptr, "\t Address: 0x%h", address); $fdisplay(error_file_ptr, "Received:"); $fdisplay(error_file_ptr, "\t Traffic Class: 0x%h", traffic_class_); $fdisplay(error_file_ptr, "\t TD: %h", td_); $fdisplay(error_file_ptr, "\t EP: %h", ep_); $fdisplay(error_file_ptr, "\t Attributes: 0x%h", attr_); $fdisplay(error_file_ptr, "\t Length: 0x%h", length_); $fdisplay(error_file_ptr, "\t Requester ID: 0x%h", requester_id_); $fdisplay(error_file_ptr, "\t Tag: 0x%h", tag_); $fdisplay(error_file_ptr, "\t Last DW byte-enable: 0x%h", last_dw_be_); $fdisplay(error_file_ptr, "\t First DW byte-enable: 0x%h", first_dw_be_); $fdisplay(error_file_ptr, "\t Address: 0x%h", address_); $fdisplay(error_file_ptr, ""); expect_status = 1'b0; end end end end endtask 根据所需设计的 PCIe 功能的需要,可以在这些文件中添加所需要的 TASK。 2,PLDA 的 BFM PLDA(http://www.plda.com/index.php)在 ASIC 和 FPGA 的高速互联协议技术 IP Core 设 计中处于领先地位.....(我不是托,不介绍多)。他们的 PCIe 仿真简单易用,例如 `BFM.xbfm_burst (`XBFM_MRD,64'h2222222222220000,1024,databuf,3'b000,2'b00);完成了 Burst MRd TLP。 `BFM.xbfm_wait_event(`XBFM_INTAA_RCVD);完成了等待中断的事件。 该 BFM 并不开放代码,但是 PLDA 提供了详细完整的说明文档以及用例,并 且提供主流仿真工具的库。 平常见过的大部分工程师使用的仿真工具是 Modelsim。碰到 PCIe 工程仿真,一次流程 下来时间是比较长的,如果加上 DDR 等仿真,一次可能需要 15 分钟。用 Modelsim 的工程 师碰上的一个头疼的问题,没有加入 Wave 的波形看不到,无奈的 restart,再 run –all。在仿 真 PCIe 的工程时这个问题尤为明显。解决这个问题,可以试试 Google “Modelsim Debussy” 或者”Modelsim dump vcd”,前一种方法用 Debussy 保存所有到 fsdb 文件,后一种方法保存 到 vcd 文件。如果想进一步提高仿真速度,可以试试 Google “VCS verdi”。 四四四四,,,,调试调试调试调试 编写好用户逻辑处理 TLP,仿真通过,程序正常编译通过,下载到 FPGA,重启机箱, Windows 弹出寻找驱动的框,那恭喜了,板卡被检测到了。对于这种人品好的情况,可以跳 过下一段落。 有一部分没有检测到的情况,需要一步一步的排查问题了。PCIe 核用户手册中有详细讲 如何一步一步诊断,官方网站也有各种案例和调试步骤等, � 下面文章总结了一下不能识别的各种案例,你可以先参考一下。 http://www.xilinx.com/support/answers/34777.htm � 下面有一些硬件调试步骤 http://www.xilinx.com/support/answers/34151.htm � 不能识别的时候可以按照下面
本文档为【菜鸟5小时速成FPGA_PCIE设计高手教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_902600
暂无简介~
格式:pdf
大小:556KB
软件:PDF阅读器
页数:24
分类:互联网
上传时间:2012-11-28
浏览量:564