414|0

1592

帖子

0

资源

纯净的硅(高级)

RISC-V指令集介绍 - 整数基本指令集 [复制链接]

在修改 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]:指令第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


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表