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…

使用nandsim模拟超过64G的大容量MTD设备

最近做毕设项目需要模拟mtd设备,并对yaffs进行相关测试。而由于要求模拟1TB容量的mtd设备,而若使用block2mtd,由于它的page size为1B大小,无法进行yaffs的挂载。 后来同学发现了Linux Kernel自带了nandsim模块,我们可以模拟一个块设备。且这个模块启动的时候可以通过overridesize参数设置整个mtd的大小为所选模拟设备的erase_size为2的整数幂。 但我们实测发现,如果overridesize设置过大,会报出以下错误: ➜ sudo modprobe nandsim first_id_byte=0x98 second_id_byte=0xd7 third_id_byte=0x94 fourth_id_byte=0x32 overridesize=20 insmod: ERROR: could not…

修好了D1板板使用Clang编译内核的问题,错误的Variables in Specified Registers用法

最近在修D1板板的驱动。遇到一些很迷惑的问题。 GCC编译的D1内核是好的,Clang不开LTO的内核是坏的,Clang编译的LTO THIN的内核是坏的,Clang编译的LTO Full内核勉强能用,Clang编译的LTO Full+CFI的内核是坏的。 但由于我们科研需要必须要使用Clang LTO+CFI,因此必须要保证能跑通开启了LTO和CFI的Kernel。 上述勉强能用的内核网卡还出现了异常的延迟、丢包、DUP。且从板子上ping外部延迟恒定为1s,而从外部ping板子延迟恒定为2s。而IPv6甚至完全不可用。 而勉强能用的内核上的SD卡,挂载上去写完文件再卸载后,接到别的电脑上挂载,却出现了文件系统损坏的情况。 而后来,经过2老师测试勉强能用的内核上的网卡驱动,发现以下问题: 经研究,clang编译的d1 linux,发包时,如果同时收到了包(比如别人发的广播包),那么发出去的包部分字节会被覆盖为收到的包 因此,我开始怀疑该问题是访问IO时Cache一致性出了问题,我就把目光从驱动本身转向了内核里维护Cache一致性的相关代码。 后来,我发现了一个这样的函数: void sbi_dma_sync(unsigned long start,…

AMD Zen 2/3处理器上的迷惑现象

今天在实验室装了一台AMD Ryzen 5700G的机器,想看看和自己寝室里放的AMD Ryzen 5800X性能差距多少,考虑到架构相同仅L3 Cache大小不同,因此就进行了一个简单的循环测试来看看单核Turbo Boost性能差距有多大。 实验室的5700G机器上安装了Ubuntu 21.04(考虑到20.04目前内核版本为5.4,无法支持Zen 3的一些电源管理特性,而实验室同学喜欢用Ubuntu),而我自己台式机则是滚的Debian sid。 两台机器自带的编译器如下(后续已经发现只与编译器有关): 实验室的5700G:gcc version 10.3.0 (Ubuntu 10.3.0-1ubuntu1) 寝室的5800X:gcc…

解决Clang+LLVM编译的Kernel多余.LBB符号导致Call Trace不方便查阅的问题

最近因为科研需求需要在全志D1开发板做性能的Evaluation,但是这个开发板的驱动用GCC编译是正常,而使用Clang+LLVM编译时存在许多问题,SD卡、网卡、USB全都有问题,因此考虑自己做一些修复。 但是由于硬件不方便在QEMU模拟,开发板的调试全靠串口输出,因此比较困难,但是一个大问题是LLVM编译的内核多了许多.LBB符号,导致Call Trace大概会长这样: [ 2.666348] [<ffffffff80004ecc>] .LBB2_1+0x20/0x2c [ 2.671152] [<ffffffff808f2c64>] dump_stack_lvl+0x4a/0x66 [ 2.676562] [<ffffffff808f2c98>] .LBB4_1+0x10/0x18 [ 2.681360] [<ffffffff808f27ce>]…

大学前三年的流水账

首先在开头提醒未来保研的学弟学妹,一定要通过提前联系一些学校的老师给自己有个定位,特别是在大一的时候因为竞赛或者种种原因没有取得高绩点但是专业能力较强而在Rank上无法体现的同学。而保研签卖身契如果自己不打算鸽一定要非常非常慎重。 自己的经历从大一说起。 大一 大一的时候对计算机领域研究了解太少了,看大家都在卷AI以为科研就只有AI相关,但自己又特别不喜欢这个方向,于是当时对保研的想法就是能保就读个划水专硕混学历,若不能保就直接去大厂。然后大一上进来期中考试高数还考了班上120多人内的第3名,就觉得自己没必要把绩点卷成这样,当时恰好自己对高中的OI生涯结果不满意(NOIP省一),于是大学便想继续在ICPC/CCPC(以前称为ACM竞赛)完成自己的遗愿,随后就把重心放在了这些比赛上。 然后很快,大一后半学期在学业上开始摸鱼,竞赛训练倒是更加频繁了,期末考也远没有期中考那么好了,特别是历史课和英语课因为没重视加上自己本来不擅长拖了很大的后腿,最后那个学期大概排名刚好20%。 然后到了大一下,又开始揽了更多的比赛并在自己加入的组织承担了更多的工作。后来有一件事情彻底改变了学习的状态。当时给那届CQUPC(重庆大学程序设计大赛)编写了Web报名系统以及负责了群发短信通知的工作。结果当时需要群发短信通知的日子刚好是比赛前一天晚上,而当时恰好高数老师需要补进度连补了四节课,而我当时给那个比赛编写的群发短信脚本又出了问题,在上课时间一直在折腾这事情,但毕竟当时就得通知到,无论如何都得发出去,最后原因在于被运营商限制了,找了客服解决,但后果是我落下了一晚上的高数课。 至此以后,我高数课就再也听不懂了,而当时各种比赛的压力也日益繁重,当时除了*CPC的日常训练外还报名参加了一个微信小程序的比赛,导致各种压力在一起一直没有挤出时间补上那一晚上落下的高数课,于是过上了抄作业的生活。结果在期末考前三周,连续参加了CTF校赛、ICPC南昌邀请赛、四川省大学生程序设计竞赛,还在那个时间赶工交了微信小程序作品,结果期末复习也真的来不及了,最后那个学期绩点非常惨,四分制GPA直接掉到2.8,感觉自己已经保研无望了。而现在回头来看,当时取得的竞赛成绩在后来都有更好的替代了。 期末结束,开始了计算机类专业分流,我们这一届也是第一届专业分流。当时教务老师明说了我们这届开始保研的时候按照全学院拉通排名,不分专业,因此大家选择专业的时候也主要跟随自己兴趣为主,但大多数人还是选择了计算机科学与技术。然后我当时报名了计科卓越班的选拔,虽然我当时绩点不高但是大一上成绩其实还行,且靠着比赛经历的加成(感觉主要是省程序设计大赛的金牌),还是通过了卓越班的选拔面试,进入了计科卓越工程师班。不过这一选择也成为了我在大三时破防的一个点,若当时没有通过,我可能选择的是信息安全。 大二 经过了绩点倒闭的大一下学期,大二就彻底对GPA躺平了,把心思全部放在算法竞赛上。当时基本每周和队友开1-2场5小时的模拟训练赛外加自己训练以及补题。最后结果还是不错的,在当年的EC-Final上拿了银牌,并且最后最难的那题三个人都有各自的贡献,也在最后10分钟评测机不堪重负等不来结果的时候我们把可能错的位置全部都改一遍,最后终榜出来发现那题过了,尽管那题不过也是银牌,但是总算是对这场比赛没有任何遗憾了。 然后大二下因为疫情在家生活节奏不太适应,又每天晚上被父母拉着出去锻炼身体占用了许多时间,所以一事无成,这个学期就到此为止吧。 唯一需要铺垫的事情是大二下的时候第一次参加了CET-6考试,因为大二上ICPC Asia EC-Final时间与CET-6冲突了,然后第一次参加也没重视就想看看当前水平,就裸考了,最后成绩是350多(具体多少忘了),总之是非常倒闭。因此就打算大三竞赛打完好好补一下英语的短板了。 大三上,突然可以单列保研 到了大三,开学的时候和室友组队参加了数学建模竞赛,结果恰好遇到了一个我非常擅长的问题,是一个图论题,然后我就拿着之前参加算法竞赛攒下的DP+网络流知识搞出了一个非常好的结果,队友也拿强化学习做了一部分,且这些算法结果好又可以把算法写的非常详细,最后我们获得了全国一等奖。按照当时已经符合学校的单列保研标准了。当时也非常高兴自己可以去混个学历了。 大三上,突然有志于系统结构方向科研 但也很快,就在这个学期,我们当时有一位助教在做操作系统的教改,把清华的uCore操作系统实验引入了我们学校,然后我当时看了指导书后对OS非常着迷。特别是把那些实验自己读代码读文档后补全代码做完以后发现自己对计算机系统的认识发生了本质性的变化,特别是搞清楚了内存管理后,开始理解了为什么像Java这样需要GC的语言在某些场景具有优势,觉得一下子思维都开阔了。于是发现自己找到了自己真正喜欢的东西,计算机底层的相关研究,或者说体系结构。于是开始有了好好做研究的想法,从曾经只想读个水专硕变成了想直博认真做研究。…

使用Debian Preseeding在无VNC控制台的虚拟机上安装Debian

起源 找学长要了一台学校的高配置虚拟机方便运行自动调参内卷机,但由于不提供VNC控制台也不提供Debian镜像,只提供Ubuntu和CentOS,且安装虚拟机内系统还得找服务器厂家的人来进行,我也不知道是啥Hypervisor,因此非常难受,就想自己折腾一下安装。 后来经过Soha指点,可以采用Debian Preseeding来进行,现在汇报研究成果。 前置技能 由于涉及到修改bootloader的配置,需要对当前虚拟机内的Linux发行版使用的bootloader有一定的了解,本文将以grub2为例。 且为了防止遇到一些问题,建议在开始之前先进行切换至root用户。 准备文件 下载当前Debian的安装内核与initrd wget http://mirrors.cqu.edu.cn/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz wget http://mirrors.cqu.edu.cn/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux 注:如果服务器并非amd64架构,例如arm64,换成对应的架构也是可以的,曾经在华为云的ARM机器上亲测成功 修改initrd 解压initrd mkdir initrd…

Back to Top