summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvin <git@vineetk.net>2025-03-25 16:31:11 -0400
committervin <git@vineetk.net>2025-03-25 16:31:35 -0400
commit398f047bac2b89026dcb09ce21b4683ff49d4f35 (patch)
tree17de3f8f49ce7b14e8f07417f8218afacc6475ba
parent70477dad47f985f68ce05668911939b0374ea364 (diff)
add blt and bge
-rw-r--r--riscvsingle.sv19
1 files changed, 13 insertions, 6 deletions
diff --git a/riscvsingle.sv b/riscvsingle.sv
index fc9c830..ed8504a 100644
--- a/riscvsingle.sv
+++ b/riscvsingle.sv
@@ -233,8 +233,10 @@ module controller(input logic [6:0] op,
233 always_comb 233 always_comb
234 if (Branch) 234 if (Branch)
235 case (funct3) 235 case (funct3)
236 3'b000: PCSrc = Zero; 236 3'b000: PCSrc = Zero; // beq
237 3'b001: PCSrc = ~Zero; 237 3'b001: PCSrc = ~Zero; // bne
238 3'b100: PCSrc = Zero; // blt
239 3'b101: PCSrc = ~Zero; // blt
238 default: PCSrc = 1'bx; 240 default: PCSrc = 1'bx;
239 endcase 241 endcase
240 else 242 else
@@ -260,7 +262,7 @@ module maindec(input logic [6:0] op,
260 7'b0000011: controls = 11'b1_00_1_0_01_0_00_0; // lw 262 7'b0000011: controls = 11'b1_00_1_0_01_0_00_0; // lw
261 7'b0100011: controls = 11'b0_01_1_1_00_0_00_0; // sw 263 7'b0100011: controls = 11'b0_01_1_1_00_0_00_0; // sw
262 7'b0110011: controls = 11'b1_xx_0_0_00_0_10_0; // R-type 264 7'b0110011: controls = 11'b1_xx_0_0_00_0_10_0; // R-type
263 7'b1100011: controls = 11'b0_10_0_0_00_1_01_0; // beq 265 7'b1100011: controls = 11'b0_10_0_0_00_1_01_0; // B-type
264 7'b0010011: controls = 11'b1_00_1_0_00_0_10_0; // I-type ALU 266 7'b0010011: controls = 11'b1_00_1_0_00_0_10_0; // I-type ALU
265 7'b1101111: controls = 11'b1_11_0_0_10_0_00_1; // jal 267 7'b1101111: controls = 11'b1_11_0_0_10_0_00_1; // jal
266 default: controls = 11'bx_xx_x_x_xx_x_xx_x; // non-implemented instruction 268 default: controls = 11'bx_xx_x_x_xx_x_xx_x; // non-implemented instruction
@@ -279,7 +281,8 @@ module aludec(input logic opb5,
279 always_comb 281 always_comb
280 case(ALUOp) 282 case(ALUOp)
281 2'b00: ALUControl = 4'b0000; // addition 283 2'b00: ALUControl = 4'b0000; // addition
282 2'b01: ALUControl = 4'b0001; // subtraction 284 2'b01: ALUControl = {funct3[2], 3'b001}; // branching
285 // (funct3[2] is used because it's set in blt/bge but not beq/bne
283 default: case(funct3) // R-type or I-type ALU 286 default: case(funct3) // R-type or I-type ALU
284 3'b000: if (RtypeSub) 287 3'b000: if (RtypeSub)
285 ALUControl = 4'b0001; // sub 288 ALUControl = 4'b0001; // sub
@@ -402,7 +405,11 @@ module alu(input logic [31:0] a, b,
402 default: result = 32'bx; 405 default: result = 32'bx;
403 endcase 406 endcase
404 407
405 assign zero = (result == 32'b0); 408 always_comb
409 case (alucontrol)
410 4'b1001: zero = a < b; // blt and bge
411 default: zero = (result == 32'b0); // beq and bne
412 endcase
413
406 assign v = ~(alucontrol[0] ^ a[31] ^ b[31]) & (a[31] ^ sum[31]) & isAddSub; 414 assign v = ~(alucontrol[0] ^ a[31] ^ b[31]) & (a[31] ^ sum[31]) & isAddSub;
407
408endmodule 415endmodule