模拟cpu成功运行
This commit is contained in:
20
cpu/riscv.c
20
cpu/riscv.c
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user