BOOMと自作CPUの合成結果を比較して、ボトルネックになっている部分を調査したい。まずは面積から。
LDQ/STQのアドレス情報の管理は、物理アドレスと仮想アドレスを別々に管理していた。 これを統一し、アドレス情報を仮想アドレスと物理アドレスで一体管理する。
仮想アドレスと物理アドレスの長い方のフィールドを採用し、物理アドレスに変換済みであるかどうかをチェックする。
diff --git a/src/scariv_pkg.sv b/src/scariv_pkg.sv index 93eaf30..d274670 100644 --- a/src/scariv_pkg.sv +++ b/src/scariv_pkg.sv @@ -12,6 +12,8 @@ package scariv_pkg; localparam INST_BUF_SIZE = scariv_conf_pkg::INST_BUF_SIZE; + localparam MAX_ADDR_W = VADDR_W > PADDR_W ? VADDR_W : PADDR_W; + localparam REL_BUS_SIZE = ALU_INST_NUM + LSU_INST_NUM + 1 + // BRU @@ -60,6 +62,7 @@ typedef logic [ALEN_W/8-1: 0] alenb_t; typedef logic [riscv_pkg::VADDR_W-1: 0] vaddr_t; typedef logic [riscv_pkg::PADDR_W-1: 0] paddr_t; +typedef logic [MAX_ADDR_W-1: 0] maxaddr_t;
一度仮想アドレスから物理アドレスに変換すると、フラグを立てて物理アドレスのみを保持する。
diff --git a/src/scariv_lsu_pkg.sv b/src/scariv_lsu_pkg.sv index 6c5774b..cba0dc5 100644 --- a/src/scariv_lsu_pkg.sv +++ b/src/scariv_lsu_pkg.sv @@ -472,8 +472,9 @@ typedef struct packed { // scariv_pkg::issue_t inst; decoder_lsu_ctrl_pkg::size_t size; // Memory Access Size stq_state_t state; - scariv_pkg::vaddr_t vaddr; - scariv_pkg::paddr_t paddr; + // scariv_pkg::vaddr_t vaddr; + // scariv_pkg::paddr_t paddr; + scariv_pkg::maxaddr_t addr; logic paddr_valid; logic is_rs2_get; scariv_pkg::alen_t rs2_data; @@ -607,8 +608,9 @@ typedef struct packed { decoder_lsu_ctrl_pkg::size_t size; // Memory Access Size ldq_state_t state; logic is_get_data; - scariv_pkg::vaddr_t vaddr; - scariv_pkg::paddr_t paddr; + // scariv_pkg::vaddr_t vaddr; + // scariv_pkg::paddr_t paddr; + scariv_pkg::maxaddr_t addr; logic [scariv_conf_pkg::MISSU_ENTRY_SIZE-1: 0] missu_haz_index_oh; logic [scariv_conf_pkg::STQ_SIZE-1: 0] hazard_index;
一点注意しなければならないこととして、メモリアクセス系の例外が発生した場合、アクセスした仮想アドレスを保持して例外通知を行わなければならない。
--- a/src/scariv_stq_entry.sv +++ b/src/scariv_stq_entry.sv @@ -216,8 +216,8 @@ always_comb begin STQ_DONE_EX2; w_entry_next.except_valid = i_ex1_q_updates.tlb_except_valid; w_entry_next.except_type = i_ex1_q_updates.tlb_except_type; - w_entry_next.vaddr = i_ex1_q_updates.vaddr; - w_entry_next.paddr = i_ex1_q_updates.paddr; + w_entry_next.addr = i_ex1_q_updates.tlb_except_valid ? i_ex1_q_updates.vaddr : + i_ex1_q_updates.paddr; w_entry_next.paddr_valid = i_ex1_q_updates.hazard_typ != EX1_HAZ_TLB_MISS; w_entry_next.size = i_ex1_q_updates.size; w_entry_next.is_uc = i_ex1_q_updates.hazard_typ == EX1_HAZ_NONE ? i_ex1_q_updates.tlb_uc :
この状態でもう一度論理合成したが、あまり小さくならないなあ...