tinyriscv/README.md

144 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 1.概述
本分支是在bram分支的基础上进行改进的。
改进的地方主要有:
1. 开发环境切换到Linux(Ubuntu18.04)系统下;
2. 仿真器使用verilator
3. 内部总线使用OBI总线(详细内容见doc/OBI-v1.0.pdf文档)
4. 增加指令trace功能
6. JTAG模块全面改进和优化支持3个硬件断点单步等功能支持gdb调试
7. 增加静态分支预测功能;
# 2.使用方法
## 2.1安装gcc工具链
下载gcc工具链([百度云链接](https://pan.baidu.com/s/1iRiZoPnt9M1upXsUkvLEfA)提取码yaib),使用下面的命令解压到/opt/riscv32目录下
```
sudo tar zxf tinyriscv-gcc-toolchain.tar.gz -C /
```
## 2.2下载代码
下载本项目verilator分支的代码
```
git clone -b verilator https://gitee.com/liangkangnan/tinyriscv.git
```
## 2.3运行仿真
打开终端进入到sim目录下执行以下的命令编译
```
make recompile
```
这个命令会重新编译整个rtl源码和sdk/examples/simple这个C语言例程。如果需要使用其他例程可以用PROG参数指定比如
```
make PROG=/path/sdk/examples/hello_world/hello_world.mem recompile
```
执行以下命令运行仿真:
```
make run
```
![make_run](./pic/make_run.png)
打开另一个终端进入到tools/openocd目录下运行openocd
```
./openocd_linux -f ../../sim/jtag_debug.cfg
```
![openocd](./pic/openocd.png)
可以看到openocd已经连上了可以使用telnet或者gdb进行调试了。
### 2.3.1使用telnet进行调试
再打开另一个终端输入以下命令连接telnet
```
telnet localhost 4444
```
![telnet](./pic/telnet.png)
然后就可以使用各种命令进行调试了。下面介绍一些常用的命令:
**halt**停住MCU进入调试模式
**resume**MCU从停住的地方继续执行退出调试模式
**reset**复位MCU复位之后就开始执行。通常在下载完程序后使用该命令来运行程序
**reset halt**复位MCU然后停住MCU即MCU停在复位地址处
**bp 0x00000010 4 hw**打断点其中0x00000010是断点的地址4表示地址长度为4个字节hw表示硬件断点。tinyriscv只支持硬件断点。
**rbp 0x00000010**删除0x00000010地址处的断点
**bp**:查看所有断点信息;
**step**:单步执行,每次执行一条指令;
**mww 0x00000010 0x1234**即memory write word往0x00000010地址处写入0x1234长度为4个字节
**mdw 0x00000010 2**即memory display word从0x00000010地址处读取2个word
**reg sp**读取sp寄存器的值
**reg sp 0x10**往sp寄存器写入0x10
**load_image**加载image文件比如load_image filename address bin min_address max_length其中filename表示要加载的文件address表示要加载到哪个地址bin表示文件的类型min_address表示最小地址该值与address相同即可max_length表示文件的最大长度。目前使用这个命令来下载C语言程序。
**verify_image**比如verify_image filename offset其中filename表示已经下载了的文件offset表示从哪个地址开始校验。使用这个命令来校验下载进去的程序是否正确。
**load_bin**如果觉得load_image命令的参数比较多可以使用load_bin命令比如load_bin bin_file 0x0 1表示将bin_file二进制文件下载到0x0地址处并且校验。
### 2.3.2使用gdb进行调试
除了使用telnet进行调试之外还可以使用gdb进行调试这也是大部分IDEeclipse等所使用的调试方式。
openocd连上之后打开另一个终端执行以下命令运行gdb
```
/opt/riscv32/bin/riscv32-unknown-elf-gdb ~/tinyriscv/sdk/examples/simple/simple
```
接着,设置一下超时时间:
```
set remotetimeout 2000
```
连接openocd服务
```
target remote localhost:3333
```
加载程序:
```
load
```
之后就可以用gdb命令来调试了比如打印mul变量的值
```
print mul
```
![gdb](./pic/gdb.png)
注意如果要用gdb进行调试则编译C程序时必须加上-g参数。