Skip to content

Commit 2a328c6

Browse files
authored
Merge pull request rivosinc#1 from rivosinc/dev/joy/add_get_fpr
Added Hammer::get_fpr() and added an a Python API check for Hammer::get_csr()
2 parents 1e3caee + 30199ef commit 2a328c6

File tree

8 files changed

+65
-8
lines changed

8 files changed

+65
-8
lines changed

hammer.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ void Hammer::set_gpr(uint8_t hart_id, uint8_t gpr_id, reg_t new_gpr_value) {
8484
hart_state->XPR.write(gpr_id, new_gpr_value);
8585
}
8686

87+
uint64_t Hammer::get_fpr(uint8_t hart_id, uint8_t fpr_id) {
88+
assert(fpr_id < NFPR);
89+
90+
processor_t *hart = simulator->get_core(hart_id);
91+
state_t *hart_state = hart->get_state();
92+
freg_t fpr_value = hart_state->FPR[fpr_id];
93+
94+
return fpr_value.v[0];
95+
}
96+
8797
reg_t Hammer::get_PC(uint8_t hart_id) {
8898
processor_t *hart = simulator->get_core(hart_id);
8999
state_t *hart_state = hart->get_state();
@@ -108,6 +118,11 @@ void Hammer::single_step(uint8_t hart_id) {
108118
hart->step(1);
109119
}
110120

121+
uint32_t Hammer::get_flen(uint8_t hart_id) {
122+
processor_t *hart = simulator->get_core(hart_id);
123+
return hart->get_flen();
124+
}
125+
111126
reg_t Hammer::get_vlen(uint8_t hart_id) {
112127
processor_t *hart = simulator->get_core(hart_id);
113128
return hart->VU.get_vlen();
@@ -119,6 +134,8 @@ reg_t Hammer::get_elen(uint8_t hart_id) {
119134
}
120135

121136
std::vector<uint64_t> Hammer::get_vector_reg(uint8_t hart_id, uint8_t vector_reg_id) {
137+
assert(vector_reg_id < NVPR);
138+
122139
processor_t *hart = simulator->get_core(hart_id);
123140
uint32_t vlen = hart->VU.get_vlen();
124141

hammer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@ class Hammer {
1919
reg_t get_gpr(uint8_t hart_id, uint8_t gpr_id);
2020
void set_gpr(uint8_t hart_id, uint8_t gpr_id, reg_t new_gpr_value);
2121

22+
uint64_t get_fpr(uint8_t hart_id, uint8_t fpr_id);
23+
2224
reg_t get_PC(uint8_t hart_id);
2325
void set_PC(uint8_t hart_id, reg_t new_pc_value);
2426

2527
reg_t get_csr(uint8_t hart_id, uint32_t csr_id);
2628

2729
void single_step(uint8_t hart_id);
2830

31+
uint32_t get_flen(uint8_t hart_id);
32+
2933
reg_t get_vlen(uint8_t hart_id);
3034
reg_t get_elen(uint8_t hart_id);
3135

hammer_pybind.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ PYBIND11_MODULE(hammer, m) {
2121
.def("hello_world", &Hammer::hello_world)
2222
.def("get_gpr", &Hammer::get_gpr)
2323
.def("set_gpr", &Hammer::set_gpr)
24+
.def("get_fpr", &Hammer::get_fpr)
2425
.def("get_PC", &Hammer::get_PC)
2526
.def("set_PC", &Hammer::set_PC)
2627
.def("get_csr", &Hammer::get_csr)
28+
.def("get_flen", &Hammer::get_flen)
2729
.def("get_vlen", &Hammer::get_vlen)
2830
.def("get_elen", &Hammer::get_elen)
2931
.def("get_vector_reg", &Hammer::get_vector_reg)
@@ -36,4 +38,6 @@ PYBIND11_MODULE(hammer, m) {
3638
pybind11::enum_<PlatformDefines>(m, "PlatformDefines")
3739
.value("DramBase", DramBase)
3840
.export_values();
41+
42+
pybind11::enum_<CsrDefines>(m, "CsrDefines").value("MSTATUS_CSR", MSTATUS_CSR).export_values();
3943
}

pytests/meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ riscv_compiler_parameters = [
1616
]
1717

1818
hammer_tests = [
19-
['get GPR, CSR and VecReg values', 'pytest000'],
19+
['get GPR, FPR, CSR and VecReg values', 'pytest000'],
2020
['set GPR values', 'pytest001'],
2121
['get/set memory contents', 'pytest002'],
2222
['set PC', 'pytest003']

pytests/pytest000.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ def main():
2828
hammer = pyhammer.Hammer("RV64GCV", "MSU", "vlen:512,elen:64", hart_ids, [mem_layout], elf_name,
2929
None)
3030

31+
flen = hammer.get_flen(0)
32+
if (flen != 64):
33+
sys.exit(f"Unexpected flen: {flen}")
34+
3135
vlen = hammer.get_vlen(0)
3236
if (vlen != 512):
3337
sys.exit(f"Unexpected vlen: {vlen}")
@@ -58,10 +62,13 @@ def main():
5862
if (current_x3 != 3):
5963
sys.exit(f'Unexpected x3: {current_x3}')
6064

61-
for _ in range(12):
65+
for _ in range(13):
6266
hammer.single_step(0)
6367

64-
# TODO: add a read of the mstatus CSR which is set by this point
68+
current_mstatus = hammer.get_csr(0, pyhammer.MSTATUS_CSR)
69+
if (current_mstatus != 0x8000000a00002600):
70+
sys.exit(f"Unexpected mstatus: {current_mstatus:x}")
71+
6572
current_x1 = hammer.get_gpr(0, 1)
6673
if (current_x1 != 4):
6774
sys.exit(f'Unexpected x1 after vsetivli {current_x1}')
@@ -87,6 +94,13 @@ def main():
8794
if (v3[0] != 0x3000 or v3[1] != 0x0 or v3[2] != 0x0 or v3[3] != 0):
8895
sys.exit(f"Unexpected value in v3: 0x{v3[3]:x}{v3[2]:x}{v3[1]:x}{v3[0]:x}")
8996

97+
for _ in range(2):
98+
hammer.single_step(0)
99+
100+
current_f1 = hammer.get_fpr(0, 1)
101+
if (current_f1 != 0xffffffff3fc00000):
102+
sys.exit(f"Unexpected f1: {current_f1:x}")
103+
90104
pass
91105

92106

tests/meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ else
2121
endif
2222

2323
hammer_tests = [
24-
['get GPR, CSR and VecReg values', 'test000'],
24+
['get GPR, FPR CSR and VecReg values', 'test000'],
2525
['set GPR values', 'test001'],
2626
['get/set memory contents', 'test002'],
2727
['set PC', 'test003'],

tests/test000.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ int main(int argc, char *argv[]) {
1818
target_binary, std::nullopt);
1919

2020
// hammer.hello_world();
21+
uint32_t flen = hammer.get_flen(0);
22+
if (flen != 64) {
23+
printf("Unexpected flen: %d\n", flen);
24+
exit(1);
25+
}
26+
2127
uint32_t vlen = hammer.get_vlen(0);
2228
if (vlen != 512) {
2329
printf("Unexpected vlen: %d\n", vlen);
@@ -59,13 +65,12 @@ int main(int argc, char *argv[]) {
5965
exit(1);
6066
}
6167

62-
for (uint32_t i = 0; i < 12; ++i) {
68+
for (uint32_t i = 0; i < 13; ++i) {
6369
hammer.single_step(0);
6470
}
6571

66-
// TODO: add a read of the mstatus CSR which is set by this point
6772
reg_t current_mstatus = hammer.get_csr(0, MSTATUS_CSR);
68-
if (current_mstatus != 0x8000000a00000600) {
73+
if (current_mstatus != 0x8000000a00002600) {
6974
printf("Unexpected mstatus: 0x%" PRIx64 "\n", current_mstatus);
7075
exit(1);
7176
}
@@ -111,4 +116,14 @@ int main(int argc, char *argv[]) {
111116
v3[1], v3[0]);
112117
exit(1);
113118
}
119+
120+
for (uint32_t i = 0; i < 2; ++i) {
121+
hammer.single_step(0);
122+
}
123+
124+
uint64_t current_f1 = hammer.get_fpr(0, 1);
125+
if (current_f1 != 0xffffffff3fc00000) {
126+
printf("Unexpected f1: 0x%" PRIx64 "\n", current_f1);
127+
exit(1);
128+
}
114129
}

tests/test000.input.S

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ _start:
1111
li x2, 2
1212
add x3, x2, x1; # x3 = x2 + x1
1313

14-
li a3, 0x0000000a00000200
14+
li a3, 0xa00002200
1515
csrw mstatus, a3
1616

1717
vsetivli x1, 4, e32, m1
@@ -27,6 +27,9 @@ _start:
2727

2828
vadd.vv v3, v2, v1
2929

30+
li x1, 0x3fc00000
31+
fmv.w.x f1, x1
32+
3033
# Magic instruction to terminate the run.
3134
lui x0, 0xdeadb
3235

0 commit comments

Comments
 (0)