Skip to content

Commit 71de241

Browse files
authored
Add support for RISC-V vector extension difftest (#3)
1 parent 9297021 commit 71de241

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

difftest/difftest-def.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#if defined(CPU_XIANGSHAN)
1717
#define CONFIG_DIFF_DEBUG_MODE
18+
// #define CONFIG_DIFF_RVV // Default off
1819
#endif
1920

2021
#if defined(CPU_NUTSHELL)
@@ -24,7 +25,11 @@
2425
#define CONFIG_FLASH_SIZE 0x1000UL
2526
#define CONFIG_PMP_NUM 0
2627
#elif defined(CPU_XIANGSHAN)
27-
#define CONFIG_DIFF_ISA_STRING "RV64IMAFDC_zba_zbb_zbc_zbs_zbkb_zbkc_zbkx_zknd_zkne_zknh_zksed_zksh_svinval"
28+
#if defined(CONFIG_DIFF_RVV)
29+
#define CONFIG_DIFF_ISA_STRING "RV64IMAFDCV_zba_zbb_zbc_zbs_zbkb_zbkc_zbkx_zknd_zkne_zknh_zksed_zksh_svinval"
30+
#else
31+
#define CONFIG_DIFF_ISA_STRING "RV64IMAFDC_zba_zbb_zbc_zbs_zbkb_zbkc_zbkx_zknd_zkne_zknh_zksed_zksh_svinval"
32+
#endif // CONFIG_DIFF_RVV
2833
#define CONFIG_MEMORY_SIZE (16 * 1024 * 1024 * 1024UL)
2934
#define CONFIG_FLASH_BASE 0x10000000UL
3035
#define CONFIG_FLASH_SIZE 0x100000UL

difftest/difftest.cc

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,25 @@ void DifftestRef::get_regs(diff_context_t *ctx) {
9494
ctx->dscratch0 = state->csrmap[CSR_DSCRATCH0]->read();
9595
ctx->dscratch1 = state->csrmap[CSR_DSCRATCH1]->read();
9696
#endif // DIFF_DEBUG_MODE
97+
98+
#ifdef CONFIG_DIFF_RVV
99+
auto& vstate = p->VU;
100+
/*******************************ONLY FOR VLEN=128,ELEN=64*******************************************/
101+
for(int i = 0; i < NVPR; i++){
102+
auto vReg_Val0 = vstate.elt<uint64_t>(i, 0,false);
103+
auto vReg_Val1 = vstate.elt<uint64_t>(i, 1,false);
104+
ctx->vr[i]._64[0] = vReg_Val0;
105+
ctx->vr[i]._64[1] = vReg_Val1;
106+
}
107+
/***************************************************************************************************/
108+
ctx->vstart = vstate.vstart->read();
109+
ctx->vxsat = vstate.vxsat->read();
110+
ctx->vxrm = vstate.vxrm->read();
111+
ctx->vcsr = state->csrmap[CSR_VCSR]->read();
112+
ctx->vl = vstate.vl->read();
113+
ctx->vtype = vstate.vtype->read();
114+
ctx->vlenb = vstate.vlenb;
115+
#endif // CONFIG_DIFF_RVV
97116
}
98117

99118
void DifftestRef::set_regs(diff_context_t *ctx, bool on_demand) {
@@ -183,6 +202,45 @@ void DifftestRef::set_regs(diff_context_t *ctx, bool on_demand) {
183202
state->csrmap[CSR_DSCRATCH1]->write(ctx->dscratch1);
184203
}
185204
#endif // DIFF_DEBUG_MODE
205+
206+
#ifdef CONFIG_DIFF_RVV
207+
auto& vstate = p->VU;
208+
/**********************ONLY FOR VLEN=128,ELEN=64************************************/
209+
for (int i = 0; i < NVPR; i++) {
210+
auto &vReg_Val0 = p->VU.elt<uint64_t>(i, 0, true);
211+
auto &vReg_Val1 = p->VU.elt<uint64_t>(i, 1, true);
212+
if (!on_demand || vReg_Val0 != ctx->vr[i]._64[0]) {
213+
vReg_Val0 = ctx->vr[i]._64[0];
214+
}
215+
if(!on_demand || vReg_Val1 != ctx->vr[i]._64[1]){
216+
vReg_Val1 = ctx->vr[i]._64[1];
217+
}
218+
}
219+
/***********************************************************************************/
220+
if (!on_demand || vstate.vstart->read() != ctx->vstart) {
221+
vstate.vstart->write_raw(ctx->vstart);
222+
}
223+
/**********************NEED TO ADD WRITE*********************************************/
224+
if (!on_demand || vstate.vxsat->read() != ctx->vxsat) {
225+
// vstate.vxsat->write(ctx->vxsat);
226+
}
227+
if (!on_demand || vstate.vxrm->read() != ctx->vxrm) {
228+
vstate.vxrm->write_raw(ctx->vxrm);
229+
}
230+
/******************************Don't need write vcsr**********************************/
231+
// if (!on_demand || state->csrmap[CSR_VCSR]->read() !=ctx->vcsr) {
232+
// csrmap[CSR_VCSR]->write(ctx->vcsr);
233+
// }
234+
if (!on_demand || vstate.vl->read() != ctx->vl) {
235+
vstate.vl->write_raw(ctx->vl);
236+
}
237+
if (!on_demand || vstate.vtype->read() != ctx->vtype) {
238+
vstate.vtype->write_raw(ctx->vtype);
239+
}
240+
if (!on_demand || vstate.vlenb != ctx->vlenb) {
241+
vstate.vlenb = ctx->vlenb;
242+
}
243+
#endif // CONFIG_DIFF_RVV
186244
}
187245

188246
void DifftestRef::memcpy_from_dut(reg_t dest, void* src, size_t n) {

difftest/difftest.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ enum { DIFFTEST_TO_DUT, DIFFTEST_TO_REF };
1919
#define DIFFTEST_LOG_FILE nullptr
2020
#endif
2121

22+
/***************DON'T CHANGE ORDER****************************/
2223
typedef struct {
2324
uint64_t gpr[32];
2425
#ifdef CONFIG_DIFF_FPU
@@ -43,6 +44,29 @@ typedef struct {
4344
uint64_t mideleg;
4445
uint64_t medeleg;
4546
uint64_t pc;
47+
#ifdef CONFIG_DIFF_RVV
48+
#define VLEN 128
49+
#define VENUM64 (VLEN/64)
50+
#define VENUM32 (VLEN/32)
51+
#define VENUM16 (VLEN/16)
52+
#define VENUM8 (VLEN/8)
53+
54+
union {
55+
uint64_t _64[VENUM64];
56+
uint32_t _32[VENUM32];
57+
uint16_t _16[VENUM16];
58+
uint8_t _8[VENUM8];
59+
} vr[32];
60+
61+
uint64_t vstart;
62+
uint64_t vxsat;
63+
uint64_t vxrm;
64+
uint64_t vcsr;
65+
uint64_t vl;
66+
uint64_t vtype;
67+
uint64_t vlenb;
68+
#endif // CONFIG_DIFF_RVV
69+
4670
#ifdef CONFIG_DIFF_DEBUG_MODE
4771
uint64_t debugMode;
4872
uint64_t dcsr;

0 commit comments

Comments
 (0)