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}