-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1_module_pipeline_Frame.sv
147 lines (111 loc) · 10.3 KB
/
1_module_pipeline_Frame.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
`timescale 1ns / 1ps
module OTTER_MCU(
input logic RST, INTR, CLK,
input logic [31:0] IOBUS_IN,
output logic IOBUS_WR,
output [31:0] IOBUS_OUT, IOBUS_ADDR // out is rs2, addr is alu resultant
);
//------------------ Wire Declerations-----------------------------//
wire PCWrite_sig, regWrite_sig, regWrite_sig_execute, regWrite_sig_memory, regWrite_sig_writeback, memWE2_sig, memWE2_sig_execute, memWE2_sig_memory, memRDEN1_sig, memRDEN2_sig, reset_sig, memRDEN2_sig_execute, memRDEN2_sig_memory,
csr_WE_sig, int_taken_sig, alu_srcA_sig, mem_SIGN, br_eq_signal, br_lt_signal,
br_ltu_signal, IOBUS_WR_sig, MIE_sig, INTR_sig, button_sig;
wire [1:0] alu_srcB_sig, rf_wr_sel_sig, mem_SIZE, rf_wr_sel_sig_execute, rf_wr_sel_sig_memory, rf_wr_sel_sig_writeback;
wire [3:0] alu_fun_sig, alu_fun_sig_execute;
wire [2:0] pcSource_sig, pcSOURCE_PIPE;
wire [31:0] mux_PC, PC_output_signal, PC_plus_4, PC_plus_4_decode, PC_plus_4_execute, PC_plus_4_memory, PC_plus_4_writeback,
mux_regfile, DOUT1_signal, DOUT2_regfile_writeback,
DOUT2_regfile_mux, rs1_signal, rs2_signal, rs2_signal_execute, rs2_signal_memory, ALU_RESULT, regfile_rs2_memory,
U_type_imm_signal, I_type_imm_signal, S_type_imm_signal,J_type_imm_signal, B_type_imm_signal,
CSR_RD_signal, srcA_mux_ALU_signal, srcB_mux_ALU_signal, jal_signal, branch_signal, jalr_signal,
mtvec_signal, mepc_signal, memory_output_SIG, memory_output_SIG_execute, memory_output_SIG_memory, memory_output_SIG_writeback, ALU_RESULT_MEM, ALU_RESULT_WRITEBACK;
wire [13:0] PC_Memory;
//-------------------High Level Control Units-----------------------//
debounce_one_shot intr0(.CLK(CLK), .BTN(INTR),
.DB_BTN(button_sig));
CSR_Component u0(.RST(reset_sig), .INT_TAKEN(int_taken_sig), .ADDR(DOUT1_signal), .WR_EN(csr_WE_sig), .clk(CLK), .PC(PC_output_signal), .WD(rs1_signal),
.mie(MIE_sig), .mepc(mepc_signal), .mtvec(mtvec_signal), .RD(CSR_RD_signal));
//*************************NEED TO REMOVE CONTROL FSM AND REPLACE WITH CONTROL SIGNALS FROM DECODER***************************//
//control_unit_FSM u1(.clk_FSM(CLK), .INTR_FSM(INTR_sig), .RST_FSM(RST), // FSM Inputs
//.OP_FSM(DOUT1_signal[6:0]),.FUNCT_FSM(DOUT1_signal[14:12]),
//.PCWrite(PCWrite_sig), .regWrite(regWrite_sig), .memWE2(memWE2_sig), .memRDEN1(memRDEN1_sig), //FSM outputs
//.memRDEN2(memRDEN2_sig), .reset(reset_sig), .csr_WE(csr_WE_sig), .int_taken(int_taken_sig));
//***************************** disabled 2/19/2022 ***********************************************************//
//------------Lower Level circuits-----------------------------------//
//*************INTERRUPT BUTTON NOT NEEDED***************************//
INTR_button b0(.button(button_sig), .csr_mie(MIE_sig),
.INTR_OUT(INTR_sig));
//*******************************************************************//
//********************** FETCH *************************************//
assign PCWrite_sig = 1'b1; // set PCWRITE signal to constant high
PCincrement P3(.PC_out(PC_output_signal),
.PC_incremented(PC_plus_4));
PC_mux m1(.PC_next(PC_plus_4), .jalr(jalr_signal), .branch(branch_signal), .jal(jal_signal), .mtvec(mtvec_signal), //pc mux inputs
.mepc(mepc_signal), .pcSource(pcSOURCE_PIPE), // pc mux outputs
.muxpc_output(mux_PC));
PC p1(.reset(RST), .PCWrite(1'b1), .PC_DIN(mux_PC), .CLK(CLK), // pc inputs
.PC_COUNT(PC_output_signal)); // pc outputs
memory_wire_adjust p4(.PC_address(PC_output_signal),
.MEM_ADDR1_adjust(PC_Memory));
assign memRDEN1_sig = 1; // set memRDEN1 signal to constant high
Memory c1(.MEM_CLK(CLK), .MEM_RDEN1(memRDEN1_sig), .MEM_RDEN2(memRDEN2_sig), .MEM_WE2(memWE2_sig), // Memory inputs
.MEM_ADDR1(PC_Memory), .MEM_ADDR2(ALU_RESULT),
.MEM_SIGN(DOUT1_signal[14]), .IO_IN(IOBUS_IN),
.MEM_DOUT1(DOUT1_signal)); // memory outputs
//****************************************************************//
Fetch_pipeline pipe1(.CLK(CLK), .memory_input(DOUT1_signal), .PC_plus_4_in(PC_plus_4),
.memory_output(memory_output_SIG), .PC_plus_4_out(PC_plus_4_decode));
//************************ Decode ********************************//
reg_file c2(.input_register(memory_output_SIG), .RAM_CLK(CLK), // regfile inputs
.rs1(rs1_signal), .rs2(rs2_signal)); // regfile outputs
CU_DCDR u2(.OP_DCDR(memory_output_SIG[6:0]), .FUNCT_DCDR(memory_output_SIG[14:12]), // Decoder inputs
.sign_DCDR(memory_output_SIG[30]), .int_taken_DCDR(int_taken_sig),
.br_eq_DCDR(br_eq_signal), .br_lt_DCDR(br_lt_signal), .br_ltu_DCDR(br_ltu_signal),
.alu_fun(alu_fun_sig), .alu_srcA(alu_srcA_sig), .alu_srcB(alu_srcB_sig),
.pcSource(pcSource_sig), .rf_wr_sel(rf_wr_sel_sig), // decoder outputs
.regWrite(regWrite_sig), .memWrite(memWE2_sig), .memRDEN2(memRDEN2_sig));
imm_gen i1(.IR(memory_output_SIG), // imm gen inputs
.U_type(U_type_imm_signal), .I_type(I_type_imm_signal),
.S_type(S_type_imm_signal), .J_type(J_type_imm_signal), .B_type(B_type_imm_signal)); // imm gen outputs
alu_muxA m3(.rs1_ALU(rs1_signal), .U_type_ALU(U_type_imm_signal), .alu_srcA_sel(alu_srcA_sig),
.srcA(srcA_mux_ALU_signal));
alu_muxB m4(.rs2_ALU(rs2_signal), .I_type_ALU(I_type_imm_signal),
.S_type_ALU(S_type_imm_signal), .PC_current_ALU(PC_output_signal), .alu_srcB(alu_srcB_sig),
.srcB(srcB_mux_ALU_signal));
//*****************************************************************//
EXECUTE_Pipeline pipe2(.CLK(CLK), .muxA_ouput(srcA_mux_ALU_signal), .muxB_output(srcB_mux_ALU_signal), .alu_fun(alu_fun_sig), . rf_wr_sel(rf_wr_sel_sig), .memRead2(memRDEN2_sig),
.memWrite(memWE2_sig), .regWrite(regWrite_sig), .pcSource(pcSource_sig), .memory_output_input(memory_output_SIG), .rs2_in(rs2_signal), .PC_plus_4_in(PC_plus_4_decode),// pcWrite wire will be fed back to PC on posedge
.muxA_ouput_out(srcA_mux_ALU_signal), .muxB_output_out(srcB_mux_ALU_signal), .alu_fun_out(alu_fun_sig_execute), . rf_wr_sel_out(rf_wr_sel_sig_execute), .memRead2_out(memRDEN2_sig_execute),
.memWrite_out(memWE2_sig_execute), .regWrite_out(regWrite_sig_execute), .pcSource_out(pcSOURCE_PIPE), .memory_output_output(memory_output_SIG_execute), .rs2_out(rs2_signal_execute), .PC_plus_4_out(PC_plus_4_execute));
//************************ Execute ********************************//
Branch_Address_Gen b1(.PC_current(PC_output_signal), .Jtype_imm(J_type_imm_signal), // brach address inputs
.Btype_imm(B_type_imm_signal), .Itype_imm(I_type_imm_signal), .rs1_output(rs1_signal),
.jal_output(jal_signal), .branch_output(branch_signal), .jalr_output(jalr_signal));
Branch_Cond_Gen b2(.BranchCond_rs1(rs1_signal), .BranchCond_rs2(rs2_signal),
.br_eq(br_eq_signal), .br_lt(br_lt_signal), .br_ltu(br_ltu_signal));
ALU A1(.A(srcA_mux_ALU_signal), .B(srcB_mux_ALU_signal), .ALU_FUN(alu_fun_sig_execute), //ALU inputs
.RESULT(ALU_RESULT)); // ALU outputs
//*******************************************************************//
MEMORY_pipeline p3(.CLK(CLK), .alu_in(ALU_RESULT), .rs2_in(rs2_signal_execute), .input_register_in(memory_output_SIG_execute), .rf_wr_sel(rf_wr_sel_sig_execute),
.memRead2(memRDEN2_sig_execute), .memWrite(memWE2_sig_execute), .regWrite(regWrite_sig_execute), .PC_plus_4_in(PC_plus_4_execute),
.alu_out(ALU_RESULT_MEM), .rs2_out(rs2_signal_memory), .input_register_out(memory_output_SIG_memory),
.rf_wr_sel_out(rf_wr_sel_sig_memory), .memRead2_out(memRDEN2_sig_memory), .memWrite_out(memWE2_sig_memory), .regWrite_out(regWrite_sig_memory), .PC_plus_4_out(PC_plus_4_memory));
//**************************** Memory *******************************//
Memory mem2(.MEM_CLK(CLK), .MEM_RDEN2(memRDEN2_sig), .MEM_WE2(memWE2_sig_memory), // Memory inputs
.MEM_ADDR2(ALU_RESULT_MEM),
.MEM_DIN2(rs2_signal_memory), .MEM_SIZE(memory_output_SIG_memory[13:12]), .MEM_SIGN(memory_output_SIG_memory[14]), .IO_IN(IOBUS_IN),
.IO_WR(IOBUS_WR_sig),.MEM_DOUT2(DOUT2_regfile_mux)); // memory outputs
assign IOBUS_OUT = rs2_signal_memory; // assignment of ouputs
assign IOBUS_ADDR = ALU_RESULT_WRITEBACK;
assign IOBUS_WR = IOBUS_WR_sig;
//*******************************************************************//
WRITEBACK_pipeline pipe4(.CLK(CLK), .dout2_in(DOUT2_regfile_mux), .alu_in(ALU_RESULT_MEM), .input_register_in(memory_output_SIG_memory), .PC_plus_4_in(PC_plus_4_memory), .rf_wr_sel(rf_wr_sel_sig_memory), .regWrite(regWrite_sig_memory),
.dout2_out(DOUT2_regfile_writeback), .alu_out(ALU_RESULT_WRITEBACK), .input_register_out(memory_output_SIG_writeback), .PC_plus_4_out(PC_plus_4_writeback), .rf_wr_sel_out(rf_wr_sel_sig_writeback), .regWrite_out(regWrite_sig_writeback)
);
//************************** WriteBack ******************************//
reg_file_mux m2(.PC_increment_REG_FILE(PC_plus_4_writeback), .CSR_RD_REGFILE(CSR_RD_signal), // reg_file wd mux inputs
.DOUT2_REG_FILE(DOUT2_regfile_writeback), .ALU_result_FILE(ALU_RESULT_WRITEBACK), .rf_wr_sel(rf_wr_sel_sig_writeback),
.wd_regFile(mux_regfile));
reg_file c3(.input_register(memory_output_SIG_writeback), .RAM_CLK(CLK), .wd_value(mux_regfile), .regwrite(regWrite_sig_writeback)); // regfile inputs
// reg file wd outputs
//******************************************************************//
endmodule