1 |
3 |
ericw |
//
|
2 |
|
|
`define nn 3'b000
|
3 |
|
|
`define eq 3'b001
|
4 |
|
|
`define lt 3'b010
|
5 |
|
|
`define le 3'b011
|
6 |
|
|
`define gt 3'b100
|
7 |
|
|
`define ge 3'b101
|
8 |
|
|
`define gl 3'b110
|
9 |
|
|
`define yy 3'b111
|
10 |
|
|
//
|
11 |
|
|
localparam OP_W = 10;
|
12 |
|
|
//
|
13 |
|
|
// immediate read - 32 codes
|
14 |
|
|
localparam [OP_W-1:0] op_rd_i = { 2'b00, `nn, 1'b0, 4'bxxxx }; // mem(B+I[3:0]) => A read immediate w/ offset (signed)
|
15 |
|
|
localparam [OP_W-1:0] op_rd_ix = { 2'b00, `nn, 1'b1, 4'bxxxx }; // {mem(B+I[3:0]), A[lo]} => A read immediate extended w/ offset
|
16 |
|
|
// immediate conditional jump - 192 codes
|
17 |
|
|
localparam [OP_W-1:0] op_jmp_iez = { 2'b00, `eq, 5'bxxxxx }; // (A?0) PC+I[4:0] => PC jump relative immediate conditional
|
18 |
|
|
localparam [OP_W-1:0] op_jmp_ilz = { 2'b00, `lt, 5'bxxxxx };
|
19 |
|
|
localparam [OP_W-1:0] op_jmp_ilez = { 2'b00, `le, 5'bxxxxx };
|
20 |
|
|
localparam [OP_W-1:0] op_jmp_igz = { 2'b00, `gt, 5'bxxxxx };
|
21 |
|
|
localparam [OP_W-1:0] op_jmp_igez = { 2'b00, `ge, 5'bxxxxx };
|
22 |
|
|
localparam [OP_W-1:0] op_jmp_iglz = { 2'b00, `gl, 5'bxxxxx };
|
23 |
|
|
// immediate unconditional jump - 32 codes
|
24 |
|
|
localparam [OP_W-1:0] op_jmp_i = { 2'b00, `yy, 5'bxxxxx };
|
25 |
|
|
// immediate write - 32 codes
|
26 |
|
|
localparam [OP_W-1:0] op_wr_i = { 2'b01, `nn, 1'b0, 4'bxxxx }; // A[lo] => mem(B+I[3:0]) write immediate w/ offset
|
27 |
|
|
localparam [OP_W-1:0] op_wr_ix = { 2'b01, `nn, 1'b1, 4'bxxxx }; // A[hi] => mem(B+I[3:0]) write immediate extended w/ offset
|
28 |
|
|
// immediate conditional jump - 192 codes
|
29 |
|
|
localparam [OP_W-1:0] op_jmp_ie = { 2'b01, `eq, 5'bxxxxx }; // (A?B) PC+I[4:0] => PC jump relative immediate conditional
|
30 |
|
|
localparam [OP_W-1:0] op_jmp_il = { 2'b01, `lt, 5'bxxxxx };
|
31 |
|
|
localparam [OP_W-1:0] op_jmp_ile = { 2'b01, `le, 5'bxxxxx };
|
32 |
|
|
localparam [OP_W-1:0] op_jmp_iug = { 2'b01, `gt, 5'bxxxxx };
|
33 |
|
|
localparam [OP_W-1:0] op_jmp_iuge = { 2'b01, `ge, 5'bxxxxx };
|
34 |
|
|
localparam [OP_W-1:0] op_jmp_igl = { 2'b01, `gl, 5'bxxxxx };
|
35 |
|
|
// 32 unused codes //
|
36 |
|
|
// immediate byte - 256 codes
|
37 |
|
|
localparam [OP_W-1:0] op_byt_i = { 2'b10, 8'bxxxxxxxx }; // I[7:0] => A byte immediate (signed)
|
38 |
|
|
// immediate shift - 128 codes
|
39 |
|
|
localparam [OP_W-1:0] op_shl_i = { 4'hc, 6'bxxxxxx }; // A<<I => A shift left A (signed) immediate
|
40 |
|
|
localparam [OP_W-1:0] op_shl_iu = { 4'hd, 6'bxxxxxx }; // 1<<I | A<<I => A shift left immediate unsigned
|
41 |
|
|
// immediate add - 64 codes
|
42 |
|
|
localparam [OP_W-1:0] op_add_i = { 4'he, 6'bxxxxxx }; // A+I[5:0] => A add immediate (I signed)
|
43 |
|
|
// conditional jump - 7 of 8 codes
|
44 |
|
|
localparam [OP_W-1:0] op_jmp_ez = { 4'hf, 3'b000, `eq }; // (A?0) PC+B[lo] => PC jump relative conditional
|
45 |
|
|
localparam [OP_W-1:0] op_jmp_lz = { 4'hf, 3'b000, `lt };
|
46 |
|
|
localparam [OP_W-1:0] op_jmp_lez = { 4'hf, 3'b000, `le };
|
47 |
|
|
localparam [OP_W-1:0] op_jmp_gz = { 4'hf, 3'b000, `gt };
|
48 |
|
|
localparam [OP_W-1:0] op_jmp_gez = { 4'hf, 3'b000, `ge };
|
49 |
|
|
localparam [OP_W-1:0] op_jmp_glz = { 4'hf, 3'b000, `gl };
|
50 |
|
|
localparam [OP_W-1:0] op_jmp = { 4'hf, 3'b000, `yy };
|
51 |
|
|
// conditional goto - 7 of 8 codes
|
52 |
|
|
localparam [OP_W-1:0] op_gto_ez = { 4'hf, 3'b001, `eq }; // (A?0) B[lo] => PC jump absolute conditional
|
53 |
|
|
localparam [OP_W-1:0] op_gto_lz = { 4'hf, 3'b001, `lt };
|
54 |
|
|
localparam [OP_W-1:0] op_gto_lez = { 4'hf, 3'b001, `le };
|
55 |
|
|
localparam [OP_W-1:0] op_gto_gz = { 4'hf, 3'b001, `gt };
|
56 |
|
|
localparam [OP_W-1:0] op_gto_gez = { 4'hf, 3'b001, `ge };
|
57 |
|
|
localparam [OP_W-1:0] op_gto_glz = { 4'hf, 3'b001, `gl };
|
58 |
|
|
localparam [OP_W-1:0] op_gto = { 4'hf, 3'b001, `yy };
|
59 |
|
|
// singles - 48 codes
|
60 |
|
|
localparam [OP_W-1:0] op_add = { 4'hf, 2'b01, 4'h0 }; // A+B => A add
|
61 |
|
|
localparam [OP_W-1:0] op_add_x = { 4'hf, 2'b01, 4'h2 }; // A+B => A add extended (signed)
|
62 |
|
|
localparam [OP_W-1:0] op_add_ux = { 4'hf, 2'b01, 4'h3 }; // A+B => A add extended unsigned
|
63 |
|
|
localparam [OP_W-1:0] op_sub = { 4'hf, 2'b01, 4'h4 }; // A-B => A subtract
|
64 |
|
|
localparam [OP_W-1:0] op_sub_x = { 4'hf, 2'b01, 4'h6 }; // A-B => A subtract extended (signed)
|
65 |
|
|
localparam [OP_W-1:0] op_sub_ux = { 4'hf, 2'b01, 4'h7 }; // A-B => A subtract extended unsigned
|
66 |
|
|
localparam [OP_W-1:0] op_mul = { 4'hf, 2'b01, 4'h8 }; // A*B => A multiply
|
67 |
|
|
localparam [OP_W-1:0] op_mul_x = { 4'hf, 2'b01, 4'ha }; // A*B => A multiply extended (signed)
|
68 |
|
|
localparam [OP_W-1:0] op_mul_ux = { 4'hf, 2'b01, 4'hb }; // A*B => A multiply extended unsigned
|
69 |
|
|
localparam [OP_W-1:0] op_shl = { 4'hf, 2'b01, 4'hc }; // A<<B => A shift left A (signed)
|
70 |
|
|
localparam [OP_W-1:0] op_shl_u = { 4'hf, 2'b01, 4'hd }; // 1<<B | A<<B => A 2^B | shift left A unsigned
|
71 |
|
|
//
|
72 |
|
|
localparam [OP_W-1:0] op_and = { 4'hf, 2'b10, 4'h0 }; // A&B => A logical AND
|
73 |
|
|
localparam [OP_W-1:0] op_or = { 4'hf, 2'b10, 4'h1 }; // A|B => A logical OR
|
74 |
|
|
localparam [OP_W-1:0] op_xor = { 4'hf, 2'b10, 4'h2 }; // A^B => A logical XOR
|
75 |
|
|
localparam [OP_W-1:0] op_not = { 4'hf, 2'b10, 4'h3 }; // ~B => A logical NOT
|
76 |
|
|
localparam [OP_W-1:0] op_and_b = { 4'hf, 2'b10, 4'h4 }; // &B => A logical AND bit reduction
|
77 |
|
|
localparam [OP_W-1:0] op_or_b = { 4'hf, 2'b10, 4'h5 }; // |B => A logical OR bit reduction
|
78 |
|
|
localparam [OP_W-1:0] op_xor_b = { 4'hf, 2'b10, 4'h6 }; // ^B => A logical XOR bit reduction
|
79 |
|
|
//
|
80 |
|
|
localparam [OP_W-1:0] op_lit = { 4'hf, 2'b11, 4'h0 }; // mem(PC) => A literal low (signed)
|
81 |
|
|
localparam [OP_W-1:0] op_lit_u = { 4'hf, 2'b11, 4'h1 }; // mem(PC) => A literal low unsigned
|
82 |
|
|
localparam [OP_W-1:0] op_lit_x = { 4'hf, 2'b11, 4'h2 }; // {mem(PC),A[lo]} => A literal extended
|
83 |
|
|
localparam [OP_W-1:0] op_cpy = { 4'hf, 2'b11, 4'h4 }; // B => A copy
|
84 |
|
|
localparam [OP_W-1:0] op_pc = { 4'hf, 2'b11, 4'h8 }; // PC => A read PC (unsigned)
|
85 |
|
|
localparam [OP_W-1:0] op_gsb = { 4'hf, 2'b11, 4'h9 }; // B[lo] => PC, PC => A subroutine call
|
86 |
|
|
localparam [OP_W-1:0] op_cls = { 4'hf, 2'b11, 4'hc }; // clear stacks
|
87 |
|
|
localparam [OP_W-1:0] op_pop = { 4'hf, 2'b11, 4'he }; // do nothing (but allow pops)
|
88 |
|
|
localparam [OP_W-1:0] op_nop = { 4'hf, 2'b11, 4'hf }; // do nothing (no pops either)
|