RISC-V MCU中文社区

【分享】 E203分享之自定义指令扩展

发表于 全国大学生集成电路创新创业大赛 2023-05-25 20:07:53
0
1387
0

报名编号:CICC1764
团队名称:两年半IC练习生

E203分享之自定义指令扩展
分享一下关于脉冲神经网络加速器自定义指令集的设计,我们的作品需要先对图像进行预处理,比如:卷积运算、脉冲编码等。然后把产生的脉冲编码发送给加速器的全连接层,并最终实现图像分类的目标。为此我们设计了以下指令:

自定义指令格式如下:
图片alt

图片alt
软件配置标准差,程序下载时将标准差存入内存中。rs1为%1,set_sigma指令来读取操作数1的值(存放标准差的内存地址)。rs2为0,不使用。rd为0,不写回。

指令代码如下:采用内嵌汇编
__STATIC_FORCEINLINE void set_sigma(int addr)
{
int zero = 0;

asm volatile (
   ".insn r 0x7b, 2, 8, x0,%1, x0"
         :"=r"(zero)
         :"r"(addr)
 );

}

指令在程序中的调用:
unsigned int sigma[2] = {2,1}; //sigma1,sigma2
set_sigma((int)sigma);

输入数组sigma[2]中包含2和1两个元素,分别对应着两个不同的标准差,进而可以生成两个不同的卷积核。

图片alt

软件配置脉冲编码方式,程序下载时存入内存中。rs1为%1,set_code_mode指令来读取操作数1的值。rs2为0,不使用。rd为0,不写回。
指令代码如下:
__STATIC_FORCEINLINE void set_code_mode(int addr)
{
int zero = 0;

asm volatile (
   ".insn r 0x7b, 2, 11, x0,%1, x0"
         :"=r"(zero)
         :"r"(addr)
 );

}

指令在程序中的调用:

unsigned int code_mode[8] = {1,1,1,1,1,1,1,1};
//possion,single,TTFS,ISI code
set_code_mode((int)code_mode);
fence();

code_mode数组对应code_mode_reg,其中每一位代表控制一种编码方式的开关。其中高四位分别对应泊松、单独、TTFS、ISI的编码方式,后四位待定
图片alt
软件读取原图像矩阵,程序下载时存入内存中,op_conv指令来读取操作数1的值(存放原图像矩阵的内存地址),并对图像数据进行卷积运算。

指令代码如下:
__STATIC_FORCEINLINE void op_conv(int addr)
{
int pulse = 0;

asm volatile (
   ".insn r 0x7b, 2, 9, x0,%1, x0"
         :"=r"(pulse)
         :"r"(addr)
 );

}

程序中指令调用如下:
op_conv((int) memory); //source image data stored in the array of memory

喜欢0
用户评论
北落师门

北落师门 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板