diff --git a/src/ex_stage.sv b/src/ex_stage.sv index ff6aa832c24861ddcd5adf57c689f68888dbcbbe..6d4fa1fa654c60e0000c9238323f838512774fb3 100644 --- a/src/ex_stage.sv +++ b/src/ex_stage.sv @@ -108,11 +108,6 @@ module ex_stage import ariane_pkg::*; #( input logic[15:0][53:0] pmpaddr_i ); - typedef struct packed { - riscv::xlen_t result; - logic [TRANS_ID_BITS-1:0] trans_id; - } flu_res_t; - // ------------------------- // Fixed Latency Units // ------------------------- @@ -148,10 +143,6 @@ module ex_stage import ariane_pkg::*; #( logic [TRANS_ID_BITS-1:0] mult_trans_id; logic mult_valid; - // FLU arbitrer - flu_res_t alu_res_in, alu_res_out; - logic push_alu_res, pop_alu_res, alu_empty; - // 1. ALU (combinatorial) // data silence operation fu_data_t alu_data; @@ -199,52 +190,30 @@ module ex_stage import ariane_pkg::*; #( .csr_addr_o ); - // ready flags for FLU - always_comb begin - flu_ready_o = csr_ready & mult_ready; - end + assign flu_valid_o = alu_valid_i | branch_valid_i | csr_valid_i | mult_valid; // result MUX always_comb begin - pop_alu_res = 1'b0; - push_alu_res = 1'b0; - - flu_result_o = branch_valid_i ? {{riscv::XLEN-riscv::VLEN{1'b0}}, branch_result} : alu_result; + // Branch result as default case + flu_result_o = {{riscv::XLEN-riscv::VLEN{1'b0}}, branch_result}; flu_trans_id_o = fu_data_i.trans_id; - flu_valid_o = 1'b0; - - alu_res_in.result = branch_valid_i ? {{riscv::XLEN-riscv::VLEN{1'b0}}, branch_result} : alu_result; - alu_res_in.trans_id = fu_data_i.trans_id; - - if (csr_valid_i) begin + // ALU result + if (alu_valid_i) begin + flu_result_o = alu_result; + // CSR result + end else if (csr_valid_i) begin flu_result_o = csr_result; - flu_valid_o = 1'b1; - - if (mult_valid) begin - alu_res_in.result = mult_result; - alu_res_in.trans_id = mult_trans_id; - end - - push_alu_res = mult_valid | alu_valid_i | branch_valid_i; end else if (mult_valid) begin flu_result_o = mult_result; flu_trans_id_o = mult_trans_id; - flu_valid_o = 1'b1; - - push_alu_res = alu_valid_i | branch_valid_i; - end else if (~alu_empty) begin - flu_result_o = alu_res_out.result; - flu_trans_id_o = alu_res_out.trans_id; - - flu_valid_o = 1'b1; - pop_alu_res = 1'b1; - - push_alu_res = alu_valid_i | branch_valid_i; - end else if (alu_valid_i | branch_valid_i) begin - flu_valid_o = 1'b1; end end + // ready flags for FLU + always_comb begin + flu_ready_o = csr_ready & mult_ready; + end + // 4. Multiplication (Sequential) fu_data_t mult_data; // input silencing of multiplier @@ -262,21 +231,6 @@ module ex_stage import ariane_pkg::*; #( .mult_trans_id_o ( mult_trans_id ) ); - fifo_v3 #( - .DEPTH ( ariane_pkg::NR_SB_ENTRIES ), - .dtype ( flu_res_t ) - ) i_fifo_alu_res ( - .clk_i ( clk_i ), - .rst_ni ( rst_ni ), - .flush_i ( flush_i ), - .testmode_i ( 1'b0 ), - .empty_o ( alu_empty ), - .data_i ( alu_res_in ), - .push_i ( push_alu_res ), - .data_o ( alu_res_out ), - .pop_i ( pop_alu_res ) - ); - // ---------------- // FPU // ----------------