diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2026-11-07 03:10:08 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2026-11-07 03:10:08 +0800 |
| commit | 1410d3309ae9557ab102942bbc4d8449f2206fe5 (patch) | |
| tree | 9e8f45cf9bd7378c42d683afbc427afdb4678557 /rv64cpu/rtl/core/execute/branch_unit.sv | |
| parent | bc3ec25107314be3cd816c0b669d82338e892806 (diff) | |
| download | rcc-project-1410d3309ae9557ab102942bbc4d8449f2206fe5.tar.gz rcc-project-1410d3309ae9557ab102942bbc4d8449f2206fe5.tar.xz | |
refactor: reorganize RTL directory structure
Diffstat (limited to 'rv64cpu/rtl/core/execute/branch_unit.sv')
| -rw-r--r-- | rv64cpu/rtl/core/execute/branch_unit.sv | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/rv64cpu/rtl/core/execute/branch_unit.sv b/rv64cpu/rtl/core/execute/branch_unit.sv new file mode 100644 index 0000000..c9662ce --- /dev/null +++ b/rv64cpu/rtl/core/execute/branch_unit.sv @@ -0,0 +1,52 @@ +// Richard CPU +// Copyright (C) 2026 Richard Qin + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <https://www.gnu.org/licenses/>. + +// File path: rtl/core/branch_unit.sv +// Description: Branch Unit, responsible for determining whether conditional jump instructions are effective + +module branch_unit + import rv64_pkg::*; +( + input logic is_branch, // Indicates whether the current instruction is a branch instruction + input logic [2:0] branch_op, // Specific branch types func3 + input logic [XLEN-1:0] operand_a, // operand 1 + input logic [XLEN-1:0] operand_b, // operand 2 + output logic branch_taken // Branch taken signal +); + + always_comb begin + branch_taken = 1'b0; + + if (is_branch) begin + case (branch_op) + // 3'b000: BEQ (Branch if Equal) + BRANCH_EQ: branch_taken = (operand_a == operand_b); + // 3'b001: BNE (Branch if Not Equal) + BRANCH_NE: branch_taken = (operand_a != operand_b); + // 3'b100: BLT (Branch if Less Than, Signed) + BRANCH_LT: branch_taken = ($signed(operand_a) < $signed(operand_b)); + // 3'b101: BGE (Branch if Greater Than or Equal, Signed) + BRANCH_GE: branch_taken = ($signed(operand_a) >= $signed(operand_b)); + // 3'b110: BLTU (Branch if Less Than, Unsigned) + BRANCH_LTU: branch_taken = (operand_a < operand_b); + // 3'b111: BGEU (Branch if Greater Than or Equal, Unsigned) + BRANCH_GEU: branch_taken = (operand_a >= operand_b); + default: branch_taken = 1'b0; + endcase + end + end + +endmodule |
