模拟cpu成功运行

This commit is contained in:
2025-04-17 11:14:53 +08:00
parent ed0144b2ce
commit 1eb2785984
4 changed files with 183 additions and 11 deletions

View File

@@ -90,7 +90,7 @@
#define MEM_SIZE 1024*1024
#define MEM_ADDR_BASE 0x100000000
#define MEM_ADDR_BASE 0x10000000
#define zero reg[0]
#define ra reg[1]
@@ -670,20 +670,24 @@ int riscv_init(riscv_t* riscv, uint32_t* rom, uint32_t rom_addr_base, uint32_t r
riscv->rom = rom;
riscv->rom_size = rom_size;
riscv->rom_addr_base = rom_addr_base;
riscv->pc = 0;
riscv->pc = riscv->rom_addr_base;
}
int riscv_run(riscv_t* riscv) {
int ret = 0;
while(1) {
uint32_t instr = riscv->rom[riscv->pc >> 2];
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){
printf("riscv run out of rom");
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]);
}
if(ret){
break;
}
@@ -729,12 +733,14 @@ int thread_fun(void* t)
printf("open file error\n");
return -1;
}
riscv.rom_size=get_file_size(file);
riscv.rom=calloc((riscv.rom_size+3)/4,4);
riscv.rom_size = get_file_size(file);
printf("rom size: %d\n", riscv.rom_size);
riscv.rom = calloc((riscv.rom_size + 3) / 4, 4);
fread(riscv.rom, 1, riscv.rom_size, file);
fclose(file);
riscv_init(&riscv,riscv.rom,0x80000000,riscv.rom_size);
riscv_init(&riscv, riscv.rom, 0x80000000, riscv.rom_size);
riscv_run(&riscv);
return 0;
}