2022-04-02 18:08:56 +05:00

303 lines
9.4 KiB
Verilog

`include "settings.h"
module ARM
(
input clk,
input rst,
input enableForwarding
);
wire [`WORD_WIDTH-1:0] IF_stage_pc_out;
wire [`WORD_WIDTH-1:0] IF_stage_instruction_out;
wire [`WORD_WIDTH-1:0] branch_address;
wire EXE_stage_B_out;
wire hazard_detected;
IF_Stage IF_Stage_Inst (
.clk(clk),
.rst(rst),
.freeze(hazard_detected),
.branch_taken(EXE_stage_B_out),
.branch_addr(branch_address),
.pc(IF_stage_pc_out),
.instruction(IF_stage_instruction_out)
);
wire [`WORD_WIDTH-1:0] IF_reg_pc_out;
wire [`WORD_WIDTH-1:0] IF_reg_instruction_out;
IF_Reg IF_Reg_Inst (
.clk(clk),
.rst(rst),
.freeze(hazard_detected),
.flush(EXE_stage_B_out),
.pc_in(IF_stage_pc_out),
.instruction_in(IF_stage_instruction_out),
.pc(IF_reg_pc_out),
.instruction(IF_reg_instruction_out)
);
wire [`WORD_WIDTH-1:0] ID_stage_pc_out;
wire [`WORD_WIDTH-1:0] ID_stage_instruction_out;
wire [`REG_FILE_DEPTH-1:0] ID_stage_reg_file_dst;
wire [`REG_FILE_DEPTH-1:0] ID_stage_reg_file_src1, ID_stage_reg_file_src2;
wire [`WORD_WIDTH-1:0] ID_stage_val_Rn, ID_stage_val_Rm;
wire [`SIGNED_IMM_WIDTH-1:0] ID_stage_signed_immediate;
wire [`SHIFTER_OPERAND_WIDTH-1:0] ID_stage_shifter_operand;
wire [3:0] ID_stage_EX_command_out;
wire [3:0] status;
wire ID_stage_mem_read_out, ID_stage_mem_write_out,
ID_stage_WB_en_out,
ID_stage_Imm_out,
ID_stage_B_out,
ID_stage_SR_update_out;
wire [`REG_FILE_DEPTH-1:0] WB_Stage_dst_out;
wire [`WORD_WIDTH-1:0] WB_Value;
wire WB_Stage_WB_en_out;
wire has_src2;
ID_Stage ID_Stage_Inst(
.clk(clk),
.rst(rst),
.freeze(hazard_detected),
.pc_in(IF_reg_pc_out),
.instruction_in(IF_reg_instruction_out),
.reg_file_wb_address(WB_Stage_dst_out),
.reg_file_wb_data(WB_Value),
.reg_file_enable(WB_Stage_WB_en_out),
.reg_file_src1(ID_stage_reg_file_src1),
.reg_file_src2(ID_stage_reg_file_src2),
.status_register(status),
.pc(ID_stage_pc_out),
.instruction(ID_stage_instruction_out),
.reg_file_dst(ID_stage_reg_file_dst),
.val_Rn(ID_stage_val_Rn), .val_Rm(ID_stage_val_Rm),
.signed_immediate(ID_stage_signed_immediate),
.shifter_operand(ID_stage_shifter_operand),
.EX_command_out(ID_stage_EX_command_out),
.mem_read_out(ID_stage_mem_read_out), .mem_write_out(ID_stage_mem_write_out),
.WB_en_out(ID_stage_WB_en_out),
.Imm_out(ID_stage_Imm_out),
.B_out(ID_stage_B_out),
.SR_update_out(ID_stage_SR_update_out),
.has_src2(has_src2),
.has_src1(has_src1)
);
wire [`WORD_WIDTH-1:0] ID_reg_pc_out;
wire [`WORD_WIDTH-1:0] ID_reg_instruction_out;
wire [`REG_FILE_DEPTH-1:0] ID_reg_reg_file_dst_out;
wire [`WORD_WIDTH-1:0] ID_reg_val_Rn_out, ID_reg_val_Rm_out;
wire [`SIGNED_IMM_WIDTH-1:0] ID_reg_signed_immediate_out;
wire [`SHIFTER_OPERAND_WIDTH-1:0] ID_reg_shifter_operand_out;
wire [3:0] ID_reg_SR_out, ID_reg_EX_command_out;
wire ID_reg_mem_read_out, ID_reg_mem_write_out,
ID_reg_WB_en_out,
ID_reg_Imm_out,
ID_reg_B_out,
ID_reg_SR_update_out;
wire [`REG_FILE_DEPTH-1:0] ID_reg_reg_file_src1, ID_reg_reg_file_src2;
ID_Reg ID_Reg_Inst(
.clk(clk),
.rst(rst),
.flush(EXE_stage_B_out),
.pc_in(ID_stage_pc_out),
.instruction_in(ID_stage_instruction_out),
.reg_file_dst_in(ID_stage_reg_file_dst),
.val_Rn_in(ID_stage_val_Rn), .val_Rm_in(ID_stage_val_Rm),
.signed_immediate_in(ID_stage_signed_immediate),
.shifter_operand_in(ID_stage_shifter_operand),
.EX_command_in(ID_stage_EX_command_out),
.mem_read_in(ID_stage_mem_read_out), .mem_write_in(ID_stage_mem_write_out),
.WB_en_in(ID_stage_WB_en_out),
.Imm_in(ID_stage_Imm_out),
.B_in(ID_stage_B_out),
.SR_update_in(ID_stage_SR_update_out),
.reg_file_src1_in(ID_stage_reg_file_src1),
.reg_file_src2_in(ID_stage_reg_file_src2),
.pc(ID_reg_pc_out),
.instruction(ID_reg_instruction_out),
.reg_file_dst_out(ID_reg_reg_file_dst_out),
.val_Rn_out(ID_reg_val_Rn_out), .val_Rm_out(ID_reg_val_Rm_out),
.signed_immediate_out(ID_reg_signed_immediate_out),
.shifter_operand_out(ID_reg_shifter_operand_out),
.EX_command_out(ID_reg_EX_command_out),
.mem_read_out(ID_reg_mem_read_out), .mem_write_out(ID_reg_mem_write_out),
.WB_en_out(ID_reg_WB_en_out),
.Imm_out(ID_reg_Imm_out),
.B_out(ID_reg_B_out),
.SR_update_out(ID_reg_SR_update_out),
.status_register_in(status),
.status_register_out(ID_reg_SR_out),
.reg_file_src1_out(ID_reg_reg_file_src1),
.reg_file_src2_out(ID_reg_reg_file_src2)
);
wire [`WORD_WIDTH-1:0] EXE_stage_pc_out;
wire [`WORD_WIDTH-1:0] EXE_stage_instruction_out;
wire [`REG_FILE_DEPTH-1:0] EXE_stage_reg_file_dst_out;
wire [`WORD_WIDTH-1:0] EXE_stage_val_Rm_out;
wire [3:0] EXE_stage_SR_out;
wire [`WORD_WIDTH-1:0] ALU_res;
wire EXE_stage_mem_read_out, EXE_stage_mem_write_out,
EXE_stage_WB_en_out;
wire [1:0] EXE_sel_src1, EXE_sel_src2;
wire [`WORD_WIDTH-1:0] Mem_Stage_ALU_res_out;
EXE_Stage EXE_Stage_Inst(
.clk(clk),
.rst(rst),
.pc_in(ID_reg_pc_out),
.instruction_in(ID_reg_instruction_out),
.MEM_stage_val(Mem_Stage_ALU_res_out),
.WB_stage_val(WB_Value),
.signed_immediate(ID_reg_signed_immediate_out),
.EX_command(ID_reg_EX_command_out),
.SR_in(ID_reg_SR_out),
.shifter_operand(ID_reg_shifter_operand_out),
.dst_in(ID_reg_reg_file_dst_out),
.mem_read_in(ID_reg_mem_read_out), .mem_write_in(ID_reg_mem_write_out),
.imm(ID_reg_Imm_out),
.WB_en_in(ID_reg_WB_en_out),
.B_in(ID_reg_B_out),
.val_Rn_in(ID_reg_val_Rn_out), .val_Rm_in(ID_reg_val_Rm_out),
.sel_src1(EXE_sel_src1),
.sel_src2(EXE_sel_src2),
.dst_out(EXE_stage_reg_file_dst_out),
.SR_out(EXE_stage_SR_out),
.ALU_res(ALU_res),
.val_Rm_out(EXE_stage_val_Rm_out),
.branch_address(branch_address),
.mem_read_out(EXE_stage_mem_read_out), .mem_write_out(EXE_stage_mem_write_out),
.WB_en_out(EXE_stage_WB_en_out),
.B_out(EXE_stage_B_out),
.pc(EXE_stage_pc_out),
.instruction(EXE_stage_instruction_out)
);
wire [`WORD_WIDTH-1:0] EXE_reg_pc_out;
wire [`WORD_WIDTH-1:0] EXE_reg_instruction_out;
wire [`REG_FILE_DEPTH-1:0] EXE_reg_dst_out;
wire [`WORD_WIDTH-1:0] EXE_reg_ALU_res_out;
wire [`WORD_WIDTH-1:0] EXE_reg_val_Rm_out;
wire EXE_reg_mem_read_out, EXE_reg_mem_write_out, EXE_reg_WB_en_out;
EXE_Reg EXE_Reg_Inst(
.clk(clk),
.rst(rst),
.pc_in(EXE_stage_pc_out),
.instruction_in(EXE_stage_instruction_out),
.dst_in(EXE_stage_reg_file_dst_out),
.mem_read_in(EXE_stage_mem_read_out), .mem_write_in(EXE_stage_mem_write_out),
.WB_en_in(EXE_stage_WB_en_out),
.val_Rm_in(EXE_stage_val_Rm_out),
.ALU_res_in(ALU_res),
.dst_out(EXE_reg_dst_out),
.ALU_res_out(EXE_reg_ALU_res_out),
.val_Rm_out(EXE_reg_val_Rm_out),
.mem_read_out(EXE_reg_mem_read_out), .mem_write_out(EXE_reg_mem_write_out),
.WB_en_out(EXE_reg_WB_en_out),
.pc(EXE_reg_pc_out),
.instruction(EXE_reg_instruction_out)
);
wire [`REG_FILE_DEPTH-1:0] Mem_Stage_dst_out;
wire [`WORD_WIDTH-1:0] Mem_Stage_mem_out;
wire Mem_Stage_read_out, Mem_Stage_WB_en_out;
Mem_Stage Mem_Stage_Inst(
.clk(clk),
.rst(rst),
.dst(EXE_reg_dst_out),
.ALU_res(EXE_reg_ALU_res_out),
.val_Rm(EXE_reg_val_Rm_out),
.mem_read(EXE_reg_mem_read_out),
.mem_write(EXE_reg_mem_write_out),
.WB_en(EXE_reg_WB_en_out),
.dst_out(Mem_Stage_dst_out),
.ALU_res_out(Mem_Stage_ALU_res_out),
.mem_out(Mem_Stage_mem_out),
.mem_read_out(Mem_Stage_read_out),
.WB_en_out(Mem_Stage_WB_en_out)
);
wire [`REG_FILE_DEPTH-1:0] Mem_Reg_dst_out;
wire [`WORD_WIDTH-1:0] Mem_Reg_ALU_res_out;
wire [`WORD_WIDTH-1:0] Mem_Reg_mem_out;
wire Mem_Reg_read_out, Mem_Reg_WB_en_out;
MEM_Reg Mem_Reg_Inst(
.clk(clk),
.rst(rst),
.dst(Mem_Stage_dst_out),
.ALU_res(Mem_Stage_ALU_res_out),
.mem(Mem_Stage_mem_out),
.mem_read(Mem_Stage_read_out),
.WB_en(Mem_Stage_WB_en_out),
.dst_out(Mem_Reg_dst_out),
.ALU_res_out(Mem_Reg_ALU_res_out),
.mem_out(Mem_Reg_mem_out),
.mem_read_out(Mem_Reg_read_out),
.WB_en_out(Mem_Reg_WB_en_out)
);
WB_Stage WB_Stage_Inst(
.clk(clk),
.rst(rst),
.dst(Mem_Reg_dst_out),
.ALU_res(Mem_Reg_ALU_res_out),
.mem(Mem_Reg_mem_out),
.mem_read(Mem_Reg_read_out),
.WB_en(Mem_Reg_WB_en_out),
.WB_Dest(WB_Stage_dst_out),
.WB_en_out(WB_Stage_WB_en_out),
.WB_Value(WB_Value)
);
Status_Reg Status_Reg_Inst(
.clk(clk),
.rst(rst),
.load(ID_reg_SR_update_out),
.status_in(EXE_stage_SR_out),
.status(status)
);
wire EXE_WB_en = ID_reg_WB_en_out;
wire MEM_WB_en = EXE_reg_WB_en_out;
wire[`REG_FILE_DEPTH-1:0] EXE_dest = ID_reg_reg_file_dst_out;
wire[`REG_FILE_DEPTH-1:0] MEM_dest = EXE_reg_dst_out;
Hazard_Detection_Unit Hazard_Detection_Unit_Inst(
.enableForwarding(enableForwarding),
.src1(ID_stage_reg_file_src1),
.src2(ID_stage_reg_file_src2),
.EXE_dest(EXE_dest),
.MEM_dest(MEM_dest),
.EXE_WB_en(EXE_WB_en),
.MEM_WB_en(MEM_WB_en),
.EXE_memread_en(EXE_stage_mem_read_out),
.has_src1(has_src1),
.has_src2(has_src2),
.hazard_detected(hazard_detected)
);
Forwarding_Unit Forwarding_Unit_Inst(
.enable(enableForwarding),
.src1(ID_reg_reg_file_src1),
.src2(ID_reg_reg_file_src2),
.MEM_dest(MEM_dest),
.WB_dest(WB_Stage_dst_out),
.MEM_WB_en(MEM_WB_en),
.WB_WB_en(WB_Stage_WB_en_out),
.sel_src1(EXE_sel_src1),
.sel_src2(EXE_sel_src2)
);
endmodule