Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automatic PR dev->master #918

Merged
merged 36 commits into from
Feb 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
51e4962
Patch check_target action (#916)
suppamax Dec 1, 2023
476381d
RVFI - Correcting rvfi trace commit in some corner cases
Dec 6, 2023
61423d9
Merge pull request #919 from YoannPruvost/dev_ypr_better_rvfi_commit
davideschiavone Dec 6, 2023
f182233
RVFI - Propagate back late mstatus_fs update
Dec 8, 2023
11e2490
Merge pull request #921 from YoannPruvost/dev_ypr_mstatus_update
davideschiavone Dec 12, 2023
0fbd573
RVFI - Cleaning ex to wb trigger in rvfi
Dec 12, 2023
bebce6b
RVFI - Removing commented out code
Dec 12, 2023
d658f65
Merge pull request #922 from YoannPruvost/dev_ypr_ex_valid_adjusted
davideschiavone Dec 12, 2023
05374b5
RVFI - Removing apu_rvalid from gating ex to wb trigger
Dec 14, 2023
2acd133
RVFI - Removing commented out code
Dec 15, 2023
b88b4cc
Merge pull request #923 from YoannPruvost/dev_ypr_ex_trigger
Dec 15, 2023
68497d2
RVFI - Better illegal reporting
Dec 21, 2023
115d5f8
RVFI - better mstatus_fs updates caused by flw
Dec 21, 2023
01d399a
Running verible
Dec 22, 2023
9eee13d
Update check_target_on_pr.yml
suppamax Dec 22, 2023
fc09f33
Update check_target_on_pr.yml
suppamax Dec 22, 2023
e3cc719
Merge pull request #926 from suppamax/patch-2
davideschiavone Dec 22, 2023
e4a12f9
Merge pull request #925 from YoannPruvost/dev_dpc_and_illegal_and_mst…
davideschiavone Dec 22, 2023
7c4d841
Corrected MPEC/MEPC typo error.
Nov 30, 2023
c010206
Merge pull request #927 from pascalgouedo/dev_dd_pgo_doc
davideschiavone Dec 23, 2023
17b972f
RVFI - Better xret handling
Jan 4, 2024
a5061c7
RVFI - Better minstret csr sampling
Jan 5, 2024
308c5b6
Merge pull request #930 from YoannPruvost/dev-rvfi_mret
YoannPruvost Jan 5, 2024
b7abe3a
Additional advice when setting up HWLoops.
Jan 8, 2024
8ba4e7e
Merge pull request #932 from pascalgouedo/dev_dd_pgo_doc
davideschiavone Jan 8, 2024
48021ae
Add an example for updating copyright and license header (#934)
MikeOpenHWGroup Jan 8, 2024
5780d95
RVFI - Recovering proper dpc sampling
Jan 9, 2024
ca7f156
Merge pull request #935 from YoannPruvost/dev-rvfi_dpc
YoannPruvost Jan 9, 2024
15e7b2f
RVFI - Checking csr write address for dpc
Jan 12, 2024
71833e8
Merge pull request #936 from YoannPruvost/dev-RVFI-dpc_we
YoannPruvost Jan 12, 2024
e6f4a83
RVFI - Prevent double override of mstatus_fs
Jan 17, 2024
82df282
Merge pull request #939 from YoannPruvost/dev-RVFI-mstatus_fs_conflict
YoannPruvost Jan 19, 2024
a11f061
Issue #937 corrections. (#940)
Jan 30, 2024
75455ab
Removed PULP Floating Point DIV/SQRT unit from manifest. (#938)
Jan 30, 2024
a227daa
RVFI - Cleaner of fetched instruction to avoid fake invalid (#941)
YoannPruvost Jan 30, 2024
1a58c7b
User Manual update : Added clipr/clipur note about rs2. (#944)
Feb 2, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions .github/workflows/check_target_on_pr.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
name: check_target
on:
pull_request:
types: [opened, reopened, edited]
on: [push, pull_request]

jobs:
check_target:
runs-on: ubuntu-latest
steps:
- if: ${{ (github.event.pull_request.head.ref == 'dev' && github.event.pull_request.base.ref == 'master') || github.event.pull_request.base.ref == 'dev' }}
- if: ${{ (github.event.pull_request.head.ref == 'dev' && github.event.pull_request.base.ref == 'master') || github.event.pull_request.base.ref == 'dev' || github.event.push.ref != 'refs/heads/master'}}
run: exit 0
- if: ${{ github.event.pull_request.base.ref != 'dev' }}
- if: ${{ github.event.pull_request.base.ref != 'dev' || github.event.push.ref == 'refs/heads/master'}}
run: exit 1
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,9 @@ TAGS
/build
/Bender.lock
/Bender.local
golden.src
revised.src
cadence_conformal
golden_reference_design
synopsys_formality
questa_autocheck
16 changes: 16 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,22 @@ The [OpenHW Work Flow](https://github.com/openhwgroup/core-v-docs/blob/master/ve
is required reading. You will find information about the implementation and usage of the CORE-V verification environments
in the [Verification Strategy](https://github.com/openhwgroup/core-v-docs/blob/master/verif/Common/OpenHWGroup_CORE-V_Verif_Strategy.pdf).

## Updating Copyright
The files in this repository are open-source artifacts licensed under the terms of the Solderpad license, see [LICENSE](LICENSE).
If you modify a file, a new copyright _may_ be added, but the existing copyright and license header _must not_ be removed or modified.
If your contribution uses a newer version of the existing license, you are encouraged to declare that with a one-liner SPDX header.

In the example below, a new copyright and updated license are added to an existing copyright and license:
```
// Copyright 2024 OpenHW Group and <member-company>
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
// Copyright 2018 ETH Zurich and University of Bologna.
// Copyright and related rights are licensed under the Solderpad Hardware
// License, Version 0.51 (the "License"); you may not use this file except in
// compliance with the License.
// ...remainder of original license header from ETHZ and UniBo.
```

## The Mechanics
1. From GitHub: [fork](https://help.github.com/articles/fork-a-repo/) the [cv32e40p](https://github.com/openhwgroup/cv32e40p) repository
2. Clone repository: `git clone https://github.com/[your_github_username]/cv32e40p`
Expand Down
84 changes: 47 additions & 37 deletions bhv/cv32e40p_rvfi.sv
Original file line number Diff line number Diff line change
Expand Up @@ -1155,7 +1155,7 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
e_dev_commit_rf_to_ex_3,
e_dev_commit_rf_to_ex_4,
e_dev_commit_rf_to_ex_5;
event e_if_2_id_1, e_if_2_id_2, e_if_2_id_3;
event e_if_2_id_1, e_if_2_id_2, e_if_2_id_3, e_if_2_id_4;
event e_ex_to_wb_1, e_ex_to_wb_2;
event e_id_to_ex_1, e_id_to_ex_2;
event e_commit_dpc;
Expand Down Expand Up @@ -1272,7 +1272,6 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
bit s_id_done;
function void if_to_id();
if (trace_id.m_valid) begin
minstret_to_id();
`CSR_FROM_PIPE(id, misa)
`CSR_FROM_PIPE(id, tdata1)
`CSR_FROM_PIPE(id, tdata2)
Expand All @@ -1282,12 +1281,12 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
end
trace_id.init(trace_if);
trace_id.m_trap = ~r_pipe_freeze_trace.minstret;
trace_id.m_is_illegal = r_pipe_freeze_trace.is_illegal;
trace_id.m_is_illegal = trace_id.m_is_illegal | r_pipe_freeze_trace.is_illegal;
`CSR_FROM_PIPE(id, dpc)
s_is_pc_set = 1'b0;
s_is_irq_start = 1'b0;
trace_if.m_valid = 1'b0;
s_id_done = 1'b0;
`CSR_FROM_PIPE(id, dpc)
endfunction

function logic [31:0] be_to_mask(logic [3:0] be);
Expand Down Expand Up @@ -1320,6 +1319,8 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
bit s_ex_reg_we_adjusted; //ex_reg_we
bit s_rf_we_wb_adjusted; //

bit s_dont_override_mstatus_fs_id;

trace_if = new();
trace_id = new();
trace_ex = new();
Expand Down Expand Up @@ -1352,6 +1353,8 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
s_ex_reg_we_adjusted = 1'b0;
s_rf_we_wb_adjusted = 1'b0;

s_dont_override_mstatus_fs_id = 1'b0;

forever begin
wait(e_pipe_monitor_ok.triggered); // event triggered
#1;
Expand All @@ -1368,19 +1371,7 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
end

if (r_pipe_freeze_trace.ctrl_fsm_cs == DBG_TAKEN_ID && r_pipe_freeze_trace.ebrk_insn_dec) begin
if (trace_wb.m_valid) begin
send_rvfi(trace_wb);
trace_wb.m_valid = 1'b0;
->e_send_rvfi_trace_wb_1;
end
if (trace_ex.m_valid) begin
send_rvfi(trace_ex);
trace_ex.m_valid = 1'b0;
->e_send_rvfi_trace_ex_1;
end
if (trace_id.m_valid) begin

minstret_to_id();
`CSR_FROM_PIPE(id, misa)
`CSR_FROM_PIPE(id, tdata1)
`CSR_FROM_PIPE(id, tdata2)
Expand Down Expand Up @@ -1494,10 +1485,11 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
end

if (trace_ex.m_valid) begin

if (!trace_ex.m_csr.got_minstret) begin
if(trace_ex.m_instret_smaple_trigger == 1) begin //time to sample instret
minstret_to_ex();
end
trace_ex.m_instret_smaple_trigger = trace_ex.m_instret_smaple_trigger + 1;

`CSR_FROM_PIPE(ex, misa)
`CSR_FROM_PIPE(ex, tdata1)
`CSR_FROM_PIPE(ex, tdata2)
Expand All @@ -1524,9 +1516,6 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
trace_ex.m_valid = 1'b0;
->e_send_rvfi_trace_ex_2;
end else begin
if (!s_ex_valid_adjusted & !trace_ex.m_csr.got_minstret) begin
minstret_to_ex();
end

if (s_rf_we_wb_adjusted) begin
->e_dev_commit_rf_to_ex_1;
Expand All @@ -1541,12 +1530,15 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
trace_ex.m_got_first_data = 1'b1;
end

if (r_pipe_freeze_trace.csr.fregs_we) begin
if (r_pipe_freeze_trace.csr.fregs_we && !r_pipe_freeze_trace.apu_rvalid) begin //Catching mstatus_fs updates caused by flw
`CSR_FROM_PIPE(ex, mstatus_fs)
trace_ex.m_csr.mstatus_fs_we = 1'b1;
trace_ex.m_csr.mstatus_fs_wmask = '1;
if(r_pipe_freeze_trace.csr.we && r_pipe_freeze_trace.csr.mstatus_fs_we) begin //In this specific case, two writes to mstatus_fs happen at the same time. We need to recreate the writes caused by fregs_we
trace_ex.m_csr.mstatus_fs_wdata = FS_DIRTY;
end else begin
trace_id.m_csr.mstatus_fs_rdata = trace_ex.m_csr.mstatus_fs_wdata;
s_dont_override_mstatus_fs_id = 1'b1;
end
->e_fregs_dirty_3;
end
Expand All @@ -1559,9 +1551,6 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
->e_ex_to_wb_1;
trace_wb.move_down_pipe(trace_ex);
end else begin
if (!trace_ex.m_csr.got_minstret) begin
minstret_to_ex();
end
send_rvfi(trace_ex);
->e_send_rvfi_trace_ex_6;
end
Expand All @@ -1584,17 +1573,27 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
end

// If mret, we need to keep the instruction in Id during flush_ex because mstatus update happens at that time
s_ex_valid_adjusted = (r_pipe_freeze_trace.ex_valid && r_pipe_freeze_trace.ex_ready) && (s_core_is_decoding || (r_pipe_freeze_trace.ctrl_fsm_cs == DBG_TAKEN_IF) || (r_pipe_freeze_trace.ctrl_fsm_cs == DBG_FLUSH) || ((r_pipe_freeze_trace.ctrl_fsm_cs == FLUSH_EX) && !r_pipe_freeze_trace.mret_insn_dec)) && (!r_pipe_freeze_trace.apu_rvalid || r_pipe_freeze_trace.data_req_ex);
s_ex_valid_adjusted = (r_pipe_freeze_trace.ex_valid && r_pipe_freeze_trace.ex_ready) && (s_core_is_decoding || (r_pipe_freeze_trace.ctrl_fsm_cs == DBG_TAKEN_IF) || (r_pipe_freeze_trace.ctrl_fsm_cs == DBG_TAKEN_ID) || (r_pipe_freeze_trace.ctrl_fsm_cs == DBG_FLUSH) || ((r_pipe_freeze_trace.ctrl_fsm_cs == FLUSH_EX) && !r_pipe_freeze_trace.mret_insn_dec));
//EX_STAGE

if (trace_id.m_valid) begin
if(trace_id.m_instret_smaple_trigger == 1) begin //time to sample instret
minstret_to_id();
end
trace_id.m_instret_smaple_trigger = trace_id.m_instret_smaple_trigger + 1;

if(trace_id.m_sample_csr_write_in_ex && !csr_is_irq && !s_is_irq_start) begin //First cycle after id_ready, csr write is asserted in this cycle
`CSR_FROM_PIPE(id, mstatus)
`CSR_FROM_PIPE(id, mstatus_fs)
if(!s_dont_override_mstatus_fs_id) begin
`CSR_FROM_PIPE(id, mstatus_fs)
end
`CSR_FROM_PIPE(id, mepc)
`CSR_FROM_PIPE(id, mcause)
`CSR_FROM_PIPE(id, dscratch0)
`CSR_FROM_PIPE(id, dscratch1)
if(r_pipe_freeze_trace.csr.we && (r_pipe_freeze_trace.csr.addr == CSR_DPC)) begin
`CSR_FROM_PIPE(id, dpc)
end
->e_csr_in_ex;
end

Expand All @@ -1614,10 +1613,6 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
`CSR_FROM_PIPE(id, frm)
`CSR_FROM_PIPE(id, fcsr)

if (r_pipe_freeze_trace.csr.we) begin
`CSR_FROM_PIPE(id, dpc)
end

if (r_pipe_freeze_trace.csr.dcsr_we) begin
dcsr_to_id();
end
Expand All @@ -1638,6 +1633,15 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
trace_ex.m_csr.frm_wmask = '0;
trace_ex.m_csr.fcsr_wmask = '0;

if(r_pipe_freeze_trace.ctrl_fsm_cs == XRET_JUMP) begin //xret exit pipeline
tinfo_to_id();
`CSR_FROM_PIPE(id, tdata1)
`CSR_FROM_PIPE(id, tdata2)
send_rvfi(trace_id);
trace_id.m_valid = 1'b0;
s_dont_override_mstatus_fs_id = 1'b0;
end

if (r_pipe_freeze_trace.apu_req && r_pipe_freeze_trace.apu_gnt) begin
trace_id.m_is_apu = 1'b1;
trace_id.m_apu_req_id = cnt_apu_req;
Expand All @@ -1647,6 +1651,7 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
trace_apu_req.set_to_apu();
apu_trace_q.push_back(trace_apu_req);
trace_id.m_valid = 1'b0;
s_dont_override_mstatus_fs_id = 1'b0;

if(r_pipe_freeze_trace.apu_rvalid && (cnt_apu_req == cnt_apu_resp)) begin//APU return in the same cycle
apu_resp();
Expand Down Expand Up @@ -1702,6 +1707,7 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
hwloop_to_id();
trace_ex.move_down_pipe(trace_id); // The instruction moves forward from ID to EX
trace_id.m_valid = 1'b0;
s_dont_override_mstatus_fs_id = 1'b0;
->e_id_to_ex_1;

end else if (r_pipe_freeze_trace.ex_reg_we && r_pipe_freeze_trace.rf_alu_we_ex) begin
Expand All @@ -1725,9 +1731,6 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
if (s_new_valid_insn) begin // There is a new valid instruction
if (trace_id.m_valid) begin
if (trace_ex.m_valid) begin
if (!trace_ex.m_csr.got_minstret) begin
minstret_to_ex();
end
if (trace_wb.m_valid) begin
send_rvfi(trace_ex);
->e_send_rvfi_trace_ex_4;
Expand Down Expand Up @@ -1769,6 +1772,7 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
hwloop_to_id();
trace_ex.move_down_pipe(trace_id);
trace_id.m_valid = 1'b0;
s_dont_override_mstatus_fs_id = 1'b0;
->e_id_to_ex_2;
end
if_to_id();
Expand All @@ -1786,18 +1790,24 @@ insn_trace_t trace_if, trace_id, trace_ex, trace_ex_next, trace_wb;
end

//IF_STAGE
if (r_pipe_freeze_trace.if_valid && r_pipe_freeze_trace.if_ready) begin
if(trace_if.m_valid) begin
if(r_pipe_freeze_trace.is_illegal && r_pipe_freeze_trace.is_decoding) begin
trace_if.m_is_illegal = 1'b1;
end
end

if (r_pipe_freeze_trace.if_valid && r_pipe_freeze_trace.if_ready && r_pipe_freeze_trace.instr_valid_if) begin
if (trace_if.m_valid) begin
if (r_pipe_freeze_trace.id_valid && r_pipe_freeze_trace.id_ready && !trace_id.m_valid && r_pipe_freeze_trace.ebrk_insn_dec) begin
if_to_id();
trace_id.m_is_ebreak = '1; //trace_if.m_is_ebreak;
->e_if_2_id_2;
end else if (r_pipe_freeze_trace.is_illegal) begin
end else if (trace_if.m_is_illegal) begin
if_to_id();
trace_id.m_is_illegal = 1'b1;
->e_if_2_id_3;
end else if (r_pipe_freeze_trace.ecall_insn_dec) begin
if_to_id();
->e_if_2_id_4;
end
end

Expand Down
4 changes: 4 additions & 0 deletions bhv/insn_trace.sv
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
bit m_move_down_pipe;

int m_instret_cnt;
int m_instret_smaple_trigger; //We need to sample minstret from csr 2 cycle after id is doen

bit m_sample_csr_write_in_ex;

Expand Down Expand Up @@ -173,6 +174,7 @@
this.m_frm_we_non_apu = 1'b0;
this.m_fcsr_we_non_apu = 1'b0;
this.m_instret_cnt = 0;
this.m_instret_smaple_trigger = 0;
this.m_sample_csr_write_in_ex = 1'b1;
endfunction

Expand Down Expand Up @@ -896,6 +898,7 @@
this.m_got_regs_write = 1'b0;
this.m_move_down_pipe = 1'b0;
this.m_instret_cnt = 0;
this.m_instret_smaple_trigger = 0;
this.m_sample_csr_write_in_ex = 1'b1;
this.m_rd_addr[0] = '0;
this.m_rd_addr[1] = '0;
Expand Down Expand Up @@ -970,6 +973,7 @@
this.m_is_illegal = m_source.m_is_illegal;
this.m_is_irq = m_source.m_is_irq;
this.m_instret_cnt = m_source.m_instret_cnt;
this.m_instret_smaple_trigger = m_source.m_instret_smaple_trigger;
this.m_sample_csr_write_in_ex = m_source.m_sample_csr_write_in_ex;
this.m_rs1_addr = m_source.m_rs1_addr;
this.m_rs2_addr = m_source.m_rs2_addr;
Expand Down
1 change: 0 additions & 1 deletion cv32e40p_fpu_manifest.flist
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ ${DESIGN_RTL_DIR}/vendor/pulp_platform_fpnew/src/fpnew_noncomp.sv
${DESIGN_RTL_DIR}/vendor/pulp_platform_fpnew/src/fpnew_opgroup_fmt_slice.sv
${DESIGN_RTL_DIR}/vendor/pulp_platform_fpnew/src/fpnew_opgroup_multifmt_slice.sv
${DESIGN_RTL_DIR}/vendor/pulp_platform_fpnew/src/fpnew_opgroup_block.sv
${DESIGN_RTL_DIR}/vendor/pulp_platform_fpnew/src/fpnew_divsqrt_multi.sv
${DESIGN_RTL_DIR}/vendor/pulp_platform_fpnew/src/fpnew_top.sv
${DESIGN_RTL_DIR}/cv32e40p_fp_wrapper.sv

Expand Down
Loading
Loading