Skip to content

Commit 78bce9b

Browse files
committed
[dv] Pass expanded instruction to cosim
1 parent 6c02172 commit 78bce9b

File tree

12 files changed

+35
-14
lines changed

12 files changed

+35
-14
lines changed

dv/cosim/cosim.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,12 @@ class Cosim {
7474
// In this case the instruction doesn't retire so no register write occurs (so
7575
// `write_reg` must be 0).
7676
//
77+
// `expanded_insn` is the 32-bit instruction that is being expanded or zero.
78+
//
7779
// Returns false if there are any errors; use `get_errors` to obtain details
7880
virtual bool step(uint32_t write_reg, uint32_t write_reg_data, uint32_t pc,
79-
bool sync_trap, bool suppress_reg_write) = 0;
81+
bool sync_trap, bool suppress_reg_write,
82+
uint32_t expanded_insn) = 0;
8083

8184
// When more than one of `set_mip`, `set_nmi` or `set_debug_req` is called
8285
// before `step` which one takes effect is chosen by the co-simulator. Which

dv/cosim/cosim_dpi.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@
1212

1313
int riscv_cosim_step(Cosim *cosim, const svBitVecVal *write_reg,
1414
const svBitVecVal *write_reg_data, const svBitVecVal *pc,
15-
svBit sync_trap, svBit suppress_reg_write) {
15+
svBit sync_trap, svBit suppress_reg_write,
16+
const svBitVecVal *expanded_insn) {
1617
assert(cosim);
1718

1819
return cosim->step(write_reg[0], write_reg_data[0], pc[0], sync_trap,
19-
suppress_reg_write)
20+
suppress_reg_write, expanded_insn[0])
2021
? 1
2122
: 0;
2223
}

dv/cosim/cosim_dpi.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
extern "C" {
1717
int riscv_cosim_step(Cosim *cosim, const svBitVecVal *write_reg,
1818
const svBitVecVal *write_reg_data, const svBitVecVal *pc,
19-
svBit sync_trap, svBit suppress_reg_write);
19+
svBit sync_trap, svBit suppress_reg_write,
20+
const svBitVecVal *expanded_insn);
2021
void riscv_cosim_set_mip(Cosim *cosim, const svBitVecVal *pre_mip,
2122
const svBitVecVal *post_mip);
2223
void riscv_cosim_set_nmi(Cosim *cosim, svBit nmi);

dv/cosim/cosim_dpi.svh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
`define COSIM_DPI_SVH
1212

1313
import "DPI-C" function int riscv_cosim_step(chandle cosim_handle, bit [4:0] write_reg,
14-
bit [31:0] write_reg_data, bit [31:0] pc, bit sync_trap, bit suppress_reg_write);
14+
bit [31:0] write_reg_data, bit [31:0] pc, bit sync_trap, bit suppress_reg_write,
15+
bit [31:0] expanded_insn);
1516
import "DPI-C" function void riscv_cosim_set_mip(chandle cosim_handle, bit [31:0] pre_mip,
1617
bit [31:0] post_mip);
1718
import "DPI-C" function void riscv_cosim_set_nmi(chandle cosim_handle, bit nmi);

dv/cosim/spike_cosim.cc

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ bool SpikeCosim::backdoor_read_mem(uint32_t addr, size_t len,
170170
// processor, and when we call step() again we start executing in the new
171171
// context of the trap (trap handler, new MSTATUS, debug rom, etc. etc.)
172172
bool SpikeCosim::step(uint32_t write_reg, uint32_t write_reg_data, uint32_t pc,
173-
bool sync_trap, bool suppress_reg_write) {
173+
bool sync_trap, bool suppress_reg_write,
174+
uint32_t expanded_insn) {
174175
assert(write_reg < 32);
175176

176177
// The DUT has just produced an RVFI item
@@ -320,7 +321,8 @@ bool SpikeCosim::step(uint32_t write_reg, uint32_t write_reg_data, uint32_t pc,
320321

321322
bool SpikeCosim::check_retired_instr(uint32_t write_reg,
322323
uint32_t write_reg_data, uint32_t dut_pc,
323-
bool suppress_reg_write) {
324+
bool suppress_reg_write,
325+
uint32_t expanded_insn) {
324326
// Check the retired instruction and all of its side-effects match those from
325327
// the DUT
326328

@@ -355,7 +357,8 @@ bool SpikeCosim::check_retired_instr(uint32_t write_reg,
355357
assert(!gpr_write_seen);
356358

357359
if (!suppress_reg_write &&
358-
!check_gpr_write(reg_change, write_reg, write_reg_data)) {
360+
!check_gpr_write(reg_change, write_reg, write_reg_data,
361+
expanded_insn)) {
359362
return false;
360363
}
361364

@@ -433,7 +436,8 @@ bool SpikeCosim::check_sync_trap(uint32_t write_reg, uint32_t dut_pc,
433436
}
434437

435438
bool SpikeCosim::check_gpr_write(const commit_log_reg_t::value_type &reg_change,
436-
uint32_t write_reg, uint32_t write_reg_data) {
439+
uint32_t write_reg, uint32_t write_reg_data,
440+
uint32_t expanded_insn) {
437441
uint32_t cosim_write_reg = (reg_change.first >> 4) & 0x1f;
438442

439443
if (write_reg == 0) {

dv/cosim/spike_cosim.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ class SpikeCosim : public simif_t, public Cosim {
7777
bool check_debug_ebreak(uint32_t write_reg, uint32_t pc, bool sync_trap);
7878

7979
bool check_gpr_write(const commit_log_reg_t::value_type &reg_change,
80-
uint32_t write_reg, uint32_t write_reg_data);
80+
uint32_t write_reg, uint32_t write_reg_data,
81+
uint32_t expanded_insn);
8182

8283
bool check_suppress_reg_write(uint32_t write_reg, uint32_t pc,
8384
uint32_t &suppressed_write_reg);
@@ -120,10 +121,12 @@ class SpikeCosim : public simif_t, public Cosim {
120121
const uint8_t *data_in) override;
121122
bool backdoor_read_mem(uint32_t addr, size_t len, uint8_t *data_out) override;
122123
bool step(uint32_t write_reg, uint32_t write_reg_data, uint32_t pc,
123-
bool sync_trap, bool suppress_reg_write) override;
124+
bool sync_trap, bool suppress_reg_write,
125+
uint32_t expanded_insn) override;
124126

125127
bool check_retired_instr(uint32_t write_reg, uint32_t write_reg_data,
126-
uint32_t dut_pc, bool suppress_reg_write);
128+
uint32_t dut_pc, bool suppress_reg_write,
129+
uint32_t expanded_insn);
127130
bool check_sync_trap(uint32_t write_reg, uint32_t pc,
128131
uint32_t initial_spike_pc);
129132
void set_mip(uint32_t pre_mip, uint32_t post_mip) override;

dv/uvm/core_ibex/common/ibex_cosim_agent/ibex_cosim_scoreboard.sv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ class ibex_cosim_scoreboard extends uvm_scoreboard;
163163
riscv_cosim_set_ic_scr_key_valid(cosim_handle, rvfi_instr.ic_scr_key_valid);
164164

165165
if (!riscv_cosim_step(cosim_handle, rvfi_instr.rd_addr, rvfi_instr.rd_wdata, rvfi_instr.pc,
166-
rvfi_instr.trap, rvfi_instr.rf_wr_suppress)) begin
166+
rvfi_instr.trap, rvfi_instr.rf_wr_suppress, rvfi_instr.expanded_insn)) begin
167167
// cosim instruction step doesn't match rvfi captured instruction, report a fatal error
168168
// with the details
169169
if (cfg.relax_cosim_check) begin

dv/uvm/core_ibex/common/ibex_cosim_agent/ibex_rvfi_monitor.sv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class ibex_rvfi_monitor extends uvm_monitor;
4545
trans_collected.rf_wr_suppress = vif.monitor_cb.ext_rf_wr_suppress;
4646
trans_collected.mcycle = vif.monitor_cb.ext_mcycle;
4747
trans_collected.ic_scr_key_valid = vif.monitor_cb.ext_ic_scr_key_valid;
48+
trans_collected.expanded_insn = vif.monitor_cb.ext_expanded_insn;
4849

4950
for (int i=0; i < 10; i++) begin
5051
trans_collected.mhpmcounters[i] = vif.monitor_cb.ext_mhpmcounters[i];

dv/uvm/core_ibex/common/ibex_cosim_agent/ibex_rvfi_seq_item.sv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class ibex_rvfi_seq_item extends uvm_sequence_item;
2121
bit [31:0] mhpmcountersh [10];
2222
bit ic_scr_key_valid;
2323

24+
bit [31:0] expanded_insn;
25+
2426
`uvm_object_utils_begin(ibex_rvfi_seq_item)
2527
`uvm_field_int (trap, UVM_DEFAULT)
2628
`uvm_field_int (pc, UVM_DEFAULT)
@@ -37,6 +39,7 @@ class ibex_rvfi_seq_item extends uvm_sequence_item;
3739
`uvm_field_sarray_int (mhpmcounters, UVM_DEFAULT)
3840
`uvm_field_sarray_int (mhpmcountersh, UVM_DEFAULT)
3941
`uvm_field_int (ic_scr_key_valid, UVM_DEFAULT)
42+
`uvm_field_int (expanded_insn, UVM_DEFAULT)
4043
`uvm_object_utils_end
4144

4245
`uvm_object_new

dv/uvm/core_ibex/env/core_ibex_rvfi_if.sv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ interface core_ibex_rvfi_if(input logic clk);
4040

4141
logic ext_ic_scr_key_valid;
4242

43+
logic [31:0] ext_expanded_insn;
44+
4345
clocking monitor_cb @(posedge clk);
4446
input reset;
4547
input valid;
@@ -74,6 +76,7 @@ interface core_ibex_rvfi_if(input logic clk);
7476
input ext_mhpmcountersh;
7577
input ext_ic_scr_key_valid;
7678
input ext_irq_valid;
79+
input ext_expanded_insn;
7780
endclocking
7881

7982
task automatic wait_clks(input int num);

0 commit comments

Comments
 (0)