查看: 1024|回复: 0
收起左侧

RISC-V指令集介绍 - 整数基本指令集

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2020-8-23 20:42:52 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 皋陶 于 2020-8-26 15:13 编辑

    前段时间在修改 picorv32 核心(一个riscv-32的cpu核心),阅读了一下riscv指令集的手册。

    在此,做一下简单记录。


    RV32I:32位RISC-V整数指令集


    1. 寄存器

            32个x寄存器,RV32下x reg是32位宽

            x0:硬连线 常数0

            x1-x31:31个通用reg

            返回地址:没有强制要求那一个x作为lr,但是一般用x1

            pc:额外的用户可见寄存器


    3. 基本指令格式

            四种基础指令格式 R/I/S/U

            imm:立即数

            rs1:源寄存器1

            rs2:源寄存器2

            rd:目标寄存器

            opcode:操作码

            

    4. 立即数

            各种指令格式下,拼装出立即数

            inst:指令第i位

            

    5. 整数计算

            使用R或者I类指令

            R类:寄存器-立即数

            I类:寄存器-寄存器

            整数计算不会造成运算异常

            

            寄存器-立即数:

                    ADDI:将12位有符号立即数和rs相加,溢出忽略,直接使用结果的最低32bit,并存入rd

                            伪指令MV:"MV rd,rs"实际上是"ADDI rd, rs, 0"

                    SLTI:如果rs小于立即数(都是有符号整数),将rd置1,否则置0

                    SLTIU:和SLTI一致,不过都是无符号数

                            伪指令SEQZ:"SEQZ rd, rs" 实际上是 "SLTIU rd, rs1, 1"

                    ANDI/ORI/XORI:rs与有符号12位立即数进行and,or,xor操作

                            伪指令NOT:"NOT rd, rs"实际上是"XORI rd, rs1, -1"

                   

                    shift是I类指令格式

                            SLLI:逻辑左移,低位移入0

                            SRLI:逻辑右移,高位移入0

                            SRAI:算数右移,符号移入高位

                   

                    u类指令格式

                            LUI:创建32位无符号整数,存放立即数到rd的高20位,低20位置0

                            AUIPC:创建pc的相对地址,pc+无符号立即数(偏移量)=>rd               

            

            寄存器-寄存器:

                    ADD/SUB:rs1(+/-)rs2 => rd

                    SLT/SLTU: 如果rs1<rs2,rd写1; 否则rd为0

                    AND/OR/XOR: rs1与rs2进行and,or,xor操作

                    SLL/SRL/SRA: 和"寄存器-立即数"指令一致,将r2的低5位作为立即数即可               

            

            NOP指令:

                    实际上是ADDI x0,x0,0

            

    6. 控制传输指令

            1)非条件跳转:

                    JAL:J类指令,立即数+pc为跳转目标,rd存放pc+4(返回地址)

                            跳转范围为pc(+/-)1MB

                    JALR:I类指令,rs+立即数为跳转目标,rd存放pc+4(返回地址)

                            实现远跳转

            

            2)条件跳转

                    所有分支指令使用B类指令格式,12位立即数+pc作为目标

                    跳转范围为pc(+/-)4KB

                   

                    BEQ/BNE:rs1(==/!=)rs2, 分别在相等或者不等时,发生跳转

                    BLT:rs1 < rs2, 跳转

                    BGE:rs1 >= rs2, 跳转

                   

    7. 加载存储指令

            RV32I是一个加载/存储架构,只有load/store能访问内存,运算指令只操作寄存器

            load是I类指令,store是S类指令

            

            LOAD:rs作为基地址,加上有符号的偏移,读取到rd寄存器

            STORE:rs1作为基地址加上有符号的偏移,作为内存地址,写入内容为rs2

            

    8. 内存模型

            RISC-V ISA支持单地址空间上多线程运行,每个hardware thread都有都有自己的寄存器状态

            

    9. 控制状态寄存器指令

                    寄存器-寄存器:读/写/修改 CSR

                            CSRRW:Atomic Read/Write CSR

                                    读取CSR的值存入rd寄存器,并将rs存入CSR

                                    另外:如果rd为x0,将不会执行        

                            

                            CSRRS:Atomic Read and Set Bits in CSR

                                    读取CSR的值存入rd寄存器,并根据rs中高位对CSR置1

                                    另外:如果rs为x0,将不会执行        

                            

                            CSRRC:Atomic Read and Clear Bits in CSR

                                    读取CSR的值存入rd寄存器,并根据rs中高位对CSR置0

                                    另外:如果rs为x0,将不会执行        


                    立即数-寄存器:读/写/修改 CSR

                            CSRRWI/CSRRSI/CSRRCI

                            将CSRRW类寄存器中的rs换成立即数

                            另外:如果立即数为0,将不会执行        


                    用户级系统指令:时钟和计数器

                            RV32I提供三个64位只读用户级寄存器:RDCYCLE[H]/RDTIME[H]/RDINSTRET[H]

                            使用CSRRS读取这三个寄存器的高32 bit

                            

                            RDCYCLE:时钟周期计数

                            RDTIME:时间 tick数

                            RDINSTRET:指令数

                            

    10. 环境调用和断点

            ECALL

            EBREAK

    本篇完,感谢关注:RISC-V单片机中文网




    上一篇:从零开始实现一个基于RISC-V的流水线处理器
    下一篇:RISC-V架构是否支持中断嵌套?
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-19 09:33 , Processed in 0.730974 second(s), 45 queries .

    快速回复 返回顶部 返回列表