Syntacore RISCV 工具链使用(五)gcc工具链的生成与添加自定义指令集

RISCV指令集架构最大的特点就是模块化设计和可扩展性。本博客介绍如何在工具链中添加自定义指令并在SCR1中进行rtl仿真。

gcc工具链中添加自定义指令

GCC工具链的编译

首先下载riscv的GCC工具链

$ git clone https://github.com/riscv/riscv-gnu-toolchain
$ cd riscv-gnu-toolchain
$ git submodule update --init --recursive
$ export RISCV=/path/to/install/riscv/toolchain

此步骤需要下载大概3-4个G的文件,如果网速较慢可以查看git的submodule自行下载。
同时需要将RISCV宏定义加到环境变量中。建议在~/.bashrc中添加如下两句话

export RISCV=/path/to/install/riscv/toolchain
export PATH=$PATH:$RISCV

下面下载依赖项

$ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

然后我们需要编译的工具是面向嵌入式端,所以需要以newlib作为库函数,编译方式如下

./configure --prefix=/path/to/install/riscv/toolchain --enable-multilib
sudo make

一定要记得添加–enable-multilib,否则默认编译的64位工具无法在32位环境中使用。(血的教训)
一定要记得sudo make,否则权限不够中途会停下来(血的教训)
此步骤可能需要一个小时左右时间才能完成,完成后可以看到$RISCV目录下多了一个bin文件夹,文件夹中内容如下:
在这里插入图片描述
之后可以用上述工具替代从Syntacore官网下载的预编译工具来跑前几篇博客提到的仿真流程,以检测是否成功编译。

添加自定义指令

本节内容翻译自link.
以COS指令为例,我们指令需要实现如下功能

cos rd,rs1

Semantics
R[rd] = cos(R[rs1])

下载工具riscv-tools

$ git clone https://github.com/riscv/riscv-tools.git
$ git submodule update --init --recursive
$ export RISCV=/path/to/install/riscv/toolchain
$ ./build.sh

其中openOCD始终无法下载。但是这不影响添加自定义指令集。以后需要上板调试的时候再单独下载。

之后打开文件riscv-opcodes/opcodes-custom

$ cd riscv-tools/riscv-opcodes/
$ gvim opcodes-custom

我在最后加上了以下的指令语法描述
在这里插入图片描述
建议打开opcodes,参考里面的相似指令(比如add指令)的语法来添加自定义指令。
由于riscv的RV32I指令集支持的指令格式只有如下四种
在这里插入图片描述
所以实际上我添加的cos指令格式为R-type,

cos rd,rs1,rs2

Semantics
R[rd] = cos(R[rs1])

其中rs2为任意值即可,实际硬件单元不会用到。
接下来进入riscv-tools目录并运行如下指令

$ cd $RISCV/riscv-tools/
$ cat opcodes-pseudo opcodes opcodes-rvc opcodes-rvc-pseudo opcodes-custom | ./parse-opcodes -c > ~/temp.h

接下来打开temp.h

$ gvim temp.h

会看到自定义指令集添加了如下的定义
在这里插入图片描述
将自定义的这部分拷贝出来,放到文件$RISCV/riscv-gnu-toolchain/riscv-binutils/include/opcode/riscv-opc.h
在这里插入图片描述

(为了保险起见我加在了最前面)
接下来编辑$RISCV/riscv-gnu-toolchain/riscv-binutils-gdb/opcodes/riscv-opc.c文件 ,将自定义指令集添加如下
在这里插入图片描述
此处也是建议仿照相似指令(比如add指令)的格式来写。
在这里插入图片描述
第一个变量表示名字,第三个变量表示属于哪个指令集,第四个变量表示需要用到哪些汇编中的元素。后面两个宏就是之前自定义指令集添加的宏。
之后按照步骤 “GCC工具链的编译”执行一遍编译过程即可在编译器中添加自定义指令集。

自定义指令集试跑

为了验证自定义指令集是否成功添加到工具链,网上的做法是在spike模拟器中进行仿真。由于本人是ASIC前端工程师,所以直接准备rtl仿真。但是仿真之前需要check一下自定义指令是否成功添加。
进入$SCR1_DIR目录

$ cd $SCR1_DIR
$ mkdir sim/test/hello_world
$ cp sim/test/Makefile sim/test/hello_world/
$ gvim sim/test/hello_world/Makefile

修改如下makefile几处命名
在这里插入图片描述
在这里插入图片描述
之后添加hello_world.c

$ cd $SCR1_DIR
$ gvim sim/test/hello_world/hello_world.c

本人写的测试用工程如下
在这里插入图片描述
C语言内联汇编的语法规则不再赘述。
之后make执行编译

$ cd $SCR1_DIR
$ make

之后可以观察build/hello_world.dump文件中是否添加了自定义指令。

$ cd $SCR1_DIR
$ gvim build/hello_world.dump

在这里插入图片描述
可以看到指令成功添加到指令集中,并且正确与目标寄存器绑定。
下一篇博客将会讲述硬件扩展单元与RTL仿真。

  • 4
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值