目录
下载对应版本的Nutshell和NEMU
安装mill和java
检查mill版本
安装java 配置java
安装verilator4.210
安装 GNU RISCV 工具链
NEMU和Nutshell RUN 起 来 !
设置环境变量
Difftest简介
参考资料
进入xs-env工程,下载对应的NutShell@3a8832e和NEMU@26c7e50版本,参考仓库的setuptools.sh安装必要的软件。java mill verilator
参考the Manual section in this guide
https://com-lihaoyi.github.io/mill/mill/Intro_to_Mill.html
sudo sh -c "curl -L https://github.com/com-lihaoyi/mill/releases/download/0.9.8/0.9.8 > /usr/local/bin/mill && chmod +x /usr/local/bin/mill"
nutshell需要mill运行整个工程 运行mill需要build.sc文件 先不急
chisel有很多依赖项
如果用sbt运行scala,那么这些依赖项在build.sbt文件里规定
如果用mill运行scala,那么这些依赖项在build.sc文件里规定
Chisel基于scala语言,运行环境为JVM。mill作为编译工具,需安装java和mill
Nutshell使用mill作为编译工具,verilator作为仿真工具
进入src/main/scala文件夹 bus nutcore sim system等代码文件+top文件,top文件夹里是chisel代码执行的入口。(之所以用“执行”一词,是因为chisel是基于scala的,这个入口其实是scala执行的入口,所谓chisel的执行,其实就是chisel向verilog的翻译)
/home/liwanwan/Nutshelldifftest/NutShell/src/main/scala/top
把chisel代码转换成verilog,这个“转换”不是自动做的,这种翻译也不是像编译一样,都是通过命令行做的,而是通过scala代码做的。这种执行翻译的scala代码,才是被命令行执行的东西。
参考ubuntu18.04 安装java_普通网友的博客-CSDN博客_ubuntu安装java
配置环境变量
放到 /usr/local 里面的程序,建议使用系统变量。
用户变量
~/.profile 文件是用户的私有配置文件
~/.bashrc 是在bash里面使用的私有配置文件,优先级在 .profile 文件之后
系统变量
/etc/profile 文件是系统的公用配置文件
/etc/bash.bashrc 是bash专用的配置文件,优先级在 profile 文件之后
主要是环境变量的设置,不仅是java,这次凡是涉及到环境变量设置,我都使用了export命令导出为环境变量(如果不使用export,仅在当前shell里面有效),全部设置在
sudo vim /etc/profile
环境变量设置完一定要在当前权限下
source /etc/profile
使环境变量设置生效 ,source是临时加载配置文件,仅在当前shell有效,关闭以后失效,新开shell也要重新source!! 当然,配置以后可以重新登陆使配置生效
在普通用户模式下和root用户模式下source是不互通的 如果切换模式也要重新source
后面在nutshell目录下进行处理器核的仿真运行make emu,在这里踩坑好几回!!!
参考Unbuntu21.04安装Verilator --4.210_甘草梗的博客-CSDN博客_ubuntu安装verilator
参考官网步骤安装
安装verilator过程生成configure文件问题
无法找到python3
总是输入python 找到python3.8.10
之前tinyriscv把python软链接到python3了
输入”ls -l | grep python”显示所有名字中包含python的文件
sudo mv python python3
将python换成python3
参考Linux中默认Python版本的切换_槲寄、生下的博客-CSDN博客
我的是Ubuntu 20.04 :
sudo apt-get install g++-riscv64-linux-gnu
sudo vim /etc/profile
export NEMU_HOME=/home/liwanwan/Nutshelldifftest/NEMU
export NUTSHELL_HOME=
/home/liwanwan/Nutshelldifftest/NutShell
source /etc/profile
cd NEMU
提示.config文件不存在
make menuconfig
make riscv64-xs-ref_defconfig #load default configuration
make
切换到Nutshell目录下
cd Nutshell
source ./env.sh
make clean
make emu EMU_CXX_EXTRA_FLAGS="-DFIRST_INST_ADDRESS=0x80000000"
当前文件被占用 找出被占用的文件 kill
按照这个顺序会找不到SimTop.v文件 因为根本没有生成。。。。。
参照nutshell/difftest/.github/workflows/main.yml使用预编译的映像文件仿真运行nutshell核
参照main.yml 遇到问题定位
:比如在difftest/verilator.mk文件中,将clang++换成g++;或者注释掉41行的VEXTRA-FLAGS += - - instr-count-dpi 1
;或者装一些依赖库。
踩坑之后总结的正确的顺序应该是
cd Nutshell
source ./env.sh
make clean
mill
在Nutshell目录下有build.sc文件,运行mill,然后
make
生成 verilog code. The output file is build/TopMain.v
然后
make emu
The output file is build/
SimTop.v
会报一些错
设置NOOP_HOME环境变量 export NOOP_HOME=/home/liwanwan/Nutshelldifftest
然后source
找不到sqlite3.h头文件,原因是系统没有安装函数库
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
最后再make emu以下就ok了
Difftest是差分测试框架,有什么用呢?高性能CPU的设计需要做复杂的测试,传统的测试方法运行较慢,而且出了问题很难定位,Difftest就是为了解决这两个问题,基本的逻辑也不难:
1. 处理器运行一条指令
2. 模拟器运行相同的指令
3. 比较两者的状态
为什么能运行更快呢?最著名的模拟器当属Qemu,此外伯克利也提供了针对riscv的模拟器spike,但两者的实现都比较复杂,中科院采用了南大的开发的轻量级教学模拟器Nemu。因为只需要在指令层面做仿真,因此有很大的优化空间。
为什么能容易定位bug?因为每运行一条指令,都会对比关键寄存器的数值,做到动态实时比对,spike需要最终运行完才能比对。计算机的运行就是不同状态的转移,这个观点非常精妙。
总的来说就是,difftest是CPU开发过程中的高校调试框架,是chisel开发非常好用的工具,提供了online的测试,极大的提升了debug效率。
NEMU
则为difftest提供了运行时的“标准答案”,主要需要其动态库。
碎碎念:我还没体会到linux对于开发效率的提升啊啊啊啊,可视化界面是这世界上最伟大的发明,命令行操作是是什么鬼啊啊啊啊,希望以后能打破这个认知。还是自己主机上的linux好用,虚拟机搞到后面内存不够用尊的不利于身心健康!
Permission denied一般是权限问题,切换sudo su
Difftest踩坑笔记(一)_icfg66的博客-CSDN博客
difftest/main.yml at c02950ee1597bcf45af2c9d0b351c1ff99dba5bb · OpenXiangShan/difftest · GitHub快速上手教程 · GitBook
折腾CPU系列:chisel+mill+difftest环境配置_VOlD-NULL的博客-CSDN博客