icm updated
This commit is contained in:
parent
bd9fab210f
commit
8d2afa4334
|
@ -7,6 +7,19 @@
|
||||||
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_hit"
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_hit"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"class":"firrtl.transforms.CombinationalPath",
|
||||||
|
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_sel_premux_data",
|
||||||
|
"sources":[
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_exu_flush_final",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifu_bp_hit_taken_f",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_hit_f",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_hit",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifu_axi_rid",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifu_axi_rvalid",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifu_bus_clk_en"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"class":"firrtl.transforms.CombinationalPath",
|
"class":"firrtl.transforms.CombinationalPath",
|
||||||
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_write_stall",
|
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_write_stall",
|
||||||
|
@ -72,17 +85,6 @@
|
||||||
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_hit"
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_hit"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"class":"firrtl.transforms.CombinationalPath",
|
|
||||||
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_dma_active",
|
|
||||||
"sources":[
|
|
||||||
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_dec_tlu_flush_err_wb",
|
|
||||||
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_exu_flush_final",
|
|
||||||
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_dec_tlu_i0_commit_cmt",
|
|
||||||
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifu_fetch_val",
|
|
||||||
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_data"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"class":"firrtl.transforms.CombinationalPath",
|
"class":"firrtl.transforms.CombinationalPath",
|
||||||
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_debug_rd_en",
|
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_debug_rd_en",
|
||||||
|
@ -165,6 +167,20 @@
|
||||||
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_hit"
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_hit"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"class":"firrtl.transforms.CombinationalPath",
|
||||||
|
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_premux_data",
|
||||||
|
"sources":[
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_iccm_rd_data",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_exu_flush_final",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifu_bp_hit_taken_f",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_hit_f",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_hit",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifu_axi_rid",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifu_axi_rvalid",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifu_bus_clk_en"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"class":"firrtl.transforms.CombinationalPath",
|
"class":"firrtl.transforms.CombinationalPath",
|
||||||
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_iccm_wr_size",
|
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_iccm_wr_size",
|
||||||
|
@ -180,6 +196,18 @@
|
||||||
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_dec_tlu_ic_diag_pkt_icache_wr_valid"
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_dec_tlu_ic_diag_pkt_icache_wr_valid"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"class":"firrtl.transforms.CombinationalPath",
|
||||||
|
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_dma_active",
|
||||||
|
"sources":[
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_dec_tlu_flush_err_wb",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_exu_flush_final",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_dec_tlu_i0_commit_cmt",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifu_fetch_val",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_data_f",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_data"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"class":"firrtl.transforms.CombinationalPath",
|
"class":"firrtl.transforms.CombinationalPath",
|
||||||
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_iccm_dma_ecc_error",
|
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_iccm_dma_ecc_error",
|
||||||
|
@ -251,6 +279,27 @@
|
||||||
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_exu_flush_final"
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_exu_flush_final"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"class":"firrtl.transforms.CombinationalPath",
|
||||||
|
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_iccm_ready",
|
||||||
|
"sources":[
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_iccm_dma_sb_error",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ifc_dma_access_ok",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_dec_tlu_core_ecc_disable",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_iccm_rd_data_ecc",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_exu_flush_final",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_fetch_val_f",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_hit_f",
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_hit"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"class":"firrtl.transforms.CombinationalPath",
|
||||||
|
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_data_f",
|
||||||
|
"sources":[
|
||||||
|
"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_rd_data"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"class":"firrtl.transforms.CombinationalPath",
|
"class":"firrtl.transforms.CombinationalPath",
|
||||||
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_debug_wr_data",
|
"sink":"~el2_ifu_mem_ctl|el2_ifu_mem_ctl>io_ic_debug_wr_data",
|
||||||
|
|
24658
el2_ifu_mem_ctl.fir
24658
el2_ifu_mem_ctl.fir
File diff suppressed because it is too large
Load Diff
9384
el2_ifu_mem_ctl.v
9384
el2_ifu_mem_ctl.v
File diff suppressed because it is too large
Load Diff
|
@ -124,86 +124,30 @@ class mem_ctl_bundle extends Bundle with el2_lib{
|
||||||
}
|
}
|
||||||
class el2_ifu_mem_ctl extends Module with el2_lib {
|
class el2_ifu_mem_ctl extends Module with el2_lib {
|
||||||
val io = IO(new mem_ctl_bundle)
|
val io = IO(new mem_ctl_bundle)
|
||||||
|
|
||||||
io.ic_debug_rd_en:=0.U
|
|
||||||
io.ic_debug_wr_en:=0.U
|
|
||||||
io.ic_debug_tag_array:=0.U
|
|
||||||
io.ifu_miss_state_idle:=0.U
|
|
||||||
io.ifu_ic_mb_empty:=0.U
|
|
||||||
io.ic_dma_active:=0.U
|
|
||||||
io.ic_write_stall:=0.U
|
|
||||||
io.ifu_pmu_ic_miss:=0.U
|
|
||||||
io.ifu_pmu_ic_hit:=0.U
|
|
||||||
io.ifu_pmu_bus_error:=0.U
|
|
||||||
io.ifu_pmu_bus_busy:=0.U
|
|
||||||
io.ifu_pmu_bus_trxn:=0.U
|
|
||||||
io.ifu_axi_awvalid:=0.U
|
|
||||||
io.ifu_axi_awid:=0.U
|
|
||||||
io.ifu_axi_awaddr:=0.U
|
|
||||||
io.ifu_axi_awlen:=0.U
|
|
||||||
io.ifu_axi_awsize:=0.U
|
|
||||||
io.ifu_axi_awburst:=0.U
|
|
||||||
io.ifu_axi_awlock:=0.U
|
|
||||||
io.ifu_axi_awcache:=0.U
|
|
||||||
io.ifu_axi_awprot:=0.U
|
|
||||||
io.ifu_axi_awqos:=0.U
|
|
||||||
io.ifu_axi_wvalid := 0.U
|
io.ifu_axi_wvalid := 0.U
|
||||||
io.ifu_axi_wdata := 0.U
|
io.ifu_axi_wdata := 0.U
|
||||||
io.ifu_axi_wstrb:=0.U
|
io.ifu_axi_awqos := 0.U
|
||||||
io.ifu_axi_wlast:=0.U
|
io.ifu_axi_awaddr := 0.U
|
||||||
io.ifu_axi_bready:=0.U
|
io.ifu_axi_awprot := 0.U
|
||||||
io.ifu_axi_arvalid:=0.U
|
io.ifu_axi_awlen := 0.U
|
||||||
io.ic_debug_addr:=0.U
|
|
||||||
io.ifu_axi_arid:=0.U
|
|
||||||
io.ifu_axi_araddr:=0.U
|
|
||||||
io.ifu_axi_arregion:=0.U
|
|
||||||
io.ifu_axi_arlen:=0.U
|
|
||||||
io.ifu_axi_arsize:=0.U
|
|
||||||
io.ifu_axi_arburst:=0.U
|
|
||||||
io.ifu_axi_arlock := 0.U
|
io.ifu_axi_arlock := 0.U
|
||||||
io.ifu_axi_arcache:=0.U
|
|
||||||
io.ifu_axi_arprot:=0.U
|
|
||||||
io.ifu_axi_arqos:=0.U
|
|
||||||
io.ifu_axi_rready:=0.U
|
|
||||||
io.iccm_dma_ecc_error:=0.U
|
|
||||||
io.iccm_dma_rvalid:=0.U
|
|
||||||
io.iccm_dma_rdata:=0.U
|
|
||||||
io.iccm_dma_rtag:=0.U
|
|
||||||
io.iccm_ready:=0.U
|
|
||||||
io.ic_rw_addr:=0.U
|
|
||||||
io.ic_wr_en:=0.U
|
|
||||||
io.ic_rd_en:=0.U
|
|
||||||
io.ic_wr_data:=(0 until ICACHE_BANKS_WAY).map(i=>0.U) // TODO
|
|
||||||
io.ic_debug_wr_data:=0.U
|
|
||||||
io.ifu_ic_debug_rd_data:=0.U
|
|
||||||
io.ic_tag_valid:=0.U
|
|
||||||
io.iccm_rw_addr:=0.U
|
|
||||||
io.iccm_wren:=0.U
|
|
||||||
io.iccm_rden:=0.U
|
|
||||||
io.iccm_wr_data:=0.U
|
|
||||||
io.iccm_wr_size:=0.U
|
|
||||||
io.ic_hit_f:=0.U
|
|
||||||
io.ic_access_fault_f:=0.U
|
|
||||||
io.ic_access_fault_type_f:=0.U
|
|
||||||
io.iccm_rd_ecc_single_err:=0.U
|
|
||||||
io.iccm_rd_ecc_double_err:=0.U
|
|
||||||
io.ic_error_start:=0.U
|
|
||||||
io.ifu_async_error_start:=0.U
|
|
||||||
io.iccm_dma_sb_error:=0.U
|
|
||||||
io.ic_fetch_val_f:=0.U
|
|
||||||
io.ic_data_f:=0.U
|
|
||||||
io.ic_premux_data:=0.U
|
|
||||||
io.ic_sel_premux_data:=0.U
|
|
||||||
io.ifu_ic_debug_rd_data_valid:=0.U
|
|
||||||
io.iccm_buf_correct_ecc:=0.U
|
|
||||||
io.iccm_correction_state:=0.U
|
|
||||||
io.ic_debug_way:=0.U
|
|
||||||
io.ifu_axi_awregion := 0.U
|
io.ifu_axi_awregion := 0.U
|
||||||
|
io.ifu_axi_awid := 0.U
|
||||||
|
io.ifu_axi_awvalid := 0.U
|
||||||
|
io.ifu_axi_wstrb := 0.U
|
||||||
|
io.ifu_axi_awcache := 0.U
|
||||||
|
io.ifu_axi_arqos := 0.U
|
||||||
|
io.ifu_axi_awlock := 0.U
|
||||||
|
io.ifu_axi_bready := 0.U
|
||||||
|
io.ifu_axi_arlen := 0.U
|
||||||
|
io.ifu_axi_awsize := 0.U
|
||||||
|
io.ifu_axi_arprot := 0.U
|
||||||
|
io.ifu_axi_awburst := 0.U
|
||||||
|
io.ifu_axi_wlast := 0.U
|
||||||
val idle_C :: crit_byp_ok_C :: hit_u_miss_C :: miss_wait_C :: crit_wrd_rdy_C :: scnd_miss_C :: stream_C :: stall_scnd_miss_C :: Nil = Enum(8)
|
val idle_C :: crit_byp_ok_C :: hit_u_miss_C :: miss_wait_C :: crit_wrd_rdy_C :: scnd_miss_C :: stream_C :: stall_scnd_miss_C :: Nil = Enum(8)
|
||||||
val err_stop_idle_C :: err_fetch1_C :: err_fetch2_C :: err_stop_fetch_C :: Nil = Enum(4)
|
val err_stop_idle_C :: err_fetch1_C :: err_fetch2_C :: err_stop_fetch_C :: Nil = Enum(4)
|
||||||
val err_idle_C :: ic_wff_C :: ecc_wff_C :: ecc_cor_C :: dma_sb_err_C :: Nil = Enum(5)
|
val err_idle_C :: ic_wff_C :: ecc_wff_C :: ecc_cor_C :: dma_sb_err_C :: Nil = Enum(5)
|
||||||
|
|
||||||
|
|
||||||
val iccm_single_ecc_error = WireInit(UInt(2.W), 0.U)
|
val iccm_single_ecc_error = WireInit(UInt(2.W), 0.U)
|
||||||
val ifc_fetch_req_f = WireInit(Bool(), 0.U)
|
val ifc_fetch_req_f = WireInit(Bool(), 0.U)
|
||||||
val miss_pending = WireInit(Bool(), false.B)
|
val miss_pending = WireInit(Bool(), false.B)
|
||||||
|
@ -371,8 +315,8 @@ class el2_ifu_mem_ctl extends Module with el2_lib {
|
||||||
ifc_region_acc_fault_final_f := RegNext(ifc_region_acc_fault_final_bf, 0.U)
|
ifc_region_acc_fault_final_f := RegNext(ifc_region_acc_fault_final_bf, 0.U)
|
||||||
val ifc_region_acc_fault_f = RegNext(io.ifc_region_acc_fault_bf, 0.U)
|
val ifc_region_acc_fault_f = RegNext(io.ifc_region_acc_fault_bf, 0.U)
|
||||||
val ifu_ic_req_addr_f = Cat(miss_addr, ic_req_addr_bits_hi_3)
|
val ifu_ic_req_addr_f = Cat(miss_addr, ic_req_addr_bits_hi_3)
|
||||||
val ifu_ic_mb_empty = (((miss_state===hit_u_miss_C) | (miss_state===stream_C)) & !(bus_ifu_wr_en_ff & last_beat)) | !miss_pending
|
io.ifu_ic_mb_empty := (((miss_state===hit_u_miss_C) | (miss_state===stream_C)) & !(bus_ifu_wr_en_ff & last_beat)) | !miss_pending
|
||||||
val ifu_miss_state_idle = miss_state === idle_C
|
io.ifu_miss_state_idle := miss_state === idle_C
|
||||||
val write_ic_16_bytes = WireInit(Bool(), false.B)
|
val write_ic_16_bytes = WireInit(Bool(), false.B)
|
||||||
val reset_tag_valid_for_miss = WireInit(Bool(), false.B)
|
val reset_tag_valid_for_miss = WireInit(Bool(), false.B)
|
||||||
val sel_mb_addr = (miss_pending & write_ic_16_bytes & !uncacheable_miss_ff) | reset_tag_valid_for_miss
|
val sel_mb_addr = (miss_pending & write_ic_16_bytes & !uncacheable_miss_ff) | reset_tag_valid_for_miss
|
||||||
|
@ -381,7 +325,7 @@ class el2_ifu_mem_ctl extends Module with el2_lib {
|
||||||
val bus_ifu_wr_en_ff_q = WireInit(Bool(), false.B)
|
val bus_ifu_wr_en_ff_q = WireInit(Bool(), false.B)
|
||||||
val sel_mb_status_addr = miss_pending & write_ic_16_bytes & !uncacheable_miss_ff & last_beat & bus_ifu_wr_en_ff_q
|
val sel_mb_status_addr = miss_pending & write_ic_16_bytes & !uncacheable_miss_ff & last_beat & bus_ifu_wr_en_ff_q
|
||||||
val ifu_status_wr_addr = Mux(sel_mb_status_addr, Cat(imb_ff(30, ICACHE_BEAT_ADDR_HI),ic_wr_addr_bits_hi_3, imb_ff(1,0)), ifu_fetch_addr_int_f)
|
val ifu_status_wr_addr = Mux(sel_mb_status_addr, Cat(imb_ff(30, ICACHE_BEAT_ADDR_HI),ic_wr_addr_bits_hi_3, imb_ff(1,0)), ifu_fetch_addr_int_f)
|
||||||
val ic_rw_addr = ifu_ic_rw_int_addr
|
io.ic_rw_addr := ifu_ic_rw_int_addr
|
||||||
sel_mb_addr_ff := withClock(io.free_clk){RegNext(sel_mb_addr, 0.U)}
|
sel_mb_addr_ff := withClock(io.free_clk){RegNext(sel_mb_addr, 0.U)}
|
||||||
val ifu_bus_rdata_ff = WireInit(UInt(64.W), 0.U)
|
val ifu_bus_rdata_ff = WireInit(UInt(64.W), 0.U)
|
||||||
val ic_miss_buff_half = WireInit(UInt(64.W), 0.U)
|
val ic_miss_buff_half = WireInit(UInt(64.W), 0.U)
|
||||||
|
@ -422,9 +366,10 @@ class el2_ifu_mem_ctl extends Module with el2_lib {
|
||||||
val ic_premux_data = if(ICCM_ICACHE) (Fill(64,sel_iccm_data) & io.iccm_rd_data) | (Fill(64, sel_byp_data) & ic_byp_data_only_new)
|
val ic_premux_data = if(ICCM_ICACHE) (Fill(64,sel_iccm_data) & io.iccm_rd_data) | (Fill(64, sel_byp_data) & ic_byp_data_only_new)
|
||||||
else if(ICACHE_ONLY) Fill(64, sel_byp_data) & ic_byp_data_only_new else 0.U
|
else if(ICACHE_ONLY) Fill(64, sel_byp_data) & ic_byp_data_only_new else 0.U
|
||||||
val ic_sel_premux_data = if(ICCM_ICACHE) sel_iccm_data | sel_byp_data else if(ICACHE_ONLY) sel_byp_data else 0.U
|
val ic_sel_premux_data = if(ICCM_ICACHE) sel_iccm_data | sel_byp_data else if(ICACHE_ONLY) sel_byp_data else 0.U
|
||||||
|
io.ic_premux_data := ic_premux_data
|
||||||
|
io.ic_sel_premux_data := ic_sel_premux_data
|
||||||
val ifc_bus_acc_fault_f = ic_byp_hit_f & ifu_byp_data_err_new
|
val ifc_bus_acc_fault_f = ic_byp_hit_f & ifu_byp_data_err_new
|
||||||
val ic_data_f = ic_final_data
|
io.ic_data_f := ic_final_data
|
||||||
val fetch_req_f_qual = io.ic_hit_f & !io.exu_flush_final
|
val fetch_req_f_qual = io.ic_hit_f & !io.exu_flush_final
|
||||||
val ifc_region_acc_fault_memory_f = WireInit(Bool(), 0.U)
|
val ifc_region_acc_fault_memory_f = WireInit(Bool(), 0.U)
|
||||||
io.ic_access_fault_f := (ifc_region_acc_fault_final_f | ifc_bus_acc_fault_f) & !io.exu_flush_final
|
io.ic_access_fault_f := (ifc_region_acc_fault_final_f | ifc_bus_acc_fault_f) & !io.exu_flush_final
|
||||||
|
@ -433,7 +378,7 @@ class el2_ifu_mem_ctl extends Module with el2_lib {
|
||||||
Mux(ifc_region_acc_fault_memory_f.asBool(), 3.U, 0.U)))
|
Mux(ifc_region_acc_fault_memory_f.asBool(), 3.U, 0.U)))
|
||||||
val ifu_bp_inst_mask_f = WireInit(Bool(), 0.U)
|
val ifu_bp_inst_mask_f = WireInit(Bool(), 0.U)
|
||||||
io.ic_fetch_val_f := Cat(fetch_req_f_qual & ifu_bp_inst_mask_f & !(vaddr_f===Fill(ICACHE_BEAT_ADDR_HI,1.U)) & (err_stop_state=/=err_fetch2_C), fetch_req_f_qual)
|
io.ic_fetch_val_f := Cat(fetch_req_f_qual & ifu_bp_inst_mask_f & !(vaddr_f===Fill(ICACHE_BEAT_ADDR_HI,1.U)) & (err_stop_state=/=err_fetch2_C), fetch_req_f_qual)
|
||||||
val two_byte_instr = ic_data_f(1,0) =/= 3.U
|
val two_byte_instr = io.ic_data_f(1,0) =/= 3.U
|
||||||
//// Creating full buffer
|
//// Creating full buffer
|
||||||
val ifu_bus_rsp_rdata = WireInit(UInt(64.W), 0.U)
|
val ifu_bus_rsp_rdata = WireInit(UInt(64.W), 0.U)
|
||||||
val ic_miss_buff_data_in = ifu_bus_rsp_rdata
|
val ic_miss_buff_data_in = ifu_bus_rsp_rdata
|
||||||
|
@ -519,7 +464,9 @@ class el2_ifu_mem_ctl extends Module with el2_lib {
|
||||||
val perr_err_inv_way = Fill(ICACHE_NUM_WAYS, perr_sel_invalidate)
|
val perr_err_inv_way = Fill(ICACHE_NUM_WAYS, perr_sel_invalidate)
|
||||||
iccm_correct_ecc := perr_state === ecc_cor_C
|
iccm_correct_ecc := perr_state === ecc_cor_C
|
||||||
val dma_sb_err_state = perr_state === dma_sb_err_C
|
val dma_sb_err_state = perr_state === dma_sb_err_C
|
||||||
val dma_sb_err_state_ff = withClock(io.active_clk){RegNext(dma_sb_err_state, 0.U)}
|
val dma_sb_err_state_ff = Wire(Bool())
|
||||||
|
io.iccm_buf_correct_ecc := iccm_correct_ecc & !dma_sb_err_state_ff
|
||||||
|
dma_sb_err_state_ff := withClock(io.active_clk){RegNext(dma_sb_err_state, false.B)}
|
||||||
|
|
||||||
///////////////////////////////// ERROR FSM /////////////////////////////////
|
///////////////////////////////// ERROR FSM /////////////////////////////////
|
||||||
val perr_nxtstate = WireInit(UInt(3.W), 0.U)
|
val perr_nxtstate = WireInit(UInt(3.W), 0.U)
|
||||||
|
@ -553,8 +500,8 @@ class el2_ifu_mem_ctl extends Module with el2_lib {
|
||||||
///////////////////////////////// STOP FETCH FSM /////////////////////////////////
|
///////////////////////////////// STOP FETCH FSM /////////////////////////////////
|
||||||
val err_stop_nxtstate = WireInit(UInt(2.W), 0.U)
|
val err_stop_nxtstate = WireInit(UInt(2.W), 0.U)
|
||||||
val err_stop_state_en = WireInit(Bool(), false.B)
|
val err_stop_state_en = WireInit(Bool(), false.B)
|
||||||
|
io.iccm_correction_state := false.B
|
||||||
// val err_stop_fetch := WireInit(Bool(), false.B)
|
// val err_stop_fetch := WireInit(Bool(), false.B)
|
||||||
val iccm_correction_state = WireInit(Bool(), false.B)
|
|
||||||
switch(err_stop_state){
|
switch(err_stop_state){
|
||||||
is(err_stop_idle_C){
|
is(err_stop_idle_C){
|
||||||
err_stop_nxtstate := err_fetch1_C
|
err_stop_nxtstate := err_fetch1_C
|
||||||
|
@ -566,21 +513,21 @@ class el2_ifu_mem_ctl extends Module with el2_lib {
|
||||||
Mux(io.ifu_fetch_val(0).asBool(), err_fetch2_C, err_fetch1_C)))
|
Mux(io.ifu_fetch_val(0).asBool(), err_fetch2_C, err_fetch1_C)))
|
||||||
err_stop_state_en := io.dec_tlu_flush_lower_wb | io.dec_tlu_i0_commit_cmt | io.ifu_fetch_val(0) | ifu_bp_hit_taken_q_f | io.dec_tlu_force_halt
|
err_stop_state_en := io.dec_tlu_flush_lower_wb | io.dec_tlu_i0_commit_cmt | io.ifu_fetch_val(0) | ifu_bp_hit_taken_q_f | io.dec_tlu_force_halt
|
||||||
err_stop_fetch := ((io.ifu_fetch_val(1,0)===3.U) | (io.ifu_fetch_val(0) & two_byte_instr)) & !(io.exu_flush_final | io.dec_tlu_i0_commit_cmt)
|
err_stop_fetch := ((io.ifu_fetch_val(1,0)===3.U) | (io.ifu_fetch_val(0) & two_byte_instr)) & !(io.exu_flush_final | io.dec_tlu_i0_commit_cmt)
|
||||||
iccm_correction_state := true.B
|
io.iccm_correction_state := true.B
|
||||||
}
|
}
|
||||||
is(err_fetch2_C){
|
is(err_fetch2_C){
|
||||||
err_stop_nxtstate := Mux((io.dec_tlu_flush_lower_wb | io.dec_tlu_i0_commit_cmt | io.dec_tlu_force_halt).asBool,
|
err_stop_nxtstate := Mux((io.dec_tlu_flush_lower_wb | io.dec_tlu_i0_commit_cmt | io.dec_tlu_force_halt).asBool,
|
||||||
err_stop_idle_C, Mux(io.ifu_fetch_val(0).asBool, err_stop_fetch_C, err_fetch2_C))
|
err_stop_idle_C, Mux(io.ifu_fetch_val(0).asBool, err_stop_fetch_C, err_fetch2_C))
|
||||||
err_stop_state_en := io.dec_tlu_flush_lower_wb | io.dec_tlu_i0_commit_cmt | io.ifu_fetch_val(0) | io.dec_tlu_force_halt
|
err_stop_state_en := io.dec_tlu_flush_lower_wb | io.dec_tlu_i0_commit_cmt | io.ifu_fetch_val(0) | io.dec_tlu_force_halt
|
||||||
err_stop_fetch := io.ifu_fetch_val(0) & !io.exu_flush_final & !io.dec_tlu_i0_commit_cmt
|
err_stop_fetch := io.ifu_fetch_val(0) & !io.exu_flush_final & !io.dec_tlu_i0_commit_cmt
|
||||||
iccm_correction_state := true.B
|
io.iccm_correction_state := true.B
|
||||||
}
|
}
|
||||||
is(err_stop_fetch_C){
|
is(err_stop_fetch_C){
|
||||||
err_stop_nxtstate := Mux(((io.dec_tlu_flush_lower_wb & !io.dec_tlu_flush_err_wb) | io.dec_tlu_i0_commit_cmt | io.dec_tlu_force_halt).asBool,
|
err_stop_nxtstate := Mux(((io.dec_tlu_flush_lower_wb & !io.dec_tlu_flush_err_wb) | io.dec_tlu_i0_commit_cmt | io.dec_tlu_force_halt).asBool,
|
||||||
err_stop_idle_C, Mux(io.dec_tlu_flush_err_wb.asBool(), err_fetch1_C, err_stop_fetch_C))
|
err_stop_idle_C, Mux(io.dec_tlu_flush_err_wb.asBool(), err_fetch1_C, err_stop_fetch_C))
|
||||||
err_stop_state_en := io.dec_tlu_flush_lower_wb | io.dec_tlu_i0_commit_cmt | io.dec_tlu_force_halt
|
err_stop_state_en := io.dec_tlu_flush_lower_wb | io.dec_tlu_i0_commit_cmt | io.dec_tlu_force_halt
|
||||||
err_stop_fetch := true.B
|
err_stop_fetch := true.B
|
||||||
iccm_correction_state := true.B
|
io.iccm_correction_state := true.B
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err_stop_state := withClock(io.free_clk){RegEnable(err_stop_nxtstate, 0.U, err_stop_state_en)}
|
err_stop_state := withClock(io.free_clk){RegEnable(err_stop_nxtstate, 0.U, err_stop_state_en)}
|
||||||
|
@ -668,7 +615,7 @@ class el2_ifu_mem_ctl extends Module with el2_lib {
|
||||||
// DMA
|
// DMA
|
||||||
ifc_dma_access_ok_d := io.ifc_dma_access_ok & !iccm_correct_ecc & !io.iccm_dma_sb_error
|
ifc_dma_access_ok_d := io.ifc_dma_access_ok & !iccm_correct_ecc & !io.iccm_dma_sb_error
|
||||||
val ifc_dma_access_q_ok = io.ifc_dma_access_ok & !iccm_correct_ecc & ifc_dma_access_ok_prev & (perr_state===err_idle_C) & !io.iccm_dma_sb_error
|
val ifc_dma_access_q_ok = io.ifc_dma_access_ok & !iccm_correct_ecc & ifc_dma_access_ok_prev & (perr_state===err_idle_C) & !io.iccm_dma_sb_error
|
||||||
val iccm_ready = ifc_dma_access_q_ok
|
io.iccm_ready := ifc_dma_access_q_ok
|
||||||
dma_iccm_req_f := withClock(io.free_clk){RegNext(io.dma_iccm_req, false.B)}
|
dma_iccm_req_f := withClock(io.free_clk){RegNext(io.dma_iccm_req, false.B)}
|
||||||
io.iccm_wren := (ifc_dma_access_q_ok & io.dma_iccm_req & io.dma_mem_write) | iccm_correct_ecc
|
io.iccm_wren := (ifc_dma_access_q_ok & io.dma_iccm_req & io.dma_mem_write) | iccm_correct_ecc
|
||||||
io.iccm_rden := (ifc_dma_access_q_ok & io.dma_iccm_req & !io.dma_mem_write) | (io.ifc_iccm_access_bf & io.ifc_fetch_req_bf)
|
io.iccm_rden := (ifc_dma_access_q_ok & io.dma_iccm_req & !io.dma_mem_write) | (io.ifc_iccm_access_bf & io.ifc_fetch_req_bf)
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue