尝试Xilinx FPGA上的BUFGCE

最近在学习Firesim,其中对我自己科研很重要的一个功能便是FASED提供了Memory Timing Model的模拟。因为之前和别人合作论文曾被审稿人提出过100MHz FPGA使用1600MHz的内存,使得内存的延迟非常低,其性能表现像是一个大的LLC Cache而不是真实的内存,导致访存性能与真实ASIC上实际使用存在差异,但对于我目前的某个科研项目来说,真实的访存性能非常重要,为了防止重蹈覆辙,决定学习一些先进仿真技术。 然而我们不难想到,模拟一个真实的Memmory Timing Model离不开整个RTL的暂停,这一功能对于Firesim实现在其MIDAS(Golden Gate)中,在FPGA物理上我们考虑两种做法: 关掉寄存器的CE 使用Clock Gating的方式关闭时钟,使其部分停止运行 其中,不难想到1会导致非常多的fanout问题(一般FPGA对Clock的fanout有特殊处理,和逻辑资源不同),而2则是在ASIC中节能的一种方式,也是最为常见的RTL暂停方法,同样MIDAS也是这么使用的。由于我过去没有自己写过BUFGCE,因此很好奇其具体Implementation的样子,因此做了一个尝试。 首先写了一个简单的counter模块: module counter( input clock,…

DDR4与HBM在UltraScale+ HBM上的IOPS测试

最近一个科研idea需要measure一些内存器件的latency数据,因此用FPGA对主流的内存器件的访问Latency进行了一个调研,诚然这样的结果和FPGA上具体Memory Controller的IP实现有关,但也可以作为一个参考,相信Xilinx的实现。 实验基于浪潮F37X FPGA卡,FPGA采用与VCU128相同的vu37p,属于Xilinx Ultrascale+ HBM系列,具体型号也与VCU128完全相同,这个卡其实设计和U280非常类似,但是比U280多了一个通道的DDR4也多了8GB存储容量,个人觉得还是一个比较不错的卡(但可惜不好买,我在闲鱼上买还遇到了奸商,买两张确认收货后发现有一张卡综合后的bit流如果有逻辑分布在指定bank就会有问题,结果卖家不懂FPGA也不认,巨大亏损)。 vu37p本身有2个4GB的HBM,Xilinx官方介绍其拥有460GB/s的bandwidth,我使用的这张FPGA卡也拥有3通道的72bit DDR4 2400 8GB内存(额外8bit用于ECC),一共24GB容量。 测试代码 为了做这个测试,我自己写了一个名为axi_iops的小项目,位于github.com:cyyself/axi_iops.git ,纯Verilog大概200行,用于对AXI随机读性能进行测试。该测试会使用LFSR随机生成一个地址,然后按照用户给定的arlen,arsize去发送请求。 在这个代码中,我们重点关注以下几个IO: module axi_iops #( parameter…

让Thunderbolt可以使用更大的BAR

问题描述 在Xilinx 7-Series FPGA上用AXI Memory Mapped to PCI Express IP核设置了一个256M的BAR,这个BAR直接连接到主板的PCIe上可以正常进行MMIO,但将FPGA通过Thunderbolt硬盘盒+M.2转PCIe连接到Thunderbolt上却无法使用。 通过查阅dmesg可观测到如下报错信息: [ 246.677146] pci 0000:0c:00.0: BAR 0: no…

在Xilinx FPGA上搭建SoC

背景 之前出于科研需求和龙芯杯比赛需求都自己搭建过SoC来运行CPU软核,整理一下我的搭建SoC的流程。以下的讨论基于MIPS和RISC-V两种软核ISA为例。 大家也可以参考我搭建的两个SoC以及对应的软件: cyysoc (RISC-V Rocket+Coherent DMA) pblaze_soc 某大船SSD上的xc7k325t-2 FPGA+2G 72bit DDR3 ECC 用了某个PCI-E引出到SFP接口的扩展板,连接光模块/电口模块提供网络 PCI-E和SFP的IO在FPGA上都是GTX 用了某个该板子的IO接口转USB UART的扩展板 扩展板上面还有rgmii…

修网(AXI Ethernet)

故障现象 今日发现我之前搭建的基于Rocket Chip的SoC,在U-Boot中网卡工作,但Linux中网卡一直无法工作。并发现经常在Linux中使用ip link set eth0 up在看到dmesg输出3行网卡开启信息后系统就卡死,并在reset核心后U-boot(XIP)载入到开始访问DRAM的位置就停下。看起来像是AXI总线上(因为我没有进行Reset)有请求在我reset期间没有完成,这大概可以说明AXI总线上发了一些核的Slave无法处理的请求。 起初我怀疑问题有一部分和中断有关,因为U-Boot没有使用中断,但通过检查/proc/interrupts发现连接在PLIC上两个网卡的中断号都能在set eth0 up后出现多次中断。然后看了下Linux的Documentation中的设备树相关部分,发现我的网卡中断和DMA中断设置不对(要求把DMA中断也放在网卡中断中,但实测是等价的),修改后问题依旧,按照一个别人能工作的设备树写法修改后问题依旧。 而继续搜索相关资料发现,别人遇到的问题多数都是PHY相关。然而我使用的是SFP接口的1000BaseX,AXI Ethernet会自己实例化一个PHY,并不是外置的。 解决方法 后来我对比了我的SoC和别人的SoC,发现我拖出来的AXI DMA IP核的Memory Map Data…

Xilinx Block Memory Generator踩坑小记

最近在用Verilator自研软件定义AXI Slave来实现SoC上设备的模拟,于是把Xilinx的Block Memory Generator当做了一个ground truth进行研究,于是就发现了一个会导致aw/w通道死锁的小坑。 复位后Master直接拉高awvalid和wvalid,则Slave不会拉高awready。但实际上Slave已经开始接收数据。 同时由于Block Memory Generator的AXI接口没有判断wlast是否符合要求,而Master一直到传输结束都不知道Slave已经接受了数据,导致一直没有拉高bready,就会导致aw/w通道死锁。 解决方法:Master在复位后的下个周期再进行操作。且AXI的Spec也要求Master在复位时应拉低ARVALID, AWVALID, WVALID。

Xilinx MIG的ECC内存踩坑小记

最近在某灵车7K325T FPGA上搭SoC,由于该灵车开发板有9个8bit DDR3组成72bit,因此就打算尝试一下ECC内存。 调试过程中遇到以下问题: 1. 开启ECC后init_calib_complete不拉高 init_calib_complete不拉高意味着内存train失败。最后发现是ddr3的dm信号在ECC开启时默认是关闭的,而我们需要将对应引脚手动拉低为0。修改后恢复。 2. AXI接口上的RRESP出现2’b10,即SLAVE ERROR。 在开启ECC后如果读取未曾写入的内存地址,会由于ECC bit没有更新导致出现ECC校验失败。在使用过程中确保该地址写入过即可。 神奇的是,我用Chipyard生成的BOOM核接到开启ECC的MIG上,如果跳转到一个没有写指令的地址时,Exception Code为2,即Illegal instruction,并非Instruction access fault。

新手的Vivado Block Design踩坑小记

最近在使用Vivado的Block Design搭建SoC,由于许多东西的User Guide不知道去哪找,因此在这里整理了一下自己作为新手使用Block Design踩过的坑。 1. 需要Create HDL Wrapper 在BD搭建完成后,点击右键选Create HDL Wrapper,然后就可以作为Top或是在别的模块中例化了。 2. 无法将System Verilog作为模块 遇到一个大问题就是自己写的System Verilog模块怎么都无法加入。后来查阅UG994发现直到Vivado 2021.2依然不支持将System Verilog作为Block…

Back to Top