code wiki / _hdl_build / nx_rv64_run_bin.nx
nx_rv64_run_bin.nx source
↩ module page · 40 lines · 2511 B
1// nx_rv64_run_bin.nx -- generic loader: reads knowledge/hw/runbin.bin (a flat RV64 binary), runs it on the golden
2// behavioral sim (full privileged CPU + UART), and prints the UART output as "SIMUART: <hex>". Used by the real-C
3// conformance harness to run each gcc-compiled program on the sovereign emulator and diff vs QEMU. expect_exit: 0
4import "nx_syscalls.nx"
5import "nishi_hdl_primitives.nx"
6import "rv64im_min_decoder.nx"
7import "rv64im_min_alu.nx"
8import "rv64im_min_regfile.nx"
9import "rv64im_min_csr.nx"
10import "rv64im_min_clint.nx"
11import "rv64im_min_uart.nx"
12import "rv64im_min_virtio.nx"
13import "rv64im_min_mmu.nx"
14import "rv64im_min_sim.nx"
15const DMEM_MAGIC_500000000: i64 = 500000000
16
17func g_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
18func g_h2(v: i64) -> i64 { let b: *u8=sys_mmap(4); let n0: i64=(v>>4)&15; let n1: i64=v&15; if n0<10 { b[0]=(48+n0) as u8 } else { b[0]=(87+n0) as u8 } if n1<10 { b[1]=(48+n1) as u8 } else { b[1]=(87+n1) as u8 } sys_write(1,b,2); return 0 }
19
20const DMEM_BASE: i64 = 0x80000000
21const DMEM_SIZE: i64 = 262144 // 256KB -- room for a real program's stack + globals
22
23func main() -> i64 {
24 let lenbox: *i64=sys_mmap(16) as *i64
25 let code: *u8=sys_read_file("knowledge/hw/runbin.bin" as *u8, lenbox)
26 if (code as i64)==0 { g_puts("SIMUART: NOFILE\n" as *u8); sys_exit(1); return 1 }
27 let nb: i64=lenbox[0]
28 let rf_storage: *i64=sys_mmap(8*NX_RV64IM_RF_N_REGS) as *i64; let csr_storage: *i64=sys_mmap(8*NX_CSR_SLOT_N) as *i64
29 let clint_storage: *i64=sys_mmap(8*NX_CLINT_SLOT_N) as *i64; let uart_storage: *i64=sys_mmap(8*NX_UART_SLOT_N) as *i64
30 let mem: *u8=sys_mmap(DMEM_SIZE); let tx_buf: *u8=sys_mmap(512)
31 let rf: *NxRv64imRegfile=sys_mmap(64) as *NxRv64imRegfile; let csr: *NxRv64imCsrFile=sys_mmap(64) as *NxRv64imCsrFile
32 let clint: *NxClint=sys_mmap(64) as *NxClint; let uart: *NxUart=sys_mmap(64) as *NxUart; let sim: *NxRv64imSim=sys_mmap(128) as *NxRv64imSim
33 nx_rv64im_rf_init(rf, rf_storage); nx_rv64im_csr_init(csr, csr_storage, 0); nx_clint_init(clint, clint_storage); nx_uart_init(uart, uart_storage, tx_buf, 512)
34 nx_rv64im_sim_init(sim, rf, csr, clint, uart, DMEM_BASE, mem, DMEM_SIZE, 0)
35 var i: i64=0; while i<nb { mem[i]=code[i]; i=i+1 }
36 nx_rv64im_sim_run(sim, DMEM_MAGIC_500000000)
37 let n: i64=nx_uart_tx_count(uart)
38 g_puts("SIMUART: " as *u8); i=0; while i<n { g_h2(tx_buf[i] as i64); i=i+1 } g_puts("\n" as *u8)
39 sys_exit(0); return 0
40}