随笔分类 - ysyx
摘要:这篇随笔记录的是从普通的多周期处理器到加入握手信号和axi-lite协议sram的处理器。 在之前的多周期处理器里,由于结构比较简单,所以我给ifu和exu的握手信号加入的是时序逻辑,idu由于只做解码,所以握手信号放在了组合逻辑里,就和透传差不多。但是加入sram握手信号以后,很多地方都需要再调整
阅读全文
摘要:在总线章节,我们需要将单周期处理器慢慢转变为多周期处理器。讲义提供了异步总线的思路:master发送valid信号,表示自己当前信号合法,slave发送ready信号,表示当前信号已经收到。达成握手的效果。 讲义里首先要求增加一个只读取的sram给IFU使用,用于读取指令。这个很好实现,sram元件
阅读全文
摘要:在进行pa4:多道程序的处理时,其中一道题目除了要完成kcontext,还需要对应修改trap.s的__asm_trap函数。使得中断响应机制能正确切换不同进程的上下文,在kocontext已经修改好以后,要修改这里其实也很容易。 __am_asm_trap: addi sp, sp, -CONTE
阅读全文
摘要:有关时间的内容应该被拆分为两部分:硬件和库环境 在使用nemu时,硬件部分由nemu充当,在nemu里对时间的处理如下:首先查看/nemu/src/device/timer.c, static void rtc_io_handler(uint32_t offset, int len, bool is
阅读全文
摘要:在RTL里,由于我将指令的分析与处理拆成了两个单元,所以指令的拆解也被分到了两个元件。由于指令的opcode部分没有重叠,所以我直接在组合逻辑里用case来区分指令opcode,在内部再根据funct3 funct7等值进行区分。nemu里的指令分析用到了正则匹配,但在这里我们不需要考虑。 alwa
阅读全文
摘要:difftest在测试集中可以起到十分重要的作用,可以快速找到发生问题的指令和pc寄存器地址。在nemu作为dut,参考其他模拟器(比如spike)的功能中,大部分代码已经完成,我们只需要完成寄存器的比对即可。但在RTL中重新实现这一功能或者类似功能时,我们需要完成更多函数,但大体的框架已经完成,我
阅读全文
摘要:nemu本身自带了将自己编译为动态库的功能,在menuconfig->build target里选择shared object即可。 在编译完成后,build文件夹里就会出现riscv32-nemu-interpreter-so这个库。首先可以用file命令检查文件,只要返回信息是lsb,share
阅读全文
摘要:首先看一下讲义里提到的yield os,这个os里面只有两道程序切换的模拟内容,只要做过pa3就很容易理解: #define STACK_SIZE (4096 * 8) typedef union { uint8_t stack[STACK_SIZE]; struct { Context *cp;
阅读全文
摘要:用户程序从main开始,而调用用户程序的就是navyapps里crt0的start.S,这个汇编代码会调用crt0.c里面的call_main()函数,然后调用用户程序的main(),用户程序执行完了以后,返回crt0.c,继续执行exit()。然后结束。 如何解决“不知道程序要被放到哪里”这个问题
阅读全文
摘要:nemu把库函数分为了与架构有关的isa部分和与架构无关的klib部分。这部分的任务,就是完善stdio.c stdlib.c 和string.c,让各种测试集、跑分和demo可以正常运行。值得一提的是,我也是看到这一部分,回看测试集时,才注意到测试集用的其实都是C语言自带的关键字和基本功能,没有使
阅读全文
摘要:尽管指令匹配的部分早就已经完成,但这并不代表代码方面就不会再检测出漏洞。cpu-test这个测试集文件夹里面的测试代码只是覆盖了一部分内容,即使是全部通过,你的代码也仍有可能是错误的。 当我在处理其他内容时,突然间nemu就卡在了代码某处提示地址错误。重新打开difftest,定位到某处jal跳转发
阅读全文
摘要:dummy的反汇编表: 80000000 <_start>: 80000000: 00000413 li s0,0 80000004: 00009117 auipc sp,0x9 80000008: ffc10113 addi sp,sp,-4 # 80009000 <_end> 8000000c:
阅读全文
摘要:ysyx的nvboard项目里自带了一个example,用来演示功能,同时也给出了简单的使用说明。 要将自己的verilog代码接入nvboard,首先需要生成一份nvboard.a库文件。在nvboard目录下make nvboardarchive,然后将库文件放到npc文件夹下的目录文件。库文件
阅读全文
摘要:要解析一个带有括号的长表达式并没有想象中那么容易。 首先,数学表达式的递归分解顺序和日常的顺序是完全相反的。在标准的数学四则表达式里,我们的计算顺序是从左往右,从高到低,优先计算括号内容。 由于我们使用的是递归的思路,代码拆分表达式的过程和计算顺序是完全相反的: 一方面,原本的高优先级级运算符要后进
阅读全文
摘要:BNF表达式以前没有学过,ysyx的nemu项目里用到了,在这里整理一下学习笔记。 BNF表达式可以简洁地定义一种语言的格式 ,基本格式为:<non-terminal> ::= <replacement> 。non-terminal为”非终止符号“,replacement为代替物,可以用于诠释左边的
阅读全文
摘要:基本逻辑: and a&b 与 同为1时输出1or a|b 或 有一个为1输出1xor a^b 异或 ab不同时输出1nand !(a&b) 与非 not and a与b再取反nor ~(a|b) 或非 a或b再取反xnor a~^b 同或 ab相同时输出1anotb a&(!b) a与非b and
阅读全文
摘要:提问的智慧 https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md 在阅读这篇文章以后,总体来说,我希望我尽量能够做到上面所提醒的内容。关于提问,我觉得要获得解答,首先需要让对
阅读全文
摘要:监视器这一章节,所需的代码都在nemu/src/monitor/sdb下,修改也是集中在这里修改,讲义讲的有点模糊,所以我直接写在这里。 相比于scanf ,sscanf可以从字符串中读取内容。 比如char str[]="123 4.567 yes" sscanf就可以sscanf("%d %lf
阅读全文
摘要:编译中出错:提示没有 <SDL2/SDL.h>头文件 查看错误信息,出错的文件在abstract-machine文件夹里,叫input.c,里面引用了SDL2/SDL.h 这个头文件,但是我只在fceux文件夹里搜到了sdl.h,考虑到linux区分大小写,搜索以后,我觉得我应该是系统缺少了SDL库
阅读全文