code wiki / _hdl_build / nx_decoder_kind_mem_test.nx

nx_decoder_kind_mem_test.nx source

↩ module page · 96 lines · 3966 B

1// nx_decoder_kind_mem_test.nx -- FUNCTIONAL gate-level verify of the decoder opcode->KIND classifier. 2// Builds the field extracts + the kind classifier (nx_decoder_kind_build) into a MEM sink, runs the 3// gate-sim over 200 random instructions diffing kind vs the behavioral oracle nx_rv64im_decode_kind, 4// then 6 KATs that exercise the hard M-extension disambiguation (add/mul/div + addi/lui + invalid). 5// The mul KAT (=14, NOT 9=OP) is itself the teeth: it proves the funct7 overlay actually fires. 6// Mirrors nx_alu_select_mem_test. Sovereign. 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 { 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_fields_build(k, 0, outs) 43 let kind: i64 = nx_decoder_kind_build(k, outs[0], outs[5], outs[2]) // opcode, funct7, funct3 44 45 // ---- random verify vs oracle ---- 46 var seed: i64 = 88172645 47 var n: i64 = 0 48 var mism: i64 = 0 49 var n_valid: i64 = 0 50 while n < 200 { 51 seed = (seed * 1103515245 + 12345) & 2147483647 52 let hi: i64 = seed & 65535 53 seed = (seed * 1103515245 + 12345) & 2147483647 54 let lo: i64 = seed & 65535 55 let inst: i64 = (hi << 16) | lo 56 g.vals[0] = inst 57 if nx_gsim_run(g) != NX_GSIM_OK { sys_exit(40); return 40 } 58 let beh: i64 = nx_rv64im_decode_kind(inst) 59 if g.vals[kind] != beh { mism = mism + 1 } 60 if beh != 0 { n_valid = n_valid + 1 } 61 n = n + 1 62 } 63 _emit_cstr("kind random: checks=" as *u8); _emit_dec(n) 64 _emit_cstr(" mismatches=" as *u8); _emit_dec(mism) 65 _emit_cstr(" valid-opcodes-hit=" as *u8); _emit_dec(n_valid); _emit_cstr("\n" as *u8) 66 67 // ---- KATs (exercise the M-extension overlay) ---- 68 let kats: *i64 = sys_mmap(8 * 12) as *i64 69 let exp: *i64 = sys_mmap(8 * 12) as *i64 70 kats[0] = 2130355; exp[0] = 9 // 0x002081B3 add x3,x1,x2 -> OP 71 kats[1] = 35684787; exp[1] = 14 // 0x022081B3 mul -> M_MUL (funct7 overlay -> not 9) 72 kats[2] = 35701171; exp[2] = 15 // div (f7=1,f3=4) -> M_DIV 73 kats[3] = 183; exp[3] = 1 // 0x000000B7 lui -> LUI 74 kats[4] = 147; exp[4] = 8 // 0x00000093 addi -> OP_IMM 75 kats[5] = 127; exp[5] = 0 // opcode 0x7f bogus -> INVALID 76 var kat_ok: i64 = 1 77 var i: i64 = 0 78 while i < 6 { 79 g.vals[0] = kats[i] 80 if nx_gsim_run(g) != NX_GSIM_OK { sys_exit(41); return 41 } 81 let got: i64 = g.vals[kind] 82 if got != exp[i] { kat_ok = 0 } 83 _emit_cstr(" KAT inst=" as *u8); _emit_dec(kats[i]) 84 _emit_cstr(" kind=" as *u8); _emit_dec(got) 85 _emit_cstr(" expect=" as *u8); _emit_dec(exp[i]); _emit_cstr("\n" as *u8) 86 i = i + 1 87 } 88 89 // ---- verdict ---- 90 if mism != 0 { sys_exit(1); return 1 } 91 if kat_ok != 1 { sys_exit(2); return 2 } 92 if n_valid < 1 { sys_exit(3); return 3 } // at least some valid opcodes exercised 93 _emit_cstr("decoder KIND gate-verify PASS (200 random 0 mismatch; 6 KATs incl M-ext exact)\n" as *u8) 94 sys_exit(0) 95 return 0 96}