Line 62... |
Line 62... |
input [31:0] mem_result_i /*verilator public*/,
|
input [31:0] mem_result_i /*verilator public*/,
|
input [1:0] mem_offset_i /*verilator public*/,
|
input [1:0] mem_offset_i /*verilator public*/,
|
input mem_ready_i /*verilator public*/,
|
input mem_ready_i /*verilator public*/,
|
|
|
// Multiplier result
|
// Multiplier result
|
input mult_i /*verilator public*/,
|
input [63:0] mult_result_i /*verilator public*/,
|
input [31:0] mult_result_i /*verilator public*/,
|
|
|
|
// Outputs
|
// Outputs
|
output write_enable_o /*verilator public*/,
|
output reg write_enable_o /*verilator public*/,
|
output [4:0] write_addr_o /*verilator public*/,
|
output reg [4:0] write_addr_o /*verilator public*/,
|
output [31:0] write_data_o /*verilator public*/
|
output reg [31:0] write_data_o /*verilator public*/
|
);
|
);
|
|
|
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
// Registers
|
// Registers / Wires
|
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
|
|
// Register address
|
// Register address
|
reg [4:0] rd_q;
|
reg [4:0] rd_q;
|
|
|
Line 86... |
Line 85... |
reg [7:0] opcode_q;
|
reg [7:0] opcode_q;
|
|
|
// Register writeback enable
|
// Register writeback enable
|
reg write_rd_q;
|
reg write_rd_q;
|
|
|
|
reg [1:0] mem_offset_q;
|
|
|
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
// Writeback
|
// Pipeline Registers
|
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
always @ (posedge clk_i or posedge rst_i)
|
always @ (posedge clk_i or posedge rst_i)
|
begin
|
begin
|
if (rst_i == 1'b1)
|
if (rst_i == 1'b1)
|
begin
|
begin
|
write_rd_q <= 1'b1;
|
write_rd_q <= 1'b1;
|
result_q <= 32'h00000000;
|
result_q <= 32'h00000000;
|
rd_q <= 5'b00000;
|
rd_q <= 5'b00000;
|
opcode_q <= 8'b0;
|
opcode_q <= 8'b0;
|
|
mem_offset_q <= 2'b0;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
rd_q <= rd_i;
|
rd_q <= rd_i;
|
result_q <= alu_result_i;
|
result_q <= alu_result_i;
|
|
|
opcode_q <= {2'b00,opcode_i[31:26]};
|
opcode_q <= {2'b00,opcode_i[31:26]};
|
|
mem_offset_q<= mem_offset_i;
|
|
|
// Register writeback required?
|
// Register writeback required?
|
if (rd_i != 5'b00000)
|
if (rd_i != 5'b00000)
|
write_rd_q <= 1'b1;
|
write_rd_q <= 1'b1;
|
else
|
else
|
Line 127... |
Line 130... |
// Opcode
|
// Opcode
|
.opcode_i(opcode_q),
|
.opcode_i(opcode_q),
|
|
|
// Memory load result
|
// Memory load result
|
.mem_result_i(mem_result_i),
|
.mem_result_i(mem_result_i),
|
.mem_offset_i(mem_offset_i),
|
.mem_offset_i(mem_offset_q),
|
|
|
// Result
|
// Result
|
.load_result_o(load_result_w),
|
.load_result_o(load_result_w),
|
.load_insn_o(load_inst_w)
|
.load_insn_o(load_inst_w)
|
);
|
);
|
|
|
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
// Assignments
|
// Writeback
|
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
assign write_enable_o = load_inst_w ? (write_rd_q & mem_ready_i) : write_rd_q;
|
always @ *
|
assign write_data_o = load_inst_w ? load_result_w : (mult_i ? mult_result_i : result_q);
|
begin
|
assign write_addr_o = rd_q;
|
write_addr_o = rd_q;
|
|
|
|
// Load result
|
|
if (load_inst_w)
|
|
begin
|
|
write_enable_o = write_rd_q & mem_ready_i;
|
|
write_data_o = load_result_w;
|
|
end
|
|
// Normal ALU instruction
|
|
else
|
|
begin
|
|
write_enable_o = write_rd_q;
|
|
write_data_o = result_q;
|
|
end
|
|
end
|
|
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|