icicle/rv32.sv

171 lines
4.1 KiB
Systemverilog
Raw Normal View History

2017-12-01 23:30:33 +00:00
`ifndef RV32
`define RV32
2017-11-30 22:30:49 +00:00
`include "rv32_decode.sv"
2017-12-01 22:36:26 +00:00
`include "rv32_execute.sv"
2017-11-30 22:30:49 +00:00
`include "rv32_fetch.sv"
2017-12-02 10:22:48 +00:00
`include "rv32_mem.sv"
2017-12-02 11:26:12 +00:00
`include "rv32_writeback.sv"
2017-11-30 22:30:49 +00:00
module rv32 (
input clk
2017-11-30 22:30:49 +00:00
);
rv32_fetch fetch (
.clk(clk),
/* data out */
.pc_out(fetch_pc),
.instr_out(fetch_instr)
);
2017-12-01 22:36:26 +00:00
/* fetch -> decode data */
2017-11-30 22:30:49 +00:00
logic [31:0] fetch_pc;
logic [31:0] fetch_instr;
rv32_decode decode (
.clk(clk),
2017-12-02 11:26:12 +00:00
/* control in */
.rd_in(writeback_rd),
.rd_writeback_in(writeback_rd_writeback),
2017-11-30 22:30:49 +00:00
/* data in */
.pc_in(fetch_pc),
2017-12-01 22:36:26 +00:00
.instr_in(fetch_instr),
2017-12-02 11:26:12 +00:00
.rd_value_in(writeback_rd_value),
2017-12-01 22:36:26 +00:00
/* control out */
.alu_op_out(decode_alu_op),
.alu_sub_sra_out(decode_alu_sub_sra),
.alu_src1_out(decode_alu_src1),
.alu_src2_out(decode_alu_src2),
2017-12-02 10:22:48 +00:00
.mem_read_en_out(decode_mem_read_en),
.mem_write_en_out(decode_mem_write_en),
2017-12-02 11:26:12 +00:00
.rd_out(decode_rd),
.rd_writeback_out(decode_rd_writeback),
2017-12-01 22:36:26 +00:00
/* data out */
.pc_out(decode_pc),
.rs1_value_out(decode_rs1_value),
.rs2_value_out(decode_rs2_value),
.imm_out(decode_imm)
);
/* decode -> execute control */
logic [3:0] decode_alu_op;
logic decode_alu_sub_sra;
logic decode_alu_src1;
logic decode_alu_src2;
2017-12-02 10:22:48 +00:00
logic decode_mem_read_en;
logic decode_mem_write_en;
2017-12-02 11:26:12 +00:00
logic [4:0] decode_rd;
logic decode_rd_writeback;
2017-12-01 22:36:26 +00:00
/* decode -> execute data */
logic [31:0] decode_pc;
logic [31:0] decode_rs1_value;
logic [31:0] decode_rs2_value;
logic [31:0] decode_imm;
rv32_execute execute (
.clk(clk),
/* control in */
.alu_op_in(decode_alu_op),
.alu_sub_sra_in(decode_alu_sub_sra),
.alu_src1_in(decode_alu_src1),
.alu_src2_in(decode_alu_src2),
2017-12-02 10:22:48 +00:00
.mem_read_en_in(decode_mem_read_en),
.mem_write_en_in(decode_mem_write_en),
2017-12-02 11:26:12 +00:00
.rd_in(decode_rd),
.rd_writeback_in(decode_rd_writeback),
2017-12-01 22:36:26 +00:00
/* data in */
.pc_in(decode_pc),
.rs1_value_in(decode_rs1_value),
.rs2_value_in(decode_rs2_value),
.imm_in(decode_imm),
2017-12-02 10:22:48 +00:00
/* control out */
.mem_read_en_out(execute_mem_read_en),
.mem_write_en_out(execute_mem_write_en),
2017-12-02 11:26:12 +00:00
.rd_out(execute_rd),
.rd_writeback_out(execute_rd_writeback),
2017-12-02 10:22:48 +00:00
2017-12-01 22:36:26 +00:00
/* data out */
2017-12-02 10:22:48 +00:00
.result_out(execute_result),
.rs2_value_out(execute_rs2_value)
2017-11-30 22:30:49 +00:00
);
2017-12-01 22:36:26 +00:00
2017-12-02 10:22:48 +00:00
/* execute -> mem control */
logic execute_mem_read_en;
logic execute_mem_write_en;
2017-12-02 11:26:12 +00:00
logic [4:0] execute_rd;
logic execute_rd_writeback;
2017-12-02 10:22:48 +00:00
2017-12-01 22:36:26 +00:00
/* execute -> mem data */
logic [31:0] execute_result;
2017-12-02 10:22:48 +00:00
logic [31:0] execute_rs2_value;
rv32_mem mem (
.clk(clk),
/* control in */
.read_en_in(execute_mem_read_en),
.write_en_in(execute_mem_write_en),
2017-12-02 11:26:12 +00:00
.rd_in(execute_rd),
.rd_writeback_in(execute_rd_writeback),
2017-12-02 10:22:48 +00:00
/* data in */
.result_in(execute_result),
2017-12-02 11:26:12 +00:00
.rs2_value_in(execute_rs2_value),
/* control out */
.read_en_out(mem_read_en),
.rd_out(mem_rd),
.rd_writeback_out(mem_rd_writeback),
/* data out */
.result_out(mem_result),
.read_value_out(mem_read_value)
2017-12-02 10:22:48 +00:00
);
2017-12-02 11:26:12 +00:00
/* mem -> writeback control */
logic mem_read_en;
logic [4:0] mem_rd;
logic mem_rd_writeback;
/* mem -> writeback data */
logic [31:0] mem_result;
logic [31:0] mem_read_value;
rv32_writeback writeback (
.clk(clk),
/* control in */
.mem_read_en_in(mem_read_en),
.rd_in(mem_rd),
.rd_writeback_in(mem_rd_writeback),
/* data in */
.result_in(mem_result),
.mem_read_value_in(mem_read_value),
/* control out */
.rd_out(writeback_rd),
.rd_writeback_out(writeback_rd_writeback),
/* data out */
.rd_value_out(writeback_rd_value)
);
/* writeback -> decode control */
logic [4:0] writeback_rd;
logic writeback_rd_writeback;
/* writeback -> decode data */
logic [31:0] writeback_rd_value;
2017-11-30 22:30:49 +00:00
endmodule
2017-12-01 23:30:33 +00:00
`endif