-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathControl.sv
More file actions
139 lines (124 loc) · 4.21 KB
/
Copy pathControl.sv
File metadata and controls
139 lines (124 loc) · 4.21 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2024/04/30 8:26:09
// Design Name:
// Module Name: Control
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
// 添加了minyRV的支持, 剩余内存屏障、控制终端、csr等10条指令
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module Control(
input logic [6:0] opcode,
output logic [1:0] NpcOp, //
output logic RegWrite, //
output logic [1:0] MemToReg, //_mux wb
output logic MemWrite, //
output logic OffsetOrigin, //_npc
output logic ALUSrc_B, //_mux alu B
output logic ALUSrc_A //_mux alu A (0: rs1, 1: PC)
);
always_comb begin
// Default values:最好不要修改
NpcOp = 2'b00; // PC+4 ,01:条件跳转 10:jalr 指令,npc = Result & ~1
// 11:jal 指令,npc = pc + offset
RegWrite = 1'b0;
MemToReg = 2'b00; // 00: ALU result, 01: memory data, 10: PC+4
// 11: immgen
MemWrite = 1'b0;
OffsetOrigin = 1'b0; // 0:jalr(ALU) , 1: jal(immgen)
ALUSrc_B = 1'b0; // 0: regB, 1: immediate
ALUSrc_A = 1'b0; // 默认使用 0:rs1_data 作为 ALU A 端输入
case(opcode)
// R-type (ADD, SUB, etc.)
7'b0110011: begin
RegWrite = 1'b1;
MemToReg = 2'b00;
ALUSrc_B = 1'b0;
ALUSrc_A = 1'b0;
end
// I-type arithmetic (ADDI, etc.)
7'b0010011: begin
RegWrite = 1'b1;
MemToReg = 2'b00;
ALUSrc_B = 1'b1;
ALUSrc_A = 1'b0;
end
// Load (LW)
7'b0000011: begin
RegWrite = 1'b1;
MemToReg = 2'b01;
ALUSrc_B = 1'b1;
ALUSrc_A = 1'b0;
end
// Store (SW, SH, SB)
7'b0100011: begin
MemWrite = 1'b1;
ALUSrc_B = 1'b1;
ALUSrc_A = 1'b0;
end
// Branch (BEQ, BNE, etc.)
7'b1100011: begin
NpcOp = 2'b01; // branch decision
OffsetOrigin = 1'b1; //immgen
ALUSrc_A = 1'b0;
end
// JAL
7'b1101111: begin
NpcOp = 2'b11; // PC + offset
RegWrite = 1'b1;
MemToReg = 2'b10; // PC+4
OffsetOrigin = 1'b1; //immgen
ALUSrc_A = 1'b0;
end
// JALR
7'b1100111: begin
NpcOp = 2'b10; // register-based jump
RegWrite = 1'b1;
MemToReg = 2'b10;
OffsetOrigin = 1'b0; // ALU
ALUSrc_B = 1'b1; //immediate
ALUSrc_A = 1'b0; //rs1_data
end
// LUI
7'b0110111: begin
RegWrite = 1'b1;
MemToReg = 2'b11; // immediate value
ALUSrc_A = 1'b0;
end
// AUIPC
7'b0010111: begin
RegWrite = 1'b1;
MemToReg = 2'b00;
ALUSrc_B = 1'b1; // immediate value
ALUSrc_A = 1'b1;
end
//TODO: Add other opcodes : fence, fence.i, ecall, ebreak, csrrw, csrrs, csrrc, csrrwi, csrrsi, csrrci
default: begin
// Handle undefined opcodes
// Could set all outputs to 0 or implement exception handling
// Default values:最好不要修改
NpcOp = 2'b00; // PC+4 ,01:条件跳转 10:jalr 指令,npc = Result & ~1
// 11:jal 指令,npc = pc + offset
RegWrite = 1'b0;
MemToReg = 2'b00; // 00: ALU result, 01: memory data, 10: PC+4
// 11: immgen
MemWrite = 1'b0;
OffsetOrigin = 1'b0; // 0:jalr(ALU) , 1: jal(immgen)
ALUSrc_B = 1'b0; // 0: regB, 1: immediate
ALUSrc_A= 1'b0;
end
endcase
end
endmodule