aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/alu.v4
-rw-r--r--src/alu_op_decode.v4
-rw-r--r--src/control_unit.v29
-rw-r--r--src/cpu.v5
4 files changed, 18 insertions, 24 deletions
diff --git a/src/alu.v b/src/alu.v
index 6f9251c..6962129 100644
--- a/src/alu.v
+++ b/src/alu.v
@@ -2,8 +2,7 @@ module alu (
input [31:0] a, b,
input [3:0] op,
output reg [31:0] result,
- output zero,
- output equal
+ output zero
);
wire [31:0] arithmetic_result, logic_result, shift_result;
@@ -39,6 +38,5 @@ always @ (*) begin
end
assign zero = result == 32'b0;
-assign equal = a == b;
endmodule
diff --git a/src/alu_op_decode.v b/src/alu_op_decode.v
index 895b952..b9db664 100644
--- a/src/alu_op_decode.v
+++ b/src/alu_op_decode.v
@@ -1,6 +1,6 @@
module alu_op_decode (
input [6:0] opcode,
- input [1:0] alu_ctrl,
+ input alu_ctrl,
input [2:0] funct3,
input [6:0] funct7,
output reg [3:0] alu_op
@@ -19,7 +19,7 @@ parameter ALU_OP_ADD = 4'b0000,
always @ (*) begin
- if (alu_ctrl == 2'b00) alu_op <= ALU_OP_ADD;
+ if (alu_ctrl == 1'b1) alu_op <= ALU_OP_ADD;
else case (opcode)
7'b0110011: begin // ADD, SUB, SLL, SLT, SLTU, XOR, SRL, SRA, OR, AND
case (funct3)
diff --git a/src/control_unit.v b/src/control_unit.v
index 7ca2cb2..09129bd 100644
--- a/src/control_unit.v
+++ b/src/control_unit.v
@@ -4,7 +4,6 @@ module control_unit (
input [2:0] funct3,
input [6:0] funct7,
input alu_zero,
- input alu_equal,
output pc_we,
output reg mem_addr_src,
output reg mem_we,
@@ -27,7 +26,7 @@ parameter s00_fetch = 4'h0,
s08_execute_i = 4'h8,
s09_jal = 4'h9,
s10_jalr = 4'ha,
- s11_beq = 4'hb;
+ s11_br = 4'hb;
reg [3:0] state, next_state;
@@ -46,7 +45,7 @@ always @ (*) begin
7'b0010011: next_state <= s08_execute_i;
7'b1101111: next_state <= s09_jal;
7'b1100111: next_state <= s10_jalr;
- 7'b1100011: next_state <= s11_beq;
+ 7'b1100011: next_state <= s11_br;
endcase
s02_mem_addr: case(opcode)
@@ -61,15 +60,15 @@ always @ (*) begin
s08_execute_i: next_state <= s07_alu_wb;
s09_jal: next_state <= s07_alu_wb;
s10_jalr: next_state <= s07_alu_wb;
- s11_beq: next_state <= s00_fetch;
+ s11_br: next_state <= s00_fetch;
endcase
end
reg branch;
reg pc_update;
-reg [1:0] alu_ctrl;
+reg alu_ctrl;
-assign pc_we = (alu_zero & branch) | pc_update;
+assign pc_we = ((alu_zero ^ funct3[0] ^ funct3[2]) & branch) | pc_update;
always @ (*) begin
@@ -84,19 +83,19 @@ always @ (*) begin
instr_we = 1'b1;
alu_a_src <= 2'b00;
alu_b_src <= 2'b10;
- alu_ctrl <= 2'b00;
+ alu_ctrl <= 1'b1;
result_src <= 2'b10;
pc_update = 1'b1;
end
s01_decode: begin
alu_a_src <= 2'b01;
alu_b_src <= 2'b01;
- alu_ctrl <= 2'b00;
+ alu_ctrl <= 1'b1;
end
s02_mem_addr: begin
alu_a_src <= 2'b10;
alu_b_src <= 2'b01;
- alu_ctrl <= 2'b00;
+ alu_ctrl <= 1'b1;
end
s03_mem_read: begin
result_src <= 2'b00;
@@ -114,7 +113,7 @@ always @ (*) begin
s06_execute_r: begin
alu_a_src <= 2'b10;
alu_b_src <= 2'b00;
- alu_ctrl <= 2'b10;
+ alu_ctrl <= 1'b0;
end
s07_alu_wb: begin
result_src <= 2'b00;
@@ -123,26 +122,26 @@ always @ (*) begin
s08_execute_i: begin
alu_a_src <= 2'b10;
alu_b_src <= 2'b01;
- alu_ctrl <= 2'b10;
+ alu_ctrl <= 1'b0;
end
s09_jal: begin
alu_a_src <= 2'b01;
alu_b_src <= 2'b10;
- alu_ctrl <= 2'b00;
+ alu_ctrl <= 1'b1;
result_src <= 2'b00;
pc_update = 1'b1;
end
s10_jalr: begin
alu_a_src <= 2'b10;
alu_b_src <= 2'b01;
- alu_ctrl <= 2'b00;
+ alu_ctrl <= 1'b1;
result_src <= 2'b10;
pc_update = 1'b1;
end
- s11_beq: begin
+ s11_br: begin
alu_a_src <= 2'b10;
alu_b_src <= 2'b00;
- alu_ctrl <= 2'b01;
+ alu_ctrl <= 1'b0;
result_src <= 2'b00;
branch = 1'b1;
end
diff --git a/src/cpu.v b/src/cpu.v
index 5362cf9..66ae8ce 100644
--- a/src/cpu.v
+++ b/src/cpu.v
@@ -12,7 +12,6 @@ wire pc_we;
wire instr_we;
wire rf_we;
wire alu_zero;
-wire alu_equal;
wire [3:0] alu_op;
wire [1:0] alu_a_src;
wire [1:0] alu_b_src;
@@ -25,7 +24,6 @@ control_unit cu (
.funct3(funct3),
.funct7(funct7),
.alu_zero(alu_zero),
- .alu_equal(alu_equal),
.pc_we(pc_we),
.mem_addr_src(mem_addr_src),
.mem_we(mem_we),
@@ -156,8 +154,7 @@ alu alu (
.b(b),
.op(alu_op),
.result(alu_result),
- .zero(alu_zero),
- .equal(alu_equal)
+ .zero(alu_zero)
);
reg [31:0] result_buf;