diff options
| author | vin <git@vineetk.net> | 2025-03-25 16:31:11 -0400 |
|---|---|---|
| committer | vin <git@vineetk.net> | 2025-03-25 16:31:35 -0400 |
| commit | 398f047bac2b89026dcb09ce21b4683ff49d4f35 (patch) | |
| tree | 17de3f8f49ce7b14e8f07417f8218afacc6475ba | |
| parent | 70477dad47f985f68ce05668911939b0374ea364 (diff) | |
add blt and bge
| -rw-r--r-- | riscvsingle.sv | 19 |
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 | |||
| 408 | endmodule | 415 | endmodule |
