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

Rocket之添加指令

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-1-15 13:53
  • 签到天数: 26 天

    [LV.4]

    发表于 2020-8-18 23:38:26 | 显示全部楼层 |阅读模式

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

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

    x
    本帖最后由 新ちゃん 于 2020-8-20 22:31 编辑

    本文目录
    准备工作
    • 指令空间(找到一个未使用的)。opcode = 10101011
    • 指令功能。同或操作



    Rocket Chip 源码
    添加指令

    • 位置:rocket-chip/src/main/scala/rocket/Instructions.scala

    1. object Instructions {
    2.         ...
    3.         def QIHAO              = BitPat("b0000000??????????000?????1010111")
    4.         ...
    5. }
    复制代码

    译码信号
    • 位置:rocket-chip/src/main/scala/rocket/IDecode.scala
    1. class IDecode() {
    2.         table {
    3.             ...
    4.             QIHAO->       List(Y,N,N,N,N,N,Y,Y,A2_RS2, A1_RS1, IMM_X, DW_XPR,FN_SOR,           N,M_X,        MT_X, N,N,N,N,N,N,Y,CSR.N,N,N,N,N),
    5.             ...
    6.         }
    7. }
    复制代码

    ALU
    • 位置:rocket-chip/src/main/scala/rocket/ALU.scala
    1. object ALU {
    2.         ...
    3.         def FN_SOR  = UInt(8)
    4.         ...
    5. }

    6. class ALU {
    7.         ...
    8.     val out = Mux(io.fn === FN_SOR, ~(io.in1 ^ io.in2), Mux(io.fn === FN_ADD || io.fn === FN_SUB, io.adder_out, shift_logic))
    9.         ...
    10. }
    复制代码

    工具链

    opcodes
    • 位置:rocket-chip/riscv-tools/riscv-opcodes/opcodes
    1. qihao   rd rs1 rs2 31..25=0  14..12=0 6..2=0x15 1..0=3
    复制代码

    • 在opcodes下执行make install

    添加指令

    • 位置:riscv-tools/riscv-gnu-toolchain/riscv-binutils-gdb/include/opcode/riscv-opc.h
    1. #define MATCH_QIHAO 0x57
    2. #define MASK_QIHAO  0xfe00707f
    3. DECLARE_INSN(qihao, MATCH_QIHAO, MASK_QIHAO)

    4. #define DECLARE_INSN(INSN_NAME, INSN_MATCH, INSN_MASK) \
    5. static inline bool is_ ## INSN_NAME ## _insn (long insn) \
    6. { \
    7.   return (insn & INSN_MASK) == INSN_MATCH; \
    8. }
    复制代码


    • 位置:riscv-tools/riscv-gnu-toolchain/riscv-binutils-gdb/opcodes/riscv-opc.c
    1. const struct riscv_opcode riscv_opcodes[] = {
    2. /* name,      isa,   operands, match, mask, match_func, pinfo.  */
    3. {"qihao",     "I",   "d,s,t",  MATCH_QIHAO, MASK_QIHAO, match_opcode, 0 },
    4. }
    复制代码

    spike支持
    • 位置:rocket-chip/riscv-tools/riscv-isa-sim/riscv/insns/qihao.h
    1. WRITE_RD(sext_xlen(~(RS1 ^ RS2)));
    复制代码
    • 位置:rocket-chip/riscv-tools/riscv-isa-sim/riscv/riscv.mk.in

    1. riscv_insn_list = \
    2.         qihao \
    复制代码
    编译
    1. cd rocket-chip/riscv-tools/
    2. ./build.sh
    复制代码

    测试

    C源码
    1. #include<stdio.h>

    2. int main() {
    3.     int res = 0;
    4.     __asm__ __volatile__("li a2, 0x00ff");
    5.     __asm__ __volatile__("li a3, 0x0f0f");
    6.     __asm__ __volatile__("qihao %0, a2, a3":"=r"(res)); // 0xfffff00f
    7.     printf("%x\n", res);
    8.     return 0;
    9. }
    复制代码


    spike 测试结果

    国内芯片技术交流-Rocket之添加指令risc-v单片机中文社区(1)

    RocketChip测试结果
    国内芯片技术交流-Rocket之添加指令risc-v单片机中文社区(2)

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





    上一篇:riscv-isa-sim的使用
    下一篇:2020年8月 中国电子学会 第十五届中国研究生电子设计竞赛
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

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



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

    GMT+8, 2024-4-20 14:14 , Processed in 0.610831 second(s), 49 queries .

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