From 333cc57c991acb1b445fdc7b16eeb4fca3fbf8d7 Mon Sep 17 00:00:00 2001 From: andy <1414772332@qq.com> Date: Thu, 17 Apr 2025 15:35:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=BD=E6=95=B0=E8=B0=83=E7=94=A8=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cpu/riscv.c | 112 +++++++++++++++++++++++++++++++++++--------------- make_riscv.py | 2 +- riscv/main.c | 5 ++- riscv/start.S | 4 +- 4 files changed, 86 insertions(+), 37 deletions(-) diff --git a/cpu/riscv.c b/cpu/riscv.c index 56dc3b3..f26c8e1 100644 --- a/cpu/riscv.c +++ b/cpu/riscv.c @@ -145,16 +145,10 @@ void ins_add(riscv_t* riscv, int rs2, int rs1, int rd) { } void ins_addi(riscv_t* riscv, int rs1, int imm, int rd) { - if (imm & (1 << 11)) { - imm |= 0xfffff800; - } - riscv->reg[rd] = riscv->reg[rs1] + imm; + riscv->reg[rd] = (int)riscv->reg[rs1] + imm; } void ins_addiw(riscv_t* riscv, int rs1, int imm, int rd) { - if (imm & (1 << 11)) { - imm |= 0xfffff800; - } riscv->reg[rd] = riscv->reg[rs1] + imm; } @@ -167,9 +161,6 @@ void ins_and(riscv_t* riscv, int rs2, int rs1, int rd) { } void ins_andi(riscv_t* riscv, int rs1, int imm, int rd) { - if (imm & (1 << 11)) { - imm |= 0xfffff800; - } riscv->reg[rd] = riscv->reg[rs1] & imm; } @@ -273,31 +264,37 @@ void ins_jalr(riscv_t* riscv, int rs1, int imm, int rd) { void ins_lb(riscv_t* riscv, int rs1, int imm, int rd) { uint32_t addr = riscv->reg[rs1] + imm; + printf("lb %08x,imm=%d\n",addr,imm); riscv->reg[rd] = (int)mem_wrb(addr); } void ins_lbu(riscv_t* riscv, int rs1, int imm, int rd) { uint32_t addr = riscv->reg[rs1] + imm; + printf("lbu %08x,imm=%d\n",addr,imm); riscv->reg[rd] = mem_wrb(addr); } void ins_lh(riscv_t* riscv, int rs1, int imm, int rd) { uint32_t addr = riscv->reg[rs1] + imm; + printf("lh %08x,imm=%d\n",addr,imm); riscv->reg[rd] = (int)mem_wrh(addr); } void ins_lhu(riscv_t* riscv, int rs1, int imm, int rd) { uint32_t addr = riscv->reg[rs1] + imm; + printf("lhu %08x,imm=%d\n",addr,imm); riscv->reg[rd] = mem_wrh(addr); } void ins_lw(riscv_t* riscv, int rs1, int imm, int rd) { uint32_t addr = riscv->reg[rs1] + imm; + printf("lw %08x,imm=%d\n",addr,imm); riscv->reg[rd] = mem_wr(addr); } void ins_lwu(riscv_t* riscv, int rs1, int imm, int rd) { uint32_t addr = riscv->reg[rs1] + imm; + printf("lwu %08x,imm=%d\n",addr,imm); riscv->reg[rd] = mem_wr(addr); } @@ -315,24 +312,24 @@ void ins_or(riscv_t* riscv, int rs2, int rs1, int rd) { } void ins_ori(riscv_t* riscv, int rs1, int imm, int rd) { - if (imm & (1 << 11)) { - imm |= 0xfffff800; - } riscv->reg[rd] = riscv->reg[rs1] | imm; } void ins_sb(riscv_t* riscv, int rs2, int rs1, int imm) { uint32_t addr = riscv->reg[rs1] + imm; + printf("sb %08x,imm=%d\n",addr,imm); mem_wrb(addr) = riscv->reg[rs2]; } void ins_sh(riscv_t* riscv, int rs2, int rs1, int imm) { uint32_t addr = riscv->reg[rs1] + imm; + printf("sh %08x,imm=%d\n",addr,imm); mem_wrh(addr) = riscv->reg[rs2]; } void ins_sw(riscv_t* riscv, int rs2, int rs1, int imm) { uint32_t addr = riscv->reg[rs1] + imm; + printf("sw %08x,imm=%d\n",addr,imm); mem_wr(addr) = riscv->reg[rs2]; } @@ -357,16 +354,10 @@ void ins_slt(riscv_t* riscv, int rs2, int rs1, int rd) { } void ins_slti(riscv_t* riscv, int rs1, int imm, int rd) { - if (imm & (1 << 11)) { - imm |= 0xfffff800; - } riscv->reg[rd] = (int)riscv->reg[rs1] < imm; } void ins_sltiu(riscv_t* riscv, int rs1, int imm, int rd) { - if (imm & (1 << 11)) { - imm |= 0xfffff800; - } riscv->reg[rd] = riscv->reg[rs1] < (uint32_t)imm; } @@ -423,38 +414,51 @@ void ins_xor(riscv_t* riscv, int rs2, int rs1, int rd) { } void ins_xori(riscv_t* riscv, int rs1, int imm, int rd) { - if (imm & (1 << 11)) { - imm |= 0xfffff800; - } riscv->reg[rd] = riscv->reg[rs1] ^ imm; } - +// 不需要做符号扩展 #define imm_u_type(_ins,_imm) {\ _imm = (_ins >> 12) << 12;\ } +// 20位符号扩展 #define imm_j_type(_ins,_imm) {\ _imm = ((_ins >> 21) & 0x3ff) << 1;\ _imm |= ((_ins >> 20) & 1) << 11;\ _imm |= ((_ins >> 12) & 0xff) << 12;\ _imm |= ((_ins >> 31) & 1) << 20;\ - } + if(_imm&(1<<20)){\ + _imm|=0xfff00000;\ + }\ +} +// 12位符号扩展 #define imm_i_type(_ins,_imm) {\ _imm = (_ins >> 20) & 0xfff;\ + if(_imm&(1<<11)){\ + _imm|=0xfffff000;\ + }\ } +// 13位符号扩展 #define imm_b_type(_ins,_imm) {\ _imm = ((_ins >> 31) & 1) << 12;\ _imm |= ((_ins >> 7) & 0x1) << 11;\ _imm |= ((_ins >> 8) & 0xf) << 1;\ _imm |= ((_ins >> 25) & 0x1f) << 5;\ + if(_imm&(1<<12)){\ + _imm|=0xfffff000;\ + }\ } +// 12位符号扩展 #define imm_s_type(_ins,_imm) {\ _imm = ((_ins >> 7) & 0x1f);\ _imm |= (_ins >> 25) << 5;\ + if(_imm&(1<<11)){\ + _imm|=0xfffff000;\ + }\ } #define imm_csr(_ins,_imm) {\ @@ -516,7 +520,7 @@ int riscv_decode(riscv_t* riscv, uint32_t ins) { } break; case opcode_lb: - imm_i_type(imm, ins); + imm_i_type(ins, imm); switch (funct3) { case 0x0: @@ -539,7 +543,8 @@ int riscv_decode(riscv_t* riscv, uint32_t ins) { } break; case opcode_sb: - switch(funct3){ + imm_s_type(ins, imm); + switch (funct3) { case 0x0: ins_sb(riscv, rs2, rs1, imm); break; @@ -674,20 +679,59 @@ int riscv_init(riscv_t* riscv, uint32_t* rom, uint32_t rom_addr_base, uint32_t r } +int riscv_print(riscv_t* riscv) { + printf("x0(zero): %08x\n", riscv->zero); + printf("x1(ra): %08x\n", riscv->ra); + printf("x2(sp): %08x\n", riscv->sp); + printf("x3(gp): %08x\n", riscv->gp); + printf("x4(tp): %08x\n", riscv->tp); + printf("x5(t0): %08x\n", riscv->t0); + printf("x6(t1): %08x\n", riscv->t1); + printf("x7(t2): %08x\n", riscv->t2); + printf("x8(fp): %08x\n", riscv->fp); + printf("x9(s0): %08x\n", riscv->s0); + printf("x10(s1): %08x\n", riscv->s1); + printf("x11(a0): %08x\n", riscv->a0); + printf("x12(a1): %08x\n", riscv->a1); + printf("x13(a2): %08x\n", riscv->a2); + printf("x14(a3): %08x\n", riscv->a3); + printf("x15(a4): %08x\n", riscv->a4); + printf("x16(a5): %08x\n", riscv->a5); + printf("x17(a6): %08x\n", riscv->a6); + printf("x18(s2): %08x\n", riscv->s2); + printf("x19(s3): %08x\n", riscv->s3); + printf("x20(s4): %08x\n", riscv->s4); + printf("x21(s5): %08x\n", riscv->s5); + printf("x22(s6): %08x\n", riscv->s6); + printf("x23(s7): %08x\n", riscv->s7); + printf("x24(s8): %08x\n", riscv->s8); + printf("x25(s9): %08x\n", riscv->s9); + printf("x26(s10): %08x\n", riscv->s10); + printf("x27(s11): %08x\n", riscv->s11); + printf("x28(t3): %08x\n", riscv->t3); + printf("x29(t4): %08x\n", riscv->t4); + printf("x30(t5): %08x\n", riscv->t5); + printf("x31(t6): %08x\n", riscv->t6); +} + int riscv_run(riscv_t* riscv) { int ret = 0; - while(1) { - uint32_t instr = riscv->rom[(riscv->pc-riscv->rom_addr_base) >> 2]; - printf("pc: %08x instr: %08x\n", riscv->pc, instr); - riscv->pc += 4; - if(riscv->pc >= riscv->rom_addr_base + riscv->rom_size){ + uint32_t pc; + while (1) { + if(riscv->pc >= riscv->rom_addr_base + riscv->rom_size || riscv->pc < riscv->rom_addr_base){ printf("riscv run out of rom\n"); break; } - ret=riscv_decode(riscv, instr); - for (int i = 0;i < 32;i++) { - printf("reg[%d]: %08x\n", i, riscv->reg[i]); + uint32_t instr = riscv->rom[(riscv->pc-riscv->rom_addr_base) >> 2]; + printf("pc: %08x instr: %08x\n", riscv->pc, instr); + pc = riscv->pc; + ret = riscv_decode(riscv, instr); + riscv->zero = 0; + // 如果指令修改了pc,则以修改后的为准,如果pc未被修改,则继续执行下一条指令 + if (riscv->pc == pc) { + riscv->pc += 4; } + riscv_print(riscv); if(ret){ break; } diff --git a/make_riscv.py b/make_riscv.py index 63dc155..61df2ea 100644 --- a/make_riscv.py +++ b/make_riscv.py @@ -22,7 +22,7 @@ CFLAG=[ "-Wall", "-Werror", "-g", - "-Os", + "-O0", "-fno-omit-frame-pointer", "-msave-restore" ] diff --git a/riscv/main.c b/riscv/main.c index 50ff107..47c1865 100644 --- a/riscv/main.c +++ b/riscv/main.c @@ -1,10 +1,13 @@ +int add(int a, int b) { + return a+b; +} int main() { int a=1; int b=2; - int c=a+b; + int c = add(a, b); return c; } \ No newline at end of file diff --git a/riscv/start.S b/riscv/start.S index 4d2dad4..5d23165 100644 --- a/riscv/start.S +++ b/riscv/start.S @@ -3,6 +3,8 @@ .globl _start .type _start,@function +.extern main _start: - la sp, _sp \ No newline at end of file + la sp, _sp + j main \ No newline at end of file