RISC-V MCU中文社区

【分享】 关于协处理器自定义指令的实现

发表于 全国大学生集成电路创新创业大赛 2021-05-26 16:07:11
7
3970
3

团队介绍

大家好,我们团队的名字是Hey Siri,参赛编号是CICC1584,这次来分享在c/c++程序中嵌入汇编的写法,协处理器的自定义指令就是靠这种方法实现的,nice demo的下载链接在:https://www.rvmcu.com/community-topic-id-340.html

 

实现介绍

nice  demo中这段程序为例


在胡镇波老师的《RISC-V架构与嵌入式开发快速入门》一书的181页出,有对此做过介绍,asmGCC的关键字,表示进行内联汇编操作。volatile也是关键字,表示告诉编译器不对汇编程序进行任何优化。

这段汇编程序可分成两部分来看,“”内是汇编指令的具体内容

开始的insn r 0x7b6 6可以看作是一个整体指令, rRISC-Vr型指令,协处理只能定义成r型,其他指令格式如下所示:


0x7b表示的是哪一种custom,一种可以定义出4种类型,每种定义格式为:

Custom-0 ——— 7b0001011 ——— 7h0b

Custom-1 ——— 7b0101011 ——— 7h2b

Custom-2 ——— 7b1011011 ——— 7h5b

Custom-3 ——— 7b1111011 ——— 7h7b

 

随后的6表示指令的1412位,即funct3


协处理器的rtl代码中可见这个定义,这里的110的顺序对应顺序为rdrs1rs2,使用寄存器的话就把对应位置1,在上述链接的指令格式中也可见其对应关系:


后面一个6就是对应指令编号了,在31位到25位的地方,不同的指令编号即表示不同的指令,所以每种custom类型都可以定义出128条自定义指令,4种指令一共能定义出512条自定义指令。

现在指令已经介绍完了,相信学过汇编的同学都知道汇编指令中有这源操作数跟目的操作数这两个概念,源操作数表是需要处理的数,目的操作数是处理结果,汇编指令写完之后需要为指令指出需要操作的数,此处后面的%0, %1, x0即表示操作数,顺序遵照rdrs1rs2,使用了的寄存器使用%+数字或者%+[变量名]来注明,使用数字的话,后续处理要注意顺序,未使用的寄存器可以写x0

这样就介绍完了分号内的内容,我们设置好了一条汇编指令,但是需要将汇编程序处理的数据跟c/c++程序处理的数据对应起来。

分号外的程序就起到一个约束的作用,“=r”中的等号表示为输出变量做输出,后续()里的变量就是需要输出的变量,汇编程序执行后把()里的变量值更新,r表示使用编译器自动分配的寄存器来存储该操作数变量,m表示使用内存地址来存储该操作数变量,rm则编译器自动选择最优方案。

而此前在设置寄存器时,有提到用%+数字的方式,这种是隐含指定,比如有两个输出操作数,两个输入数,那么%0表示第一个输出操作数,%1表示第二个输入操作数,%3表示第一个输入操作数,%4表示第二个输入操作数。用%+[变量名]的明确指明方式就不需要按顺序。

 

结果演示

   我们团队先在蜂鸟的核里根据nice指令的接口,挂了一个协处理器,定义软件指令开关协处理器,并可以读取协处理器发回的数据,软件代码如下所示:


使用串口监视可以发现读数据跟开关功能都可以正常实现


 

小结

这篇贴子分享了编写协处理器自定义指令的方法,能力有限,难免出现疏漏,我们也只是刚刚入门,勉强会用的程度,有些理解不到位或者错误的地方希望大家能够指正,共同学习共同进步,祝各参赛队比赛顺利!

 

喜欢3
用户评论 (7)
  • 羽

    2022-03-17 10:56:51 1#

    demo_nice.c中.insn是什么意思呀,您的自定义指令中的.kws又是什么意思呀

    这块我不太记得了,猜测是指令的名字,后面kws应该是我们自己定义的指令的名字

  • 2022-03-17 10:44:12 2#

    demo_nice.c中.insn是什么意思呀,您的自定义指令中的.kws又是什么意思呀

  • 羽

    2021-11-01 00:46:12 3#

    啊这这这

    汇编指令那里是不是有错啊:

    0x7b 4 1 %0 x0 x0

    4(100)说明只有rd使用,也就是只有一个输出操作数,那为啥还有第二个冒号用来指定输入操作数

    我当时没想到这么细,仿照芯来官方的代码写的,? 你可以研究研究

  • 啊这这这

    2021-11-01 00:24:08 啊这这这 4#

    zero是0,就是没有操作数的意思

    或者我给变量zero赋值10,会对这个指令产生什么影响

  • 啊这这这

    2021-10-31 23:57:47 啊这这这 5#

    zero是0,就是没有操作数的意思

    可是zero是个变量啊,我没懂啊,这里这个变量写int ten   :"r"(ten)

    就能变成10了吗~o(〃'▽'〃)o?

    我的理解是这里只是占位,这个地方写什么都行,就像这个zero其实什么用都没有

  • 羽

    2021-10-31 23:53:00 6#

    啊这这这

    汇编指令那里是不是有错啊:

    0x7b 4 1 %0 x0 x0

    4(100)说明只有rd使用,也就是只有一个输出操作数,那为啥还有第二个冒号用来指定输入操作数

    zero是0,就是没有操作数的意思

  • 啊这这这

    2021-10-31 10:21:33 啊这这这 7#

    汇编指令那里是不是有错啊:

    0x7b 4 1 %0 x0 x0

    4(100)说明只有rd使用,也就是只有一个输出操作数,那为啥还有第二个冒号用来指定输入操作数

羽

实名认证

懒的都不写签名

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