Compare commits
2 Commits
5d8f47c069
...
3c98a8b4c3
| Author | SHA1 | Date | |
|---|---|---|---|
| 3c98a8b4c3 | |||
| d89af6acd5 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -4,7 +4,9 @@
|
|||||||
.history
|
.history
|
||||||
.metals
|
.metals
|
||||||
.bloop
|
.bloop
|
||||||
|
.scalafmt.conf
|
||||||
*.code-workspace
|
*.code-workspace
|
||||||
|
target
|
||||||
|
|
||||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
hs_err_pid*
|
hs_err_pid*
|
||||||
|
|||||||
27
GCD.sv
27
GCD.sv
@@ -1,27 +0,0 @@
|
|||||||
// Generated by CIRCT firtool-1.62.0
|
|
||||||
module GCD(
|
|
||||||
input clock,
|
|
||||||
reset,
|
|
||||||
input [15:0] io_value1,
|
|
||||||
io_value2,
|
|
||||||
input io_loadingValues,
|
|
||||||
output [15:0] io_outputGCD,
|
|
||||||
output io_outputValid
|
|
||||||
);
|
|
||||||
|
|
||||||
reg [15:0] x;
|
|
||||||
reg [15:0] y;
|
|
||||||
always @(posedge clock) begin
|
|
||||||
if (io_loadingValues) begin
|
|
||||||
x <= io_value1;
|
|
||||||
y <= io_value2;
|
|
||||||
end
|
|
||||||
else if (x > y)
|
|
||||||
x <= x - y;
|
|
||||||
else
|
|
||||||
y <= y - x;
|
|
||||||
end // always @(posedge)
|
|
||||||
assign io_outputGCD = x;
|
|
||||||
assign io_outputValid = y == 16'h0;
|
|
||||||
endmodule
|
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ object Consts {
|
|||||||
val ALU_SLTU = 10.U(EXE_FUN_LEN.W) // 无符号比较小于操作
|
val ALU_SLTU = 10.U(EXE_FUN_LEN.W) // 无符号比较小于操作
|
||||||
val BR_BEQ = 11.U(EXE_FUN_LEN.W) // 分支相等
|
val BR_BEQ = 11.U(EXE_FUN_LEN.W) // 分支相等
|
||||||
val BR_BNE = 12.U(EXE_FUN_LEN.W) // 分支不等
|
val BR_BNE = 12.U(EXE_FUN_LEN.W) // 分支不等
|
||||||
val ALU_JALR = 13.U(EXE_FUN_LEN.W) // JALR跳转
|
val ALU_JAL = 13.U(EXE_FUN_LEN.W) // JAL跳转
|
||||||
val ALU_COPY1 = 14.U(EXE_FUN_LEN.W) // 复制操作
|
val ALU_COPY1 = 14.U(EXE_FUN_LEN.W) // 复制操作
|
||||||
|
|
||||||
// 操作数选择
|
// 操作数选择
|
||||||
|
|||||||
@@ -12,4 +12,86 @@ class Core extends Module {
|
|||||||
val dmem = Flipped(new DmemPortIo)
|
val dmem = Flipped(new DmemPortIo)
|
||||||
val exit = Output(Bool())
|
val exit = Output(Bool())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
val regfile = Mem(32, UInt(WORD_LEN.W))
|
||||||
|
|
||||||
|
// ********* Pipeline Registers *********
|
||||||
|
// IF/ID state
|
||||||
|
val id_reg_pc = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val id_reg_inst = RegInit(0.U(WORD_LEN.W))
|
||||||
|
|
||||||
|
// ID/EX state
|
||||||
|
val exe_reg_pc = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val exe_reg_wb_addr = RegInit(0.U(ADDR_LEN.W))
|
||||||
|
val exe_reg_op1_data = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val exe_reg_op2_data = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val exe_reg_rs2_data = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val exe_reg_exe_fun = RegInit(0.U(EXE_FUN_LEN.W))
|
||||||
|
val exe_reg_mem_wen = RegInit(0.U(MEN_LEN.W))
|
||||||
|
val exe_reg_rf_wen = RegInit(0.U(REN_LEN.W))
|
||||||
|
val exe_reg_wb_sel = RegInit(0.U(WB_SEL_LEN.W))
|
||||||
|
val exe_reg_imm_i_sext = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val exe_reg_imm_s_sext = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val exe_reg_imm_b_sext = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val exe_reg_imm_u_shifted = RegInit(0.U(WORD_LEN.W))
|
||||||
|
|
||||||
|
// EX/MEM state
|
||||||
|
val mem_reg_pc = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val mem_reg_wb_addr = RegInit(0.U(ADDR_LEN.W))
|
||||||
|
val mem_reg_op1_data = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val mem_reg_rs2_data = RegInit(0.U(WORD_LEN.W))
|
||||||
|
val mem_reg_mem_wen = RegInit(0.U(MEN_LEN.W))
|
||||||
|
val mem_reg_rf_wen = RegInit(0.U(REN_LEN.W))
|
||||||
|
val mem_reg_wb_sel = RegInit(0.U(WB_SEL_LEN.W))
|
||||||
|
val mem_reg_alu_out = RegInit(0.U(WORD_LEN.W))
|
||||||
|
|
||||||
|
// MEM/WB state
|
||||||
|
val wb_reg_wb_addr = RegInit(0.U(ADDR_LEN.W))
|
||||||
|
val wb_reg_rf_wen = RegInit(0.U(REN_LEN.W))
|
||||||
|
val wb_reg_wb_data = RegInit(0.U(WORD_LEN.W))
|
||||||
|
|
||||||
|
// ********* Instruction Fetch (IF) Stage *********
|
||||||
|
val if_reg_pc = RegInit(START_ADDR)
|
||||||
|
io.imem.addr := if_reg_pc
|
||||||
|
val if_inst = io.imem.inst
|
||||||
|
|
||||||
|
val stall_flg = Wire(Bool()) // 停顿标志
|
||||||
|
val exe_br_flg = Wire(Bool()) // 跳转标志
|
||||||
|
val exe_br_target = Wire(UInt(WORD_LEN.W)) // 跳转目标地址
|
||||||
|
val exe_jmp_flg = Wire(Bool()) // 跳转标志
|
||||||
|
val exe_alu_out = Wire(UInt(WORD_LEN.W)) // ALU输出
|
||||||
|
|
||||||
|
val if_pc_plus4 = if_reg_pc + 4.U(WORD_LEN.W)
|
||||||
|
val if_pc_next =
|
||||||
|
MuxCase(
|
||||||
|
if_pc_plus4,
|
||||||
|
Seq(
|
||||||
|
exe_br_flg -> exe_br_target,
|
||||||
|
exe_jmp_flg -> exe_alu_out,
|
||||||
|
stall_flg -> if_reg_pc
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if_reg_pc := if_pc_next
|
||||||
|
|
||||||
|
// ********* IF/ID Stage *********
|
||||||
|
id_reg_pc := Mux(stall_flg, id_reg_pc, if_reg_pc)
|
||||||
|
id_reg_inst := MuxCase(
|
||||||
|
if_inst,
|
||||||
|
Seq(
|
||||||
|
(exe_br_flg || exe_jmp_flg) -> BUBBLE,
|
||||||
|
stall_flg -> id_reg_inst
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
// ********* Decode (ID) Stage *********
|
||||||
|
val id_rs1_addr_b = id_reg_inst(25, 21)
|
||||||
|
val id_rs2_addr_b = id_reg_inst(20, 16)
|
||||||
|
|
||||||
|
// 与EX数据冒险
|
||||||
|
val id_rs1_data_hazard =
|
||||||
|
(exe_reg_rf_wen === REN_S) && (id_rs1_addr_b =/= 0.U) && (id_rs1_addr_b === exe_reg_wb_addr)
|
||||||
|
val id_rs2_data_hazard =
|
||||||
|
(exe_reg_rf_wen === REN_S) && (id_rs2_addr_b =/= 0.U) && (id_rs2_addr_b === exe_reg_wb_addr)
|
||||||
|
stall_flg := (id_rs1_data_hazard || id_rs2_data_hazard)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user