本仓库用于记录一生一芯项目的工作进度和代码
支持RV64IMZicsr指令集,实现M态,实现五级流水线,运行RT-Thread.:smile:
支持RV64IMAZicsr指令集,实现M/S/U模式,实现TLB和Cache,运行XV6和Linux.:smile:
- 写完单周期的代码
- 写完五级流水线代码
- 完成csr模块
- 利用
loadMemoryFromFile和verilator和nemu对单周期代码涉及到的RV64IMZicsr指令集中的所有指令进行测试,测试通过 - 基本完成对五级流水线的测试
- 修改处理器核对外接口为标准的
AXI4接口,通过了自己写的测试用例 - 添加了时钟中断,没有测试
- 完成一个简单的串口,访真时从C++
vector实现的fifo中读入,输出则直接输出到终端,写了一个hello world的测试用例,测试通过 - 流片的版本不带
cache,可以正确跑通hello测试用例 - 目前正在
working的版本有一个简单的直接映射cache,可以跑通RTT以及现有的所有测试用例 - 大致实现了地址转换部分的代码,接入到流水线,在不打开
sapt的sv39分页时,行为正常,但是还没测试开启分页时TLB和PTW的行为是否正常 - 实现了完整的M/S/U特权模式,测试力度不大
- 完成
sfence.vma和写入satp时对TLB(iTLB,dTLB)的刷新,完成fence.i对Cache(iCache,dCache)的刷新,目前刷新的情况测试用例覆盖完整,行为正确 - 完成A指令集的扩展,基本通过了测试,发现有设计不合理的地方,对处理器结构进行了修改,具体见
doc/xv6.md - 成功启动xv6,运行了一个
echo的用户程序,但是还存在一些问题 - 成功启动xv6,运行了
ls,echo,mkdir,cd等用户程序 - 成功启动Linux,创建
init进程,输出hello riscv world! - 成功运行busybox套件,运行
ls,echo,pwd以及stream benchmark - 流片已经冻结的版本在here
- 代码主要借鉴
sodor,其代码的访存模块有bug,数据通路和控制通路一起连接到内存,导致有覆盖的问题,编译出来的verilog代码跟自己想法不一样 - 总线有点不太理解
- csr模块对时钟中断的支持不太理解,手册上提到用
mtime和mtimecmp两个memory-mapped register,但是在寄存器编号上没有找到这两个寄存器,不是很清楚这两个寄存器的具体使用方式 - 编译出来的
jalr指令的格式与手册上不符合 - 网上下载的测试代码总是有问题,要么死循环,要么编译出的指令是
RV64IMZicsr以外的指令 - 核没有使用
cache,直接用AXI4总线与Ram连接,流水线中的IF和MEM阶段如果同时需要访存,会发生结构冒险,现在用了一个trick来解决:一旦MEM阶段完成访存,但是IF阶段还没有完成访存,可以直接把MEM阶段提交,然后把MEM阶段设置为无效。可能会有点问题 - 运行
MicroBench的时候有浮点数异常,但是和nemu对比每一步的运行结果都是对的,注释了seive函数就都可以通过,不知道是不是这个函数有除0异常的情况 - TLB的一致性该如何保证,如果访问TLB对V,D等位的修改只发生在TLB中,如果操作系统进行页面的替换,需要写回页面,则page table中的PTE和TLB中的PTE不一致该如何处理,或者操作系统修改了page table,把某一些PTE设置为invalid,两者之间的不一致该如何处理
- mip中的
mti和sti有什么区别,发生时钟中断的时候是置位哪一个 - Linux启动后在ram中解析elf格式的init文件时,只要访问bss段就发生异常,似乎是没有给bss段加上页表,而访问text段就没有问题
- 完善代码的csr模块
- 编写单周期测试框架
- 完成对单周期的测试
- 同步将其修改为五级流水线
- 测试五级流水线代码
- 将测试框架重构以支持测试五级流水线
- 目前的测试框架用到了一个
trick来支持对pc跳转后的nop指令的跳过,后面需要再仔细改一下 - 下载
riscv-toolchain,做一个自动化的测试框架 - 添加对于时钟中断的支持
- 深入读一下特权文档手册
- 阅读
NutShell的总线代码 - 下载AM中的测试代码进行测试
- 下载RT-Thread,编译测试
- 代码重构
- AM中的测试程序还有几个有问题,需要修改
- 时钟中断相关的代码可能还存在一些问题
- 添加乘除法器
- 添加分支预测器
- 添加cache(简单的直接映射I$ , D$)
- 添加sv39的PTW
- 添加TLB
- 添加完整的同步异常的支持
- 完成MMU接入流水线以及单元测试
- 实现M/S/U特权模式
- 实现cache与TLB的刷新
- 开启分页之后TLB和PTW的行为可能有问题,等待测试
- 特权模式S/U的行为需要进一步测试
- 添加A指令集的扩展
- 添加PMP机制
- 添加PLIC
- 编译
busybox等套件在Linux上运行




