summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_isa.sv
blob: cc34156dc690f7cccb8637e7520ab0b39669dc87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package gfx_isa;

	typedef logic[3:0] sgpr_num;
	typedef logic[2:0] vgpr_num;

	typedef logic signed[7:0] pc_offset;

	typedef struct packed
	{
		sgpr_num sgpr;
	} xgpr_sgpr;

	typedef struct packed
	{
		logic[$bits(sgpr_num) - $bits(vgpr_num) - 1:0] reserved;
		vgpr_num                                       vgpr;
	} xgpr_vgpr;

	typedef xgpr_vgpr xgpr_num;

	typedef enum logic[1:0]
	{
		REGS_SVS = 2'b00,
		REGS_SSS = 2'b01,
		REGS_VVS = 2'b10,
		REGS_VVV = 2'b11
	} xgpr_mode;

	typedef struct packed
	{
		logic[12:0] imm;
	} dst_src_rr_b_imm;

	typedef struct packed
	{
		logic      from_consts;
		logic[7:0] reserved;
		xgpr_num   r;
	} dst_src_rr_b_read;

	typedef struct packed
	{
		logic             b_is_imm;
		dst_src_rr_b_read b;
		xgpr_num          ra,
		                  rd;
	} dst_src_rr;

	typedef enum logic[1:0]
	{
		INSN_FPINT = 2'd0,
		INSN_MEM   = 2'd1,
		INSN_SFU   = 2'd2,
		INSN_GROUP = 2'd3
	} insn_class;

	typedef enum logic[4:0]
	{
		INSN_FPINT_MOV  = 5'd0,
		INSN_FPINT_FMUL = 5'd1,
		INSN_FPINT_IMUL = 5'd2,
		INSN_FPINT_FADD = 5'd3,
		INSN_FPINT_RES4 = 5'd4,
		INSN_FPINT_FMAX = 5'd5,
		INSN_FPINT_RES6 = 5'd6,
		INSN_FPINT_FMIN = 5'd7,
		INSN_FPINT_RES8 = 5'd8,
		INSN_FPINT_FCVT = 5'd9,
		INSN_FPINT_RES[10:31]
	} insn_fpint_op;

	typedef struct packed
	{
		xgpr_mode     reg_mode;
		dst_src_rr    dst_src;
		logic         reg_rev;
		insn_fpint_op op;
		insn_class    op_class;
	} insn_fpint;

	typedef struct packed
	{
		xgpr_mode   reg_mode;
		dst_src_rr  dst_src;
		logic       reg_rev;
		logic[4:0]  op_data;
		insn_class  op_class;
	} insn_any;

endpackage