code wiki / _hdl_build / nx_decoder_imm_mem_test.nx

nx_decoder_imm_mem_test.nx source

↩ module page · 83 lines · 3370 B

1// nx_decoder_imm_mem_test.nx -- FUNCTIONAL gate-level verify of the I/S/B/U/J immediate decoders. 2// Builds nx_decoder_imm_build into a MEM sink, runs the gate-sim over 200 random instructions and 3// diffs each immediate net against the behavioral oracle nx_rv64im_imm_i/s/b/u/j (sign-extension 4// included -- the gate ORs the extend mask exactly as the oracle). Per-format mismatch counts must 5// all be 0. KAT: I-imm of addi x1,x0,-1 (0xFFF00093) = -1. Sovereign. 6// license_tier: ORIGINAL expect_exit: 0 7import "nx_decoder_select.nx" 8import "rv64im_min_decoder.nx" 9 10func _emit_cstr(s: *u8) -> i64 { 11 var n: i64 = 0 12 while s[n] != (0 as u8) { n = n + 1 } 13 sys_write(1, s, n) 14 return 0 15} 16func _emit_dec(v: i64) -> i64 { 17 let b: *u8 = sys_mmap(28) 18 let t2: *u8 = sys_mmap(28) 19 var n: i64 = v 20 if n < 0 { sys_write(1, "-" as *u8, 1); n = 0 - n } 21 var t: i64 = 0 22 if n == 0 { t2[0] = 48; t = 1 } 23 while n > 0 { t2[t] = 48 + (n % 10); n = n / 10; t = t + 1 } 24 var i: i64 = 0 25 while i < t { b[i] = t2[t - 1 - i]; i = i + 1 } 26 sys_write(1, b, t) 27 return 0 28} 29 30func main() -> i64 { 31 let cells: *NxGsimCell = sys_mmap(48 * 1024) as *NxGsimCell 32 let vals: *i64 = sys_mmap(8 * 1024) as *i64 33 let g: *NxGsim = sys_mmap(64) as *NxGsim 34 g.cells = cells 35 g.vals = vals 36 let k: *NxCellSink = sys_mmap(64) as *NxCellSink 37 38 g.n_nets = 1 // net 0 = inst 39 g.n_cells = 0 40 nx_sink_init_mem(k, g) 41 let outs: *i64 = sys_mmap(8 * 6) as *i64 42 nx_decoder_imm_build(k, 0, outs) 43 44 let mm: *i64 = sys_mmap(8 * 6) as *i64 // per-format mismatch counts 45 mm[0] = 0; mm[1] = 0; mm[2] = 0; mm[3] = 0; mm[4] = 0 46 47 var seed: i64 = 777777 48 var n: i64 = 0 49 while n < 200 { 50 seed = (seed * 1103515245 + 12345) & 2147483647 51 let hi: i64 = seed & 65535 52 seed = (seed * 1103515245 + 12345) & 2147483647 53 let lo: i64 = seed & 65535 54 let inst: i64 = (hi << 16) | lo 55 g.vals[0] = inst 56 if nx_gsim_run(g) != NX_GSIM_OK { sys_exit(40); return 40 } 57 if g.vals[outs[0]] != nx_rv64im_imm_i(inst) { mm[0] = mm[0] + 1 } 58 if g.vals[outs[1]] != nx_rv64im_imm_s(inst) { mm[1] = mm[1] + 1 } 59 if g.vals[outs[2]] != nx_rv64im_imm_b(inst) { mm[2] = mm[2] + 1 } 60 if g.vals[outs[3]] != nx_rv64im_imm_u(inst) { mm[3] = mm[3] + 1 } 61 if g.vals[outs[4]] != nx_rv64im_imm_j(inst) { mm[4] = mm[4] + 1 } 62 n = n + 1 63 } 64 _emit_cstr("imm mismatches I=" as *u8); _emit_dec(mm[0]) 65 _emit_cstr(" S=" as *u8); _emit_dec(mm[1]) 66 _emit_cstr(" B=" as *u8); _emit_dec(mm[2]) 67 _emit_cstr(" U=" as *u8); _emit_dec(mm[3]) 68 _emit_cstr(" J=" as *u8); _emit_dec(mm[4]); _emit_cstr("\n" as *u8) 69 70 // KAT: addi x1,x0,-1 = 0xFFF00093 -> I-imm = -1 71 let kat: i64 = 4293918867 // 0xFFF00093 72 g.vals[0] = kat 73 if nx_gsim_run(g) != NX_GSIM_OK { sys_exit(41); return 41 } 74 let kati: i64 = g.vals[outs[0]] 75 _emit_cstr("KAT I-imm(0xFFF00093)=" as *u8); _emit_dec(kati); _emit_cstr(" expect -1\n" as *u8) 76 77 var total: i64 = mm[0] + mm[1] + mm[2] + mm[3] + mm[4] 78 if total != 0 { sys_exit(1); return 1 } 79 if kati != (0 - 1) { sys_exit(2); return 2 } 80 _emit_cstr("decoder IMMEDIATES gate-verify PASS (I/S/B/U/J, 1000 checks 0 mismatch; sext KAT exact)\n" as *u8) 81 sys_exit(0) 82 return 0 83}