1 |
4 |
ericw |
`include "lg_sel_encode.h"
|
2 |
|
|
`include "tst_encode.h"
|
3 |
|
|
|
4 |
|
|
// `ifndef _op_encode_h_
|
5 |
|
|
// `define _op_encode_h_
|
6 |
|
|
|
7 |
|
|
// misc - 16 x 16 x 16 = 4096 codes
|
8 |
|
|
localparam [MEM_DATA_W-1:0] op_nop = { 4'h0, 4'h0, 4'hx, 4'hx }; // do nothing (no pops either)
|
9 |
|
|
localparam [MEM_DATA_W-1:0] op_pop = { 4'h0, 4'h1, 4'hx, 4'hx }; // pop [7:0] none/one/some/all stacks
|
10 |
|
|
localparam [MEM_DATA_W-1:0] op_pgc = { 4'h0, 4'h4, 4'hx, 4'hx }; // A=PC read PC (unsigned)
|
11 |
|
|
localparam [MEM_DATA_W-1:0] op_lit_s = { 4'h0, 4'h8, 4'hx, 4'hx }; // A=mem(PC) literal data signed
|
12 |
|
|
localparam [MEM_DATA_W-1:0] op_lit_h = { 4'h0, 4'h9, 4'hx, 4'hx }; // A={mem(PC),A[lo]} literal data high
|
13 |
|
|
localparam [MEM_DATA_W-1:0] op_lit_u = { 4'h0, 4'ha, 4'hx, 4'hx }; // A=mem(PC) literal data unsigned
|
14 |
|
|
localparam [MEM_DATA_W-1:0] op_reg_rs = { 4'h0, 4'hc, 4'hx, 4'hx }; // A=reg(B) register read signed
|
15 |
|
|
localparam [MEM_DATA_W-1:0] op_reg_rh = { 4'h0, 4'hd, 4'hx, 4'hx }; // A={reg(B),A[lo]} register read high
|
16 |
|
|
localparam [MEM_DATA_W-1:0] op_reg_w = { 4'h0, 4'he, 4'hx, 4'hx }; // reg(B)=A[lo] register write
|
17 |
|
|
localparam [MEM_DATA_W-1:0] op_reg_wh = { 4'h0, 4'hf, 4'hx, 4'hx }; // reg(B)=A[hi] register write high
|
18 |
|
|
// logical & other - 16 x 16 x 16 = 4096 codes
|
19 |
|
|
localparam [MEM_DATA_W-1:0] op_cpy = { 4'h1, `lg_cpy, 4'hx, 4'hx }; // A=B copy
|
20 |
|
|
localparam [MEM_DATA_W-1:0] op_nsg = { 4'h1, `lg_nsg, 4'hx, 4'hx }; // A[MSB]=~B[MSB] invert sign
|
21 |
|
|
localparam [MEM_DATA_W-1:0] op_not = { 4'h1, `lg_not, 4'hx, 4'hx }; // A=~B logical NOT
|
22 |
|
|
localparam [MEM_DATA_W-1:0] op_flp = { 4'h1, `lg_flp, 4'hx, 4'hx }; // A=flip(B) flip bits end for end
|
23 |
|
|
localparam [MEM_DATA_W-1:0] op_lzc = { 4'h1, `lg_lzc, 4'hx, 4'hx }; // A=lzc(B) leading zero count
|
24 |
|
|
localparam [MEM_DATA_W-1:0] op_bra = { 4'h1, `lg_bra, 4'hx, 4'hx }; // A=&B logical AND bit reduction
|
25 |
|
|
localparam [MEM_DATA_W-1:0] op_bro = { 4'h1, `lg_bro, 4'hx, 4'hx }; // A=|B logical OR bit reduction
|
26 |
|
|
localparam [MEM_DATA_W-1:0] op_brx = { 4'h1, `lg_brx, 4'hx, 4'hx }; // A=^B logical XOR bit reduction
|
27 |
|
|
localparam [MEM_DATA_W-1:0] op_and = { 4'h1, `lg_and, 4'hx, 4'hx }; // A=A&B logical AND
|
28 |
|
|
localparam [MEM_DATA_W-1:0] op_orr = { 4'h1, `lg_orr, 4'hx, 4'hx }; // A=A|B logical OR
|
29 |
|
|
localparam [MEM_DATA_W-1:0] op_xor = { 4'h1, `lg_xor, 4'hx, 4'hx }; // A=A^B logical XOR
|
30 |
|
|
// arithmetic - 16 x 16 x 16 = 4096 codes
|
31 |
|
|
localparam [MEM_DATA_W-1:0] op_add = { 4'h2, 4'h0, 4'hx, 4'hx }; // A=A+B add
|
32 |
|
|
localparam [MEM_DATA_W-1:0] op_add_xs = { 4'h2, 4'h2, 4'hx, 4'hx }; // A=A+B add extended signed
|
33 |
|
|
localparam [MEM_DATA_W-1:0] op_add_xu = { 4'h2, 4'h3, 4'hx, 4'hx }; // A=A+B add extended unsigned
|
34 |
|
|
localparam [MEM_DATA_W-1:0] op_sub = { 4'h2, 4'h4, 4'hx, 4'hx }; // A=A-B subtract
|
35 |
|
|
localparam [MEM_DATA_W-1:0] op_sub_xs = { 4'h2, 4'h6, 4'hx, 4'hx }; // A=A-B subtract extended signed
|
36 |
|
|
localparam [MEM_DATA_W-1:0] op_sub_xu = { 4'h2, 4'h7, 4'hx, 4'hx }; // A=A-B subtract extended unsigned
|
37 |
|
|
localparam [MEM_DATA_W-1:0] op_mul = { 4'h2, 4'h8, 4'hx, 4'hx }; // A=A*B multiply
|
38 |
|
|
localparam [MEM_DATA_W-1:0] op_mul_xs = { 4'h2, 4'ha, 4'hx, 4'hx }; // A=A*B multiply extended signed
|
39 |
|
|
localparam [MEM_DATA_W-1:0] op_mul_xu = { 4'h2, 4'hb, 4'hx, 4'hx }; // A=A*B multiply extended unsigned
|
40 |
|
|
localparam [MEM_DATA_W-1:0] op_shl_s = { 4'h2, 4'hc, 4'hx, 4'hx }; // A=A<<<B shift left A signed
|
41 |
|
|
localparam [MEM_DATA_W-1:0] op_shl_u = { 4'h2, 4'hd, 4'hx, 4'hx }; // A=A<<B shift left A unsigned
|
42 |
|
|
localparam [MEM_DATA_W-1:0] op_pow = { 4'h2, 4'he, 4'hx, 4'hx }; // A=1<<B power of 2
|
43 |
|
|
// branching - 16 x 16 x 16 = 4096 codes
|
44 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_z = { 4'h3, 2'b00, `z, 4'hx, 4'hx }; // PC=(A?0)?PC+B jump zero conditional
|
45 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_nz = { 4'h3, 2'b00, `nz, 4'hx, 4'hx };
|
46 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_lz = { 4'h3, 2'b00, `lz, 4'hx, 4'hx };
|
47 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_nlz = { 4'h3, 2'b00, `nlz, 4'hx, 4'hx };
|
48 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp = { 4'h3, 4'hc, 4'hx, 4'hx }; // PC=PC+B jump unconditional
|
49 |
|
|
localparam [MEM_DATA_W-1:0] op_gto = { 4'h3, 4'hd, 4'hx, 4'hx }; // PC=B go to unconditional
|
50 |
|
|
localparam [MEM_DATA_W-1:0] op_gsb = { 4'h3, 4'he, 4'hx, 4'hx }; // PC=B,A=PC subroutine call unconditional
|
51 |
|
|
// immediate memory access - 4 x 16 x 16 x 16 = 16384 codes
|
52 |
|
|
localparam [MEM_DATA_W-1:0] op_mem_irs = { 4'h4, 4'hx, 4'hx, 4'hx }; // A=mem(B+I) memory read signed
|
53 |
|
|
localparam [MEM_DATA_W-1:0] op_mem_irh = { 4'h5, 4'hx, 4'hx, 4'hx }; // A={mem(B+I),A[lo]} memory read high
|
54 |
|
|
localparam [MEM_DATA_W-1:0] op_mem_iw = { 4'h6, 4'hx, 4'hx, 4'hx }; // mem(B+I)=A[lo] memory write
|
55 |
|
|
localparam [MEM_DATA_W-1:0] op_mem_iwh = { 4'h7, 4'hx, 4'hx, 4'hx }; // mem(B+I)=A[hi] memory write high
|
56 |
|
|
// immediate conditional (A?B) jumps - 6 x 16 x 16 x 16 = 24576 codes
|
57 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_ie = { `e, 4'hx, 4'hx, 4'hx }; // PC=(A?B)?PC+I jump immediate conditional
|
58 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_ine = { `ne, 4'hx, 4'hx, 4'hx };
|
59 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_ils = { `ls, 4'hx, 4'hx, 4'hx };
|
60 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_inls = { `nls, 4'hx, 4'hx, 4'hx };
|
61 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_ilu = { `lu, 4'hx, 4'hx, 4'hx };
|
62 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_inlu = { `nlu, 4'hx, 4'hx, 4'hx };
|
63 |
|
|
// immediate conditional (A?0) jumps - 4 x 64 x 16 = 4096 codes
|
64 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_iz = { 4'he, `z, 6'bxxxxxx, 4'hx }; // PC=(A?0)?PC+I jump immediate conditional
|
65 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_inz = { 4'he, `nz, 6'bxxxxxx, 4'hx };
|
66 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_ilz = { 4'he, `lz, 6'bxxxxxx, 4'hx };
|
67 |
|
|
localparam [MEM_DATA_W-1:0] op_jmp_inlz = { 4'he, `nlz, 6'bxxxxxx, 4'hx };
|
68 |
|
|
// immediate data - 1 x 64 x 16 = 1024 codes
|
69 |
|
|
localparam [MEM_DATA_W-1:0] op_dat_is = { 4'hf, 2'b00, 6'bxxxxxx, 4'hx }; // A=I data immediate signed
|
70 |
|
|
// immediate add - 1 x 64 x 16 = 1024 codes
|
71 |
|
|
localparam [MEM_DATA_W-1:0] op_add_is = { 4'hf, 2'b01, 6'bxxxxxx, 4'hx }; // A=A+I add immediate signed
|
72 |
|
|
// immediate shifts - 2 x 64 x 16 = 2048 codes
|
73 |
|
|
localparam [MEM_DATA_W-1:0] op_shl_is = { 4'hf, 2'b10, 6'bxxxxxx, 4'hx }; // A=A<<<I shift left A signed
|
74 |
|
|
localparam [MEM_DATA_W-1:0] op_psu_i = { 4'hf, 2'b11, 6'bxxxxxx, 4'hx }; // A=1<<I power of 2; A=A<<I shift A unsigned
|
75 |
|
|
|
76 |
|
|
// `endif // _op_encode_h_
|
77 |
|
|
|