LSU Decode added
This commit is contained in:
parent
a19d561a77
commit
5f5f691ec1
3469
quasar_wrapper.fir
3469
quasar_wrapper.fir
File diff suppressed because one or more lines are too long
1722
quasar_wrapper.v
1722
quasar_wrapper.v
File diff suppressed because it is too large
Load Diff
|
@ -162,7 +162,7 @@ class dec extends Module with param with RequireAsyncReset{
|
|||
decode.io.lsu_store_stall_any := io.lsu_store_stall_any
|
||||
decode.io.exu_div_wren := io.exu_div_wren
|
||||
decode.io.dec_tlu_i0_kill_writeb_wb := tlu.io.dec_tlu_i0_kill_writeb_wb
|
||||
decode.io.dec_tlu_flush_lower_wb := tlu.io.dec_tlu_flush_lower_wb
|
||||
decode.io.dec_tlu_flush_lower_wb := tlu.io.tlu_bp.dec_tlu_flush_lower_wb
|
||||
decode.io.dec_tlu_i0_kill_writeb_r := tlu.io.dec_tlu_i0_kill_writeb_r
|
||||
decode.io.dec_tlu_flush_lower_r := tlu.io.tlu_exu.dec_tlu_flush_lower_r
|
||||
decode.io.dec_tlu_flush_pause_r := tlu.io.dec_tlu_flush_pause_r
|
||||
|
@ -303,7 +303,3 @@ class dec extends Module with param with RequireAsyncReset{
|
|||
// debug command read data
|
||||
io.dec_dbg_rddata := decode.io.dec_i0_wdata_r
|
||||
}
|
||||
|
||||
object dec_main extends App {
|
||||
println((new chisel3.stage.ChiselStage).emitVerilog(new dec()))
|
||||
}
|
||||
|
|
|
@ -10,13 +10,11 @@ import lsu._
|
|||
|
||||
class dec_decode_ctl extends Module with lib with RequireAsyncReset{
|
||||
val io = IO(new Bundle{
|
||||
val decode_exu = Flipped(new decode_exu) //connection with exu top
|
||||
val dec_alu = Flipped(new dec_alu) //connection with alu
|
||||
val dec_div = Flipped(new dec_div) //connection with divider
|
||||
val dctl_busbuff = Flipped(new dctl_busbuff()) //connection with bus buffer
|
||||
val dctl_dma = new dctl_dma //connection with dma
|
||||
val dec_aln = Flipped(new aln_dec) //connection with aligner
|
||||
val dbg_dctl = new dbg_dctl() //connection with dbg
|
||||
val decode_exu = Flipped(new decode_exu)
|
||||
val dec_alu = Flipped(new dec_alu)
|
||||
val dec_div = Flipped(new dec_div)
|
||||
val dctl_busbuff = Flipped(new dctl_busbuff())
|
||||
val dctl_dma = new dctl_dma
|
||||
val dec_tlu_flush_extint = Input(Bool())
|
||||
val dec_tlu_force_halt = Input(Bool()) // invalidate nonblock load cam on a force halt event
|
||||
val dec_i0_inst_wb1 = Output(UInt(32.W)) // 32b instruction at wb+1 for trace encoder
|
||||
|
@ -90,8 +88,12 @@ class dec_decode_ctl extends Module with lib with RequireAsyncReset{
|
|||
val dec_pause_state_cg = Output(Bool()) // pause state for clock-gating
|
||||
val dec_div_active = Output(Bool()) // non-block divide is active
|
||||
val scan_mode = Input(Bool())
|
||||
|
||||
val dec_aln = Flipped(new aln_dec)
|
||||
val dbg_dctl = new dbg_dctl()
|
||||
})
|
||||
//packets zero initialization
|
||||
/////////////////////////////////////////////////////////////////////////////////////////
|
||||
// //packets zero initialization
|
||||
io.decode_exu.mul_p := 0.U.asTypeOf(io.decode_exu.mul_p)
|
||||
// Vals defined
|
||||
val leak1_i1_stall_in = WireInit(UInt(1.W), 0.U)
|
||||
|
@ -112,16 +114,17 @@ class dec_decode_ctl extends Module with lib with RequireAsyncReset{
|
|||
val i0_rs2_class_d = Wire(new class_pkt_t)
|
||||
val i0_rs1_depth_d = WireInit(UInt(2.W),0.U)
|
||||
val i0_rs2_depth_d = WireInit(UInt(2.W),0.U)
|
||||
val cam_wen = WireInit(UInt(LSU_NUM_NBLOAD.W), 0.U)
|
||||
val cam_wen=WireInit(UInt(LSU_NUM_NBLOAD.W), 0.U)
|
||||
val cam = Wire(Vec(LSU_NUM_NBLOAD,Valid(new load_cam_pkt_t)))
|
||||
val cam_write = WireInit(UInt(1.W), 0.U)
|
||||
val cam_inv_reset_val = Wire(Vec(LSU_NUM_NBLOAD,UInt(1.W)))
|
||||
val cam_data_reset_val = Wire(Vec(LSU_NUM_NBLOAD,UInt(1.W)))
|
||||
val nonblock_load_write = Wire(Vec(LSU_NUM_NBLOAD,UInt(1.W)))
|
||||
val cam_raw = Wire(Vec(LSU_NUM_NBLOAD,Valid(new load_cam_pkt_t)))
|
||||
val cam_in = Wire(Vec(LSU_NUM_NBLOAD,Valid(new load_cam_pkt_t)))
|
||||
val i0_dp = Wire(new dec_pkt_t)
|
||||
val i0_dp_raw = Wire(new dec_pkt_t)
|
||||
val cam_write=WireInit(UInt(1.W), 0.U)
|
||||
val cam_inv_reset_val=Wire(Vec(LSU_NUM_NBLOAD,UInt(1.W)))
|
||||
val cam_data_reset_val=Wire(Vec(LSU_NUM_NBLOAD,UInt(1.W)))
|
||||
val nonblock_load_write=Wire(Vec(LSU_NUM_NBLOAD,UInt(1.W)))
|
||||
val cam_raw =Wire(Vec(LSU_NUM_NBLOAD,Valid(new load_cam_pkt_t)))
|
||||
val cam_in =Wire(Vec(LSU_NUM_NBLOAD,Valid(new load_cam_pkt_t)))
|
||||
//val i0_temp = Wire(new inst_pkt_t)
|
||||
val i0_dp= Wire(new dec_pkt_t)
|
||||
val i0_dp_raw= Wire(new dec_pkt_t)
|
||||
val i0_rs1bypass = WireInit(UInt(3.W), 0.U)
|
||||
val i0_rs2bypass = WireInit(UInt(3.W), 0.U)
|
||||
val illegal_lockout = WireInit(UInt(1.W), 0.U)
|
||||
|
@ -186,13 +189,14 @@ class dec_decode_ctl extends Module with lib with RequireAsyncReset{
|
|||
(illegal_lockout_in ^ illegal_lockout ) // replaces active_clk
|
||||
|
||||
|
||||
val data_gate_clk = rvclkhdr(clock,data_gate_en.asBool(),io.scan_mode)
|
||||
// End - Data gating
|
||||
val data_gate_clk= rvclkhdr(clock,data_gate_en.asBool(),io.scan_mode)
|
||||
|
||||
// End - Data gating }}
|
||||
|
||||
val i0_brp_valid = io.dec_i0_brp.valid & !leak1_mode
|
||||
io.decode_exu.dec_i0_predict_p_d.bits.misp := 0.U
|
||||
io.decode_exu.dec_i0_predict_p_d.bits.ataken := 0.U
|
||||
io.decode_exu.dec_i0_predict_p_d.bits.boffset := 0.U
|
||||
io.decode_exu.dec_i0_predict_p_d.bits.misp :=0.U
|
||||
io.decode_exu.dec_i0_predict_p_d.bits.ataken :=0.U
|
||||
io.decode_exu.dec_i0_predict_p_d.bits.boffset :=0.U
|
||||
io.decode_exu.dec_i0_predict_p_d.bits.pcall := i0_pcall // don't mark as pcall if branch error
|
||||
io.decode_exu.dec_i0_predict_p_d.bits.pja := i0_pja
|
||||
io.decode_exu.dec_i0_predict_p_d.bits.pret := i0_pret
|
||||
|
@ -220,6 +224,7 @@ class dec_decode_ctl extends Module with lib with RequireAsyncReset{
|
|||
// on i0 instruction fetch access fault turn anything into a nop
|
||||
// nop => alu rs1 imm12 rd lor
|
||||
val i0_icaf_d = io.dec_i0_icaf_d | io.dec_i0_dbecc_d
|
||||
|
||||
val i0_instr_error = i0_icaf_d;
|
||||
i0_dp := i0_dp_raw
|
||||
when((i0_br_error_all | i0_instr_error).asBool){
|
||||
|
@ -237,6 +242,7 @@ class dec_decode_ctl extends Module with lib with RequireAsyncReset{
|
|||
|
||||
// branches that can be predicted
|
||||
val i0_predict_br = i0_dp.condbr | i0_pcall | i0_pja | i0_pret;
|
||||
|
||||
val i0_predict_nt = !(io.dec_i0_brp.bits.hist(1) & i0_brp_valid) & i0_predict_br
|
||||
val i0_predict_t = (io.dec_i0_brp.bits.hist(1) & i0_brp_valid) & i0_predict_br
|
||||
val i0_ap_pc2 = !io.dec_i0_pc4_d
|
||||
|
@ -661,7 +667,7 @@ class dec_decode_ctl extends Module with lib with RequireAsyncReset{
|
|||
io.dec_i0_wdata_r := i0_result_corr_r
|
||||
|
||||
val i0_result_r_raw = rvdffe(i0_result_x,i0_r_data_en.asBool,clock,io.scan_mode)
|
||||
if ( LOAD_TO_USE_PLUS1) {
|
||||
if ( LOAD_TO_USE_PLUS1 == 1 ) {
|
||||
i0_result_x := io.decode_exu.exu_i0_result_x
|
||||
i0_result_r := Mux((r_d.bits.i0v & r_d.bits.i0load).asBool,io.lsu_result_m, i0_result_r_raw)
|
||||
}
|
||||
|
@ -741,7 +747,7 @@ class dec_decode_ctl extends Module with lib with RequireAsyncReset{
|
|||
i0_rs2_depth_d := Mux(i0_rs2_depend_i0_x.asBool,1.U(2.W),Mux(i0_rs2_depend_i0_r.asBool, 2.U(2.W), 0.U))
|
||||
|
||||
// stores will bypass load data in the lsu pipe
|
||||
if (LOAD_TO_USE_PLUS1) {
|
||||
if (LOAD_TO_USE_PLUS1 == 1) {
|
||||
i0_load_block_d := (i0_rs1_class_d.load & i0_rs1_depth_d) | (i0_rs2_class_d.load & i0_rs2_depth_d(0) & !i0_dp.store)
|
||||
load_ldst_bypass_d := (i0_dp.load | i0_dp.store) & i0_rs1_depth_d(1) & i0_rs1_class_d.load
|
||||
store_data_bypass_d := i0_dp.store & (i0_rs2_depth_d(1) & i0_rs2_class_d.load)
|
||||
|
|
|
@ -141,7 +141,6 @@ class dec_tlu_ctl_IO extends Bundle with lib {
|
|||
val dec_tlu_pic_clk_override = Output(UInt(1.W)) // override PIC clock domain gating
|
||||
val dec_tlu_dccm_clk_override = Output(UInt(1.W)) // override DCCM clock domain gating
|
||||
val dec_tlu_icm_clk_override = Output(UInt(1.W)) // override ICCM clock domain gating
|
||||
val dec_tlu_flush_lower_wb = Output(Bool())
|
||||
val ifu_pmu_instr_aligned = Input(UInt(1.W))
|
||||
val tlu_bp = Flipped(new dec_bp)
|
||||
val tlu_ifc = Flipped(new dec_ifc)
|
||||
|
@ -330,6 +329,8 @@ class dec_tlu_ctl extends Module with lib with RequireAsyncReset with CSR_VAL{
|
|||
val internal_dbg_halt_mode_f2 =withClock(io.free_clk){RegNext(internal_dbg_halt_mode_f,0.U)}
|
||||
io.tlu_mem.dec_tlu_force_halt :=withClock(io.free_clk){RegNext(force_halt,0.U)}
|
||||
|
||||
|
||||
|
||||
io.dec_tlu_i0_kill_writeb_r :=tlu_i0_kill_writeb_r
|
||||
val reset_detect =withClock(io.free_clk){RegNext(1.U(1.W),0.U)}
|
||||
val reset_detected =withClock(io.free_clk){RegNext(reset_detect,0.U)}
|
||||
|
@ -340,8 +341,7 @@ class dec_tlu_ctl extends Module with lib with RequireAsyncReset with CSR_VAL{
|
|||
val nmi_lsu_load_type_f =withClock(io.free_clk){RegNext(nmi_lsu_load_type,0.U)}
|
||||
val nmi_lsu_store_type_f =withClock(io.free_clk){RegNext(nmi_lsu_store_type,0.U)}
|
||||
|
||||
io.tlu_bp.dec_tlu_flush_lower_wb := io.dec_tlu_flush_lower_wb
|
||||
io.tlu_mem.dec_tlu_flush_lower_wb := io.tlu_bp.dec_tlu_flush_lower_wb
|
||||
|
||||
// Filter subsequent bus errors after the first, until the lock on MDSEAC is cleared
|
||||
val nmi_lsu_detected = ~mdseac_locked_f & (io.tlu_busbuff.lsu_imprecise_error_load_any | io.tlu_busbuff.lsu_imprecise_error_store_any)
|
||||
|
||||
|
@ -440,7 +440,7 @@ class dec_tlu_ctl extends Module with lib with RequireAsyncReset with CSR_VAL{
|
|||
val dbg_cmd_done_ns = io.dec_tlu_i0_valid_r & io.dec_tlu_dbg_halted
|
||||
|
||||
// used to hold off commits after an in-pipe debug mode request (triggers, DCSR)
|
||||
val request_debug_mode_r = (trigger_hit_dmode_r | ebreak_to_debug_mode_r) | (request_debug_mode_r_d1 & ~io.dec_tlu_flush_lower_wb)
|
||||
val request_debug_mode_r = (trigger_hit_dmode_r | ebreak_to_debug_mode_r) | (request_debug_mode_r_d1 & ~io.tlu_bp.dec_tlu_flush_lower_wb)
|
||||
|
||||
val request_debug_mode_done = (request_debug_mode_r_d1 | request_debug_mode_done_f) & ~dbg_tlu_halted_f
|
||||
|
||||
|
@ -516,7 +516,7 @@ class dec_tlu_ctl extends Module with lib with RequireAsyncReset with CSR_VAL{
|
|||
|
||||
val i0trigger_qual_r = Fill(4,i0_trigger_eval_r) & io.dec_tlu_packet_r.i0trigger(3,0) & i0_iside_trigger_has_pri_r & i0_lsu_trigger_has_pri_r & trigger_enabled
|
||||
// Qual trigger hits
|
||||
val i0_trigger_r = ~(Fill(4,io.dec_tlu_flush_lower_wb | io.dec_tlu_dbg_halted)) & i0trigger_qual_r
|
||||
val i0_trigger_r = ~(Fill(4,io.tlu_bp.dec_tlu_flush_lower_wb | io.dec_tlu_dbg_halted)) & i0trigger_qual_r
|
||||
|
||||
// chaining can mask raw trigger info
|
||||
val i0_trigger_chain_masked_r = Cat(i0_trigger_r(3) & (~mtdata1_t(2)(MTDATA1_CHAIN) | i0_trigger_r(2)), i0_trigger_r(2) & (~mtdata1_t(2)(MTDATA1_CHAIN) | i0_trigger_r(3)), i0_trigger_r(1) & (~mtdata1_t(0)(MTDATA1_CHAIN) | i0_trigger_r(0)), i0_trigger_r(0) & (~mtdata1_t(0)(MTDATA1_CHAIN) | i0_trigger_r(1)))
|
||||
|
@ -605,7 +605,7 @@ class dec_tlu_ctl extends Module with lib with RequireAsyncReset with CSR_VAL{
|
|||
mdseac_locked_f :=withClock(io.free_clk){RegNext(mdseac_locked_ns,0.U)}
|
||||
val lsu_single_ecc_error_r_d1 =withClock(io.free_clk){RegNext(lsu_single_ecc_error_r,0.U)}
|
||||
val lsu_error_pkt_addr_r =io.lsu_error_pkt_r.bits.addr
|
||||
val lsu_exc_valid_r_raw = io.lsu_error_pkt_r.valid & ~io.dec_tlu_flush_lower_wb
|
||||
val lsu_exc_valid_r_raw = io.lsu_error_pkt_r.valid & ~io.tlu_bp.dec_tlu_flush_lower_wb
|
||||
lsu_i0_exc_r_raw := io.lsu_error_pkt_r.valid
|
||||
val lsu_i0_exc_r = lsu_i0_exc_r_raw & lsu_exc_valid_r_raw & ~i0_trigger_hit_r & ~rfpc_i0_r
|
||||
val lsu_exc_valid_r = lsu_i0_exc_r
|
||||
|
@ -739,7 +739,7 @@ class dec_tlu_ctl extends Module with lib with RequireAsyncReset with CSR_VAL{
|
|||
val block_interrupts = ((internal_dbg_halt_mode & (~dcsr_single_step_running | io.dec_tlu_i0_valid_r)) | internal_pmu_fw_halt_mode | i_cpu_halt_req_d1 | take_nmi | ebreak_to_debug_mode_r | synchronous_flush_r | exc_or_int_valid_r_d1 | mret_r | ext_int_freeze_d1)
|
||||
|
||||
|
||||
if(FAST_INTERRUPT_REDIRECT) {
|
||||
if(FAST_INTERRUPT_REDIRECT==1) {
|
||||
take_ext_int_start_d1:=withClock(io.free_clk){RegNext(take_ext_int_start,0.U)}
|
||||
take_ext_int_start_d2:=withClock(io.free_clk){RegNext(take_ext_int_start_d1,0.U)}
|
||||
take_ext_int_start_d3:=withClock(io.free_clk){RegNext(take_ext_int_start_d2,0.U)}
|
||||
|
@ -797,8 +797,8 @@ class dec_tlu_ctl extends Module with lib with RequireAsyncReset with CSR_VAL{
|
|||
|
||||
val tlu_flush_path_r_d1=withClock(e4e5_int_clk){RegNext(tlu_flush_path_r,0.U)} ///After Combining Code revisit this
|
||||
|
||||
io.dec_tlu_flush_lower_wb := tlu_flush_lower_r_d1
|
||||
// io.tlu_mem.dec_tlu_flush_lower_wb := io.dec_tlu_flush_lower_wb
|
||||
io.tlu_bp.dec_tlu_flush_lower_wb := tlu_flush_lower_r_d1
|
||||
io.tlu_mem.dec_tlu_flush_lower_wb := io.tlu_bp.dec_tlu_flush_lower_wb
|
||||
io.tlu_exu.dec_tlu_flush_lower_r := tlu_flush_lower_r
|
||||
io.tlu_exu.dec_tlu_flush_path_r := tlu_flush_path_r ///After Combining Code revisit this
|
||||
|
||||
|
@ -1747,7 +1747,7 @@ val wr_mcycleh_r = WireInit(UInt(1.W), 0.U)
|
|||
mfdc_int := rvdffe(mfdc_ns,wr_mfdc_r.asBool,clock,io.scan_mode)
|
||||
// rvdffe #(15) mfdc_ff (.*, .en(wr_mfdc_r), .din({mfdc_ns[14:0]}), .dout(mfdc_int[14:0]));
|
||||
|
||||
if(BUILD_AXI4){
|
||||
if(BUILD_AXI4 == 1){
|
||||
// flip poweron value of bit 6 for AXI build
|
||||
mfdc_ns := Cat(~io.dec_csr_wrdata_r(18,16),io.dec_csr_wrdata_r(11,7), ~io.dec_csr_wrdata_r(6), io.dec_csr_wrdata_r(5,0))
|
||||
mfdc := Cat(~mfdc_int(14,12),0.U(4.W), mfdc_int(11,7), ~mfdc_int(6), mfdc_int(5,0))
|
||||
|
@ -2118,7 +2118,7 @@ miccme_ce_req := (("hffffffff".U(32.W) << miccmect(31,27)) & Cat(0.U(5.W), miccm
|
|||
|
||||
val dicad0h = rvdffe(dicad0h_ns,(wr_dicad0h_r | io.ifu_ic_debug_rd_data_valid).asBool,clock,io.scan_mode)
|
||||
|
||||
if (ICACHE_ECC) {
|
||||
if (ICACHE_ECC == 1) {
|
||||
// ----------------------------------------------------------------------
|
||||
// DICAD1 (R/W) (Only accessible in debug mode)
|
||||
// [6:0] : ECC
|
||||
|
@ -2151,7 +2151,7 @@ miccme_ce_req := (("hffffffff".U(32.W) << miccmect(31,27)) & Cat(0.U(5.W), miccm
|
|||
// DICAGO (R/W) (Only accessible in debug mode)
|
||||
// [0] : Go
|
||||
|
||||
if (ICACHE_ECC) io.dec_tlu_ic_diag_pkt.icache_wrdata := Cat(dicad1(6,0), dicad0h(31,0), dicad0(31,0))
|
||||
if (ICACHE_ECC == 1) io.dec_tlu_ic_diag_pkt.icache_wrdata := Cat(dicad1(6,0), dicad0h(31,0), dicad0(31,0))
|
||||
else io.dec_tlu_ic_diag_pkt.icache_wrdata := Cat(0.U(2.W),dicad1(3,0), dicad0h(31,0), dicad0(31,0))
|
||||
|
||||
io.dec_tlu_ic_diag_pkt.icache_dicawics := dicawics
|
||||
|
|
|
@ -419,9 +419,9 @@ class quasar extends Module with RequireAsyncReset with lib {
|
|||
|
||||
io.dmi_reg_rdata := 0.U
|
||||
}
|
||||
object QUASAR extends App {
|
||||
println((new chisel3.stage.ChiselStage).emitVerilog(new quasar()))
|
||||
}
|
||||
//object QUASAR extends App {
|
||||
// println((new chisel3.stage.ChiselStage).emitVerilog(new quasar()))
|
||||
//}
|
||||
|
||||
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue