Skip to content

Commit

Permalink
Merge pull request #918 from openhwgroup/dev
Browse files Browse the repository at this point in the history
Automatic PR dev->master
  • Loading branch information
davideschiavone authored Feb 14, 2024
2 parents 94acfbf + 1a58c7b commit 6adc6b3
Show file tree
Hide file tree
Showing 8 changed files with 107 additions and 67 deletions.
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

0 comments on commit 6adc6b3

Please sign in to comment.