You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
31 lines
914 B
31 lines
914 B
3 years ago
|
`timescale 1ns / 1ps
|
||
|
// 跳转单元
|
||
|
module BranchUnit #(
|
||
|
parameter PC_W = 9
|
||
|
)(
|
||
|
input logic [PC_W - 1:0] cur_pc,
|
||
|
input logic [31:0] imm,
|
||
|
input logic jalr_sel,
|
||
|
input logic branch_taken, // Branch
|
||
|
input logic [31:0] alu_result,
|
||
|
output logic [31:0] pc_plus_imm, // PC + imm
|
||
|
output logic [31:0] pc_plus_4, // PC + 4
|
||
|
output logic [31:0] branch_target, // BrPC
|
||
|
output logic pc_sel
|
||
|
);
|
||
|
|
||
|
logic [31:0] pc;
|
||
|
assign pc = {23'b0, cur_pc};
|
||
|
always_comb
|
||
|
begin
|
||
|
pc_plus_4 = pc + 32'd4;
|
||
|
pc_plus_imm = pc + imm;
|
||
|
pc_sel = jalr_sel | (branch_taken & alu_result[0]);
|
||
|
if (jalr_sel == 1'b1)
|
||
|
branch_target = alu_result & 32'hfffffffe; // jalr
|
||
|
else
|
||
|
branch_target = pc + (imm << 1); // jal and beq
|
||
|
end
|
||
|
|
||
|
endmodule
|