quasar/src/main/scala/ifu/el2_ifu_mem_ctl.scala

206 lines
7.1 KiB
Scala
Raw Normal View History

2020-10-07 12:35:34 +08:00
package ifu
import chisel3._
import chisel3.util._
import lib._
import include._
import scala.math.pow
class el2_ifu_mem_ctl extends Module with el2_lib {
val io = IO(new Bundle {
val free_clk = Input(Clock())
val active_clk = Input(Clock())
val exu_flush_final = Input(Bool())
val dec_tlu_flush_lower_wb = Input(Bool())
val dec_tlu_flush_err_wb = Input(Bool())
val dec_tlu_i0_commit_cmt = Input(Bool())
val dec_tlu_force_halt = Input(Bool())
val ifc_fetch_addr_bf = Input(UInt(31.W))
val ifc_fetch_uncacheable_bf = Input(Bool())
val ifc_fetch_req_bf = Input(Bool())
val ifc_fetch_req_bf_raw = Input(Bool())
val ifc_iccm_access_bf = Input(Bool())
val ifc_region_acc_fault_bf = Input(Bool())
val ifc_dma_access_ok = Input(Bool())
val dec_tlu_fence_i_wb = Input(Bool())
val ifu_bp_hit_taken_f = Input(Bool())
val ifu_bp_inst_mask_f = Input(Bool())
val ifu_miss_state_idle = Output(Bool())
val ifu_ic_mb_empty = Output(Bool())
val ic_dma_active = Output(Bool())
val ic_write_stall = Output(Bool())
val ifu_pmu_ic_miss = Output(Bool())
val ifu_pmu_ic_hit = Output(Bool())
val ifu_pmu_bus_error = Output(Bool())
val ifu_pmu_bus_busy = Output(Bool())
val ifu_pmu_bus_trxn = Output(Bool())
val ifu_axi_awvalid = Output(Bool())
val ifu_axi_awid = Output(UInt(IFU_BUS_TAG.W))
val ifu_axi_awaddr = Output(UInt(32.W))
val ifu_axi_awregion = Output(UInt(4.W))
val ifu_axi_awlen = Output(UInt(8.W))
val ifu_axi_awsize = Output(UInt(3.W))
val ifu_axi_awburst = Output(UInt(2.W))
val ifu_axi_awlock = Output(Bool())
val ifu_axi_awcache = Output(UInt(4.W))
val ifu_axi_awprot = Output(UInt(3.W))
val ifu_axi_awqos = Output(UInt(4.W))
val ifu_axi_wvalid = Output(Bool())
val ifu_axi_wdata = Output(UInt(64.W))
val ifu_axi_wstrb = Output(UInt(8.W))
val ifu_axi_wlast = Output(Bool())
val ifu_axi_bready = Output(Bool())
val ifu_axi_arvalid = Output(Bool())
val ifu_axi_arready = Input(Bool())
val ifu_axi_arid = Output(UInt(IFU_BUS_TAG.W))
val ifu_axi_araddr = Output(UInt(32.W))
val ifu_axi_arregion = Output(UInt(4.W))
val ifu_axi_arlen = Output(UInt(8.W))
val ifu_axi_arsize = Output(UInt(3.W))
val ifu_axi_arburst = Output(UInt(2.W))
val ifu_axi_arlock = Output(Bool())
val ifu_axi_arcache = Output(UInt(4.W))
val ifu_axi_arprot = Output(UInt(3.W))
val ifu_axi_arqos = Output(UInt(4.W))
val ifu_axi_rvalid = Input(Bool())
val ifu_axi_rready = Output(Bool())
val ifu_axi_rid = Input(UInt(IFU_BUS_TAG.W))
val ifu_axi_rdata = Input(UInt(64.W))
val ifu_axi_rresp = Input(UInt(2.W))
val ifu_bus_clk_en = Input(Bool())
val dma_iccm_req = Input(Bool())
val dma_mem_addr = Input(UInt(32.W))
val dma_mem_sz = Input(UInt(3.W))
val dma_mem_write = Input(Bool())
val dma_mem_wdata = Input(UInt(64.W))
val dma_mem_tag = Input(UInt(3.W))
val iccm_dma_ecc_error = Output(Bool())
val iccm_dma_rvalid = Output(Bool())
val iccm_dma_rdata = Output(UInt(64.W))
val iccm_dma_rtag = Output(UInt(3.W))
val iccm_ready = Output(Bool())
val ic_rw_addr = Output(UInt(31.W))
val ic_wr_en = Output(UInt(ICACHE_NUM_WAYS.W))
val ic_rd_en = Output(Bool())
val ic_wr_data = Output(Vec(ICACHE_BANKS_WAY, UInt(71.W)))
val ic_rd_data = Input(UInt(64.W))
val ic_debug_rd_data = Input(UInt(71.W))
val ictag_debug_rd_data = Input(UInt(26.W))
val ic_debug_wr_data = Output(UInt(71.W))
val ifu_ic_debug_rd_data = Output(UInt(71.W))
val ic_eccerr = Input(UInt(ICACHE_BANKS_WAY.W))
val ic_parerr = Input(UInt(ICACHE_BANKS_WAY.W))
val ic_debug_addr = Output(UInt((ICACHE_INDEX_HI-2).W))
val ic_debug_rd_en = Output(Bool())
val ic_debug_wr_en = Output(Bool())
val ic_debug_tag_array = Output(Bool())
val ic_debug_way = Output(UInt(ICACHE_NUM_WAYS.W))
val ic_tag_valid = Output(UInt(ICACHE_NUM_WAYS.W))
val ic_rd_hit = Input(UInt(ICACHE_NUM_WAYS.W))
val ic_tag_perr = Input(Bool())
val iccm_rw_addr = Output(UInt((ICCM_BITS-1).W))
val iccm_wren = Output(Bool())
val iccm_rden = Output(Bool())
val iccm_wr_data = Output(UInt(78.W))
val iccm_wr_size = Output(UInt(3.W))
val iccm_rd_data = Input(UInt(64.W))
val iccm_rd_data_ecc = Input(UInt(78.W))
val ifu_fetch_val = Input(UInt(2.W))
val ic_hit_f = Output(Bool())
val ic_access_fault_f = Output(Bool())
val ic_access_fault_type_f = Output(UInt(2.W))
val iccm_rd_ecc_single_err = Output(Bool())
val iccm_rd_ecc_double_err = Output(Bool())
val ic_error_start = Output(Bool())
val ifu_async_error_start = Output(Bool())
val iccm_dma_sb_error = Output(Bool())
val ic_fetch_val_f = Output(UInt(2.W))
val ic_data_f = Output(UInt(32.W))
val ic_premux_data = Output(UInt(64.W))
val ic_sel_premux_data = Output(Bool())
val dec_tlu_ic_diag_pkt = Input(new el2_cache_debug_pkt_t)
val dec_tlu_core_ecc_disable = Input(Bool())
val ifu_ic_debug_rd_data_valid = Output(Bool())
val iccm_buf_correct_ecc = Output(Bool())
val iccm_correction_state = Output(Bool())
})
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_wdata:=0.U
io.ifu_axi_wstrb:=0.U
io.ifu_axi_wlast:=0.U
io.ifu_axi_bready:=0.U
io.ifu_axi_arvalid:=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_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
}
object ifu_mem extends App {
println((new chisel3.stage.ChiselStage).emitVerilog(new el2_ifu_mem_ctl()))
}