diff --git a/src/ariane.sv b/src/ariane.sv index 4fc9e1a5b98ad206b36a8ae2da7038e0b86f59fa..4463e622bd51126c6c98404288d18e467b951e74 100644 --- a/src/ariane.sv +++ b/src/ariane.sv @@ -89,6 +89,11 @@ module ariane import ariane_pkg::*; #( logic is_ctrl_fow_id_issue; logic issue_instr_issue_id; + // -------------- + // ID -> verifier + // -------------- + logic has_mem_access_id_verif; + // -------------- // ISSUE <-> EX // -------------- @@ -286,6 +291,7 @@ module ariane import ariane_pkg::*; #( .issue_entry_o ( issue_entry_id_issue ), .issue_entry_valid_o ( issue_entry_valid_id_issue ), .is_ctrl_flow_o ( is_ctrl_fow_id_issue ), + .is_mem_instr_o ( has_mem_access_id_verif ), .issue_instr_ack_i ( issue_instr_issue_id ), .priv_lvl_i ( priv_lvl ), @@ -626,6 +632,9 @@ module ariane import ariane_pkg::*; #( // IF .if_has_mem_access_i (has_mem_access_if_verif), + // ID + .id_has_mem_access_i (has_mem_access_id_verif), + // CO .commit_instr_i (commit_instr_id_commit), .commit_ack_i (commit_ack) diff --git a/src/id_stage.sv b/src/id_stage.sv index 9d6610404e72571285443141a04d3ef608d51533..7edc74a97b3aca367747b71ad1ad8ef408fdf3da 100644 --- a/src/id_stage.sv +++ b/src/id_stage.sv @@ -37,7 +37,8 @@ module id_stage ( input logic debug_mode_i, // we are in debug mode input logic tvm_i, input logic tw_i, - input logic tsr_i + input logic tsr_i, + output logic is_mem_instr_o ); // ID/ISSUE register stage struct packed { @@ -53,6 +54,8 @@ module id_stage ( logic [31:0] instruction; logic is_compressed; + logic is_mem_instr_n, is_mem_instr_q; + // --------------------------------------------------------- // 1. Check if they are compressed and expand in case they are // --------------------------------------------------------- @@ -94,25 +97,33 @@ module id_stage ( assign issue_entry_valid_o = issue_q.valid; assign is_ctrl_flow_o = issue_q.is_ctrl_flow; + assign is_mem_instr_o = is_mem_instr_q; + always_comb begin issue_n = issue_q; fetch_entry_ready_o = 1'b0; + is_mem_instr_n = is_mem_instr_q; // Clear the valid flag if issue has acknowledged the instruction - if (issue_instr_ack_i) + if (issue_instr_ack_i) begin issue_n.valid = 1'b0; + is_mem_instr_n = 1'b0; + end // if we have a space in the register and the fetch is valid, go get it // or the issue stage is currently acknowledging an instruction, which means that we will have space // for a new instruction if ((!issue_q.valid || issue_instr_ack_i) && fetch_entry_valid_i) begin - fetch_entry_ready_o = 1'b1; - issue_n = '{1'b1, decoded_instruction, is_control_flow_instr}; + fetch_entry_ready_o = 1'b1; + issue_n = '{1'b1, decoded_instruction, is_control_flow_instr}; + is_mem_instr_n = (decoded_instruction.fu == ariane_pkg::LOAD || decoded_instruction.fu == ariane_pkg::STORE); end // invalidate the pipeline register on a flush - if (flush_i) + if (flush_i) begin issue_n.valid = 1'b0; + is_mem_instr_n = 1'b0; + end end // ------------------------- // Registers (ID <-> Issue) @@ -120,8 +131,10 @@ module id_stage ( always_ff @(posedge clk_i or negedge rst_ni) begin if(~rst_ni) begin issue_q <= '0; + is_mem_instr_q <= '0; end else begin issue_q <= issue_n; + is_mem_instr_q <= is_mem_instr_n; end end endmodule diff --git a/src/verifier.sv b/src/verifier.sv index 24fdfdb51143c87cb64e096782ff82e8328e1de9..cc4278b8a3f69df17b1447f3cbb1ed8790d7d136 100644 --- a/src/verifier.sv +++ b/src/verifier.sv @@ -9,6 +9,9 @@ module verifier #( // Frontend input logic if_has_mem_access_i, + // ID + input logic id_has_mem_access_i, + // CO input ariane_pkg::scoreboard_entry_t [NR_COMMIT_PORTS-1:0] commit_instr_i, input logic [NR_COMMIT_PORTS-1:0] commit_ack_i