Skip to content

Latest commit

 

History

History
93 lines (80 loc) · 5.53 KB

log.md

File metadata and controls

93 lines (80 loc) · 5.53 KB

一生一芯项目

本仓库用于记录一生一芯项目的工作进度和代码

目标

支持RV64IMZicsr指令集,实现M态,实现五级流水线,运行RT-Thread.:smile:

下一阶段目标

支持RV64IMAZicsr指令集,实现M/S/U模式,实现TLB和Cache,运行XV6和Linux.:smile:

当前进度

  • 写完单周期的代码
  • 写完五级流水线代码
  • 完成csr模块
  • 利用loadMemoryFromFileverilatornemu对单周期代码涉及到的RV64IMZicsr指令集中的所有指令进行测试,测试通过
  • 基本完成对五级流水线的测试
  • 修改处理器核对外接口为标准的AXI4接口,通过了自己写的测试用例
  • 添加了时钟中断,没有测试
  • 完成一个简单的串口,访真时从C++ vector实现的fifo中读入,输出则直接输出到终端,写了一个hello world的测试用例,测试通过
  • 流片的版本不带cache,可以正确跑通hello测试用例
  • 目前正在working的版本有一个简单的直接映射cache,可以跑通RTT以及现有的所有测试用例
  • 大致实现了地址转换部分的代码,接入到流水线,在不打开saptsv39分页时,行为正常,但是还没测试开启分页时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模块对时钟中断的支持不太理解,手册上提到用mtimemtimecmp两个memory-mapped register,但是在寄存器编号上没有找到这两个寄存器,不是很清楚这两个寄存器的具体使用方式
  • 编译出来的jalr指令的格式与手册上不符合
  • 网上下载的测试代码总是有问题,要么死循环,要么编译出的指令是RV64IMZicsr以外的指令
  • 核没有使用cache,直接用AXI4总线与Ram连接,流水线中的IFMEM阶段如果同时需要访存,会发生结构冒险,现在用了一个trick来解决:一旦MEM阶段完成访存,但是IF阶段还没有完成访存,可以直接把MEM阶段提交,然后把MEM阶段设置为无效。可能会有点问题
  • 运行MicroBench的时候有浮点数异常,但是和nemu对比每一步的运行结果都是对的,注释了seive函数就都可以通过,不知道是不是这个函数有除0异常的情况
  • TLB的一致性该如何保证,如果访问TLB对V,D等位的修改只发生在TLB中,如果操作系统进行页面的替换,需要写回页面,则page table中的PTE和TLB中的PTE不一致该如何处理,或者操作系统修改了page table,把某一些PTE设置为invalid,两者之间的不一致该如何处理
  • mip中的mtisti有什么区别,发生时钟中断的时候是置位哪一个
  • 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上运行

成果

  • 成功运行coremark
    • coremark
  • 成功运行RT-Thread
    • RT-Thread
  • 成功启动XV6
    • XV6
  • 成功启动Linux 4.18
    • Linux
  • Linux 4.18上运行busybox套件,以及运行stream benchmark
    • busybox