Skip to content

Commit 9bea6f8

Browse files
authored
Add Load-Store and Store-Load Bypass Tests for Forwarding in Pipelined CPU (#600)
- Enhanced test_macros.h with TEST_LD_ST_BYPASS and TEST_ST_LD_BYPASS macros to validate both load-store and store-load bypassing logic.
1 parent 0494f95 commit 9bea6f8

File tree

7 files changed

+301
-5
lines changed

7 files changed

+301
-5
lines changed

isa/macros/scalar/test_macros.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,29 @@ test_ ## testnum: \
295295
li x5, 2; \
296296
bne x4, x5, 1b \
297297

298-
#define TEST_BR2_OP_TAKEN( testnum, inst, val1, val2 ) \
298+
#define TEST_LD_ST_BYPASS(testnum, load_inst, store_inst, result, offset, base) \
299+
test_ ## testnum: \
300+
li TESTNUM, testnum; \
301+
la x2, base; \
302+
li x1, result; \
303+
store_inst x1, offset(x2); \
304+
load_inst x14, offset(x2); \
305+
store_inst x14, offset(x2); \
306+
load_inst x2, offset(x2); \
307+
li x7, result; \
308+
bne x2, x7, fail; \
309+
310+
#define TEST_ST_LD_BYPASS(testnum, load_inst, store_inst, result, offset, base) \
311+
test_ ## testnum: \
312+
li TESTNUM, testnum; \
313+
la x2, base; \
314+
li x1, result; \
315+
store_inst x1, offset(x2); \
316+
load_inst x14, offset(x2); \
317+
li x7, result; \
318+
bne x14, x7, fail; \
319+
320+
#define TEST_BR2_OP_TAKEN(testnum, inst, val1, val2 ) \
299321
test_ ## testnum: \
300322
li TESTNUM, testnum; \
301323
li x1, val1; \

isa/rv32ui/Makefrag

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ rv32ui_sc_tests = \
1010
beq bge bgeu blt bltu bne \
1111
fence_i \
1212
jal jalr \
13-
lb lbu lh lhu lw \
13+
lb lbu lh lhu lw ld_st \
1414
lui \
1515
ma_data \
1616
or ori \
17-
sb sh sw \
17+
sb sh sw st_ld \
1818
sll slli \
1919
slt slti sltiu sltu \
2020
sra srai \

isa/rv32ui/ld_st.S

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# See LICENSE for license details.
2+
3+
#include "riscv_test.h"
4+
#undef RVTEST_RV64U
5+
#define RVTEST_RV64U RVTEST_RV32U
6+
7+
#include "../rv64ui/ld_st.S"

isa/rv32ui/st_ld.S

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# See LICENSE for license details.
2+
3+
#include "riscv_test.h"
4+
#undef RVTEST_RV64U
5+
#define RVTEST_RV64U RVTEST_RV32U
6+
7+
#include "../rv64ui/st_ld.S"

isa/rv64ui/Makefrag

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ rv64ui_sc_tests = \
1010
simple \
1111
fence_i \
1212
jal jalr \
13-
lb lbu lh lhu lw lwu ld \
13+
lb lbu lh lhu lw lwu ld ld_st \
1414
lui \
1515
ma_data \
1616
or ori \
17-
sb sh sw sd \
17+
sb sh sw sd st_ld \
1818
sll slli slliw sllw \
1919
slt slti sltiu sltu \
2020
sra srai sraiw sraw \

isa/rv64ui/ld_st.S

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
# See LICENSE for license details.
2+
3+
#*****************************************************************************
4+
# ld_st.S
5+
#-----------------------------------------------------------------------------
6+
#
7+
# Test load and store instructions
8+
#
9+
10+
#include "riscv_test.h"
11+
#include "test_macros.h"
12+
13+
RVTEST_RV64U
14+
RVTEST_CODE_BEGIN
15+
16+
#-------------------------------------------------------------
17+
# Bypassing Tests
18+
#-------------------------------------------------------------
19+
20+
# Test sb and lb (signed byte)
21+
TEST_LD_ST_BYPASS(2, lb, sb, 0xffffffffffffffdd, 0, tdat );
22+
TEST_LD_ST_BYPASS(3, lb, sb, 0xffffffffffffffcd, 1, tdat );
23+
TEST_LD_ST_BYPASS(4, lb, sb, 0xffffffffffffffcc, 2, tdat );
24+
TEST_LD_ST_BYPASS(5, lb, sb, 0xffffffffffffffbc, 3, tdat );
25+
TEST_LD_ST_BYPASS(6, lb, sb, 0xffffffffffffffbb, 4, tdat );
26+
TEST_LD_ST_BYPASS(7, lb, sb, 0xffffffffffffffab, 5, tdat );
27+
28+
TEST_LD_ST_BYPASS(8, lb, sb, 0x33, 0, tdat );
29+
TEST_LD_ST_BYPASS(9, lb, sb, 0x23, 1, tdat );
30+
TEST_LD_ST_BYPASS(10, lb, sb, 0x22, 2, tdat );
31+
TEST_LD_ST_BYPASS(11, lb, sb, 0x12, 3, tdat );
32+
TEST_LD_ST_BYPASS(12, lb, sb, 0x11, 4, tdat );
33+
TEST_LD_ST_BYPASS(13, lb, sb, 0x01, 5, tdat );
34+
35+
# Test sb and lbu (unsigned byte)
36+
TEST_LD_ST_BYPASS(14, lbu, sb, 0x33, 0, tdat );
37+
TEST_LD_ST_BYPASS(15, lbu, sb, 0x23, 1, tdat );
38+
TEST_LD_ST_BYPASS(16, lbu, sb, 0x22, 2, tdat );
39+
TEST_LD_ST_BYPASS(17, lbu, sb, 0x12, 3, tdat );
40+
TEST_LD_ST_BYPASS(18, lbu, sb, 0x11, 4, tdat );
41+
TEST_LD_ST_BYPASS(19, lbu, sb, 0x01, 5, tdat );
42+
43+
# Test sw and lw (signed word)
44+
TEST_LD_ST_BYPASS(20, lw, sw, 0xffffffffaabbccdd, 0, tdat );
45+
TEST_LD_ST_BYPASS(21, lw, sw, 0xffffffffdaabbccd, 4, tdat );
46+
TEST_LD_ST_BYPASS(22, lw, sw, 0xffffffffddaabbcc, 8, tdat );
47+
TEST_LD_ST_BYPASS(23, lw, sw, 0xffffffffcddaabbc, 12, tdat );
48+
TEST_LD_ST_BYPASS(24, lw, sw, 0xffffffffccddaabb, 16, tdat );
49+
TEST_LD_ST_BYPASS(25, lw, sw, 0xffffffffbccddaab, 20, tdat );
50+
51+
TEST_LD_ST_BYPASS(26, lw, sw, 0x00112233, 0, tdat );
52+
TEST_LD_ST_BYPASS(27, lw, sw, 0x30011223, 4, tdat );
53+
TEST_LD_ST_BYPASS(28, lw, sw, 0x33001122, 8, tdat );
54+
TEST_LD_ST_BYPASS(29, lw, sw, 0x23300112, 12, tdat );
55+
TEST_LD_ST_BYPASS(30, lw, sw, 0x22330011, 16, tdat );
56+
TEST_LD_ST_BYPASS(31, lw, sw, 0x12233001, 20, tdat );
57+
58+
# Test sh and lh (signed halfword)
59+
TEST_LD_ST_BYPASS(32, lh, sh, 0xffffffffffffccdd, 0, tdat );
60+
TEST_LD_ST_BYPASS(33, lh, sh, 0xffffffffffffbccd, 2, tdat );
61+
TEST_LD_ST_BYPASS(34, lh, sh, 0xffffffffffffbbcc, 4, tdat );
62+
TEST_LD_ST_BYPASS(35, lh, sh, 0xffffffffffffabbc, 6, tdat );
63+
TEST_LD_ST_BYPASS(36, lh, sh, 0xffffffffffffaabb, 8, tdat );
64+
TEST_LD_ST_BYPASS(37, lh, sh, 0xffffffffffffdaab, 10, tdat );
65+
66+
TEST_LD_ST_BYPASS(38, lh, sh, 0x2233, 0, tdat );
67+
TEST_LD_ST_BYPASS(39, lh, sh, 0x1223, 2, tdat );
68+
TEST_LD_ST_BYPASS(40, lh, sh, 0x1122, 4, tdat );
69+
TEST_LD_ST_BYPASS(41, lh, sh, 0x0112, 6, tdat );
70+
TEST_LD_ST_BYPASS(42, lh, sh, 0x0011, 8, tdat );
71+
TEST_LD_ST_BYPASS(43, lh, sh, 0x3001, 10, tdat );
72+
73+
# Test sh and lhu (unsigned halfword)
74+
TEST_LD_ST_BYPASS(44, lhu, sh, 0x2233, 0, tdat );
75+
TEST_LD_ST_BYPASS(45, lhu, sh, 0x1223, 2, tdat );
76+
TEST_LD_ST_BYPASS(46, lhu, sh, 0x1122, 4, tdat );
77+
TEST_LD_ST_BYPASS(47, lhu, sh, 0x0112, 6, tdat );
78+
TEST_LD_ST_BYPASS(48, lhu, sh, 0x0011, 8, tdat );
79+
TEST_LD_ST_BYPASS(49, lhu, sh, 0x3001, 10, tdat );
80+
81+
# RV64-specific tests for ld, sd, and lwu
82+
#if __riscv_xlen == 64
83+
# Test sd and ld (doubleword)
84+
TEST_LD_ST_BYPASS(50, ld, sd, 0x0011223344556677, 0, tdat );
85+
TEST_LD_ST_BYPASS(51, ld, sd, 0x1122334455667788, 8, tdat );
86+
TEST_LD_ST_BYPASS(52, ld, sd, 0x2233445566778899, 16, tdat );
87+
TEST_LD_ST_BYPASS(53, ld, sd, 0xabbccdd, 0, tdat );
88+
TEST_LD_ST_BYPASS(54, ld, sd, 0xaabbccd, 8, tdat );
89+
TEST_LD_ST_BYPASS(55, ld, sd, 0xdaabbcc, 16, tdat );
90+
TEST_LD_ST_BYPASS(56, ld, sd, 0xddaabbc, 24, tdat );
91+
TEST_LD_ST_BYPASS(57, ld, sd, 0xcddaabb, 32, tdat );
92+
TEST_LD_ST_BYPASS(58, ld, sd, 0xccddaab, 40, tdat );
93+
94+
TEST_LD_ST_BYPASS(59, ld, sd, 0x00112233, 0, tdat );
95+
TEST_LD_ST_BYPASS(60, ld, sd, 0x30011223, 8, tdat );
96+
TEST_LD_ST_BYPASS(61, ld, sd, 0x33001122, 16, tdat );
97+
TEST_LD_ST_BYPASS(62, ld, sd, 0x23300112, 24, tdat );
98+
TEST_LD_ST_BYPASS(63, ld, sd, 0x22330011, 32, tdat );
99+
TEST_LD_ST_BYPASS(64, ld, sd, 0x12233001, 40, tdat );
100+
101+
# Test sw and lwu (unsigned word)
102+
TEST_LD_ST_BYPASS(65, lwu, sw, 0x00112233, 0, tdat );
103+
TEST_LD_ST_BYPASS(66, lwu, sw, 0x33001122, 8, tdat );
104+
TEST_LD_ST_BYPASS(67, lwu, sw, 0x30011223, 4, tdat );
105+
TEST_LD_ST_BYPASS(68, lwu, sw, 0x23300112, 12, tdat );
106+
TEST_LD_ST_BYPASS(69, lwu, sw, 0x22330011, 16, tdat );
107+
TEST_LD_ST_BYPASS(70, lwu, sw, 0x12233001, 20, tdat );
108+
#endif
109+
110+
li a0, 0xef # Immediate load for manual store test
111+
la a1, tdat # Load address of tdat
112+
sb a0, 3(a1) # Store byte at offset 3 of tdat
113+
lb a2, 3(a1) # Load byte back for verification
114+
115+
TEST_PASSFAIL
116+
117+
RVTEST_CODE_END
118+
119+
.data
120+
RVTEST_DATA_BEGIN
121+
122+
TEST_DATA
123+
124+
tdat:
125+
.rept 20
126+
.word 0xdeadbeef
127+
.endr
128+
129+
130+
RVTEST_DATA_END

isa/rv64ui/st_ld.S

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
# See LICENSE for license details.
2+
3+
#*****************************************************************************
4+
# st_ld.S
5+
#-----------------------------------------------------------------------------
6+
#
7+
# Test store and load instructions
8+
#
9+
10+
#include "riscv_test.h"
11+
#include "test_macros.h"
12+
13+
RVTEST_RV64U
14+
RVTEST_CODE_BEGIN
15+
16+
#-------------------------------------------------------------
17+
# Bypassing Tests
18+
#-------------------------------------------------------------
19+
20+
# Test sb and lb (signed byte)
21+
TEST_ST_LD_BYPASS(2, lb, sb, 0xffffffffffffffdd, 0, tdat );
22+
TEST_ST_LD_BYPASS(3, lb, sb, 0xffffffffffffffcd, 1, tdat );
23+
TEST_ST_LD_BYPASS(4, lb, sb, 0xffffffffffffffcc, 2, tdat );
24+
TEST_ST_LD_BYPASS(5, lb, sb, 0xffffffffffffffbc, 3, tdat );
25+
TEST_ST_LD_BYPASS(6, lb, sb, 0xffffffffffffffbb, 4, tdat );
26+
TEST_ST_LD_BYPASS(7, lb, sb, 0xffffffffffffffab, 5, tdat );
27+
28+
TEST_ST_LD_BYPASS(8, lb, sb, 0x33, 0, tdat );
29+
TEST_ST_LD_BYPASS(9, lb, sb, 0x23, 1, tdat );
30+
TEST_ST_LD_BYPASS(10, lb, sb, 0x22, 2, tdat );
31+
TEST_ST_LD_BYPASS(11, lb, sb, 0x12, 3, tdat );
32+
TEST_ST_LD_BYPASS(12, lb, sb, 0x11, 4, tdat );
33+
TEST_ST_LD_BYPASS(13, lb, sb, 0x01, 5, tdat );
34+
35+
# Test sb and lbu (unsigned byte)
36+
TEST_ST_LD_BYPASS(14, lbu, sb, 0x33, 0, tdat );
37+
TEST_ST_LD_BYPASS(15, lbu, sb, 0x23, 1, tdat );
38+
TEST_ST_LD_BYPASS(16, lbu, sb, 0x22, 2, tdat );
39+
TEST_ST_LD_BYPASS(17, lbu, sb, 0x12, 3, tdat );
40+
TEST_ST_LD_BYPASS(18, lbu, sb, 0x11, 4, tdat );
41+
TEST_ST_LD_BYPASS(19, lbu, sb, 0x01, 5, tdat );
42+
43+
# Test sw and lw (signed word)
44+
TEST_ST_LD_BYPASS(20, lw, sw, 0xffffffffaabbccdd, 0, tdat );
45+
TEST_ST_LD_BYPASS(21, lw, sw, 0xffffffffdaabbccd, 4, tdat );
46+
TEST_ST_LD_BYPASS(22, lw, sw, 0xffffffffddaabbcc, 8, tdat );
47+
TEST_ST_LD_BYPASS(23, lw, sw, 0xffffffffcddaabbc, 12, tdat );
48+
TEST_ST_LD_BYPASS(24, lw, sw, 0xffffffffccddaabb, 16, tdat );
49+
TEST_ST_LD_BYPASS(25, lw, sw, 0xffffffffbccddaab, 20, tdat );
50+
51+
TEST_ST_LD_BYPASS(26, lw, sw, 0x00112233, 0, tdat );
52+
TEST_ST_LD_BYPASS(27, lw, sw, 0x30011223, 4, tdat );
53+
TEST_ST_LD_BYPASS(28, lw, sw, 0x33001122, 8, tdat );
54+
TEST_ST_LD_BYPASS(29, lw, sw, 0x23300112, 12, tdat );
55+
TEST_ST_LD_BYPASS(30, lw, sw, 0x22330011, 16, tdat );
56+
TEST_ST_LD_BYPASS(31, lw, sw, 0x12233001, 20, tdat );
57+
58+
# Test sh and lh (signed halfword)
59+
TEST_ST_LD_BYPASS(32, lh, sh, 0xffffffffffffccdd, 0, tdat );
60+
TEST_ST_LD_BYPASS(33, lh, sh, 0xffffffffffffbccd, 2, tdat );
61+
TEST_ST_LD_BYPASS(34, lh, sh, 0xffffffffffffbbcc, 4, tdat );
62+
TEST_ST_LD_BYPASS(35, lh, sh, 0xffffffffffffabbc, 6, tdat );
63+
TEST_ST_LD_BYPASS(36, lh, sh, 0xffffffffffffaabb, 8, tdat );
64+
TEST_ST_LD_BYPASS(37, lh, sh, 0xffffffffffffdaab, 10, tdat );
65+
66+
TEST_ST_LD_BYPASS(38, lh, sh, 0x2233, 0, tdat );
67+
TEST_ST_LD_BYPASS(39, lh, sh, 0x1223, 2, tdat );
68+
TEST_ST_LD_BYPASS(40, lh, sh, 0x1122, 4, tdat );
69+
TEST_ST_LD_BYPASS(41, lh, sh, 0x0112, 6, tdat );
70+
TEST_ST_LD_BYPASS(42, lh, sh, 0x0011, 8, tdat );
71+
TEST_ST_LD_BYPASS(43, lh, sh, 0x3001, 10, tdat );
72+
73+
# Test sh and lhu (unsigned halfword)
74+
TEST_ST_LD_BYPASS(44, lhu, sh, 0x2233, 0, tdat );
75+
TEST_ST_LD_BYPASS(45, lhu, sh, 0x1223, 2, tdat );
76+
TEST_ST_LD_BYPASS(46, lhu, sh, 0x1122, 4, tdat );
77+
TEST_ST_LD_BYPASS(47, lhu, sh, 0x0112, 6, tdat );
78+
TEST_ST_LD_BYPASS(48, lhu, sh, 0x0011, 8, tdat );
79+
TEST_ST_LD_BYPASS(49, lhu, sh, 0x3001, 10, tdat );
80+
81+
# RV64-specific tests for ld, sd, and lwu
82+
#if __riscv_xlen == 64
83+
# Test sd and ld (doubleword)
84+
TEST_ST_LD_BYPASS(50, ld, sd, 0x0011223344556677, 0, tdat );
85+
TEST_ST_LD_BYPASS(51, ld, sd, 0x1122334455667788, 8, tdat );
86+
TEST_ST_LD_BYPASS(52, ld, sd, 0x2233445566778899, 16, tdat );
87+
TEST_ST_LD_BYPASS(53, ld, sd, 0xabbccdd, 0, tdat );
88+
TEST_ST_LD_BYPASS(54, ld, sd, 0xaabbccd, 8, tdat );
89+
TEST_ST_LD_BYPASS(55, ld, sd, 0xdaabbcc, 16, tdat );
90+
TEST_ST_LD_BYPASS(56, ld, sd, 0xddaabbc, 24, tdat );
91+
TEST_ST_LD_BYPASS(57, ld, sd, 0xcddaabb, 32, tdat );
92+
TEST_ST_LD_BYPASS(58, ld, sd, 0xccddaab, 40, tdat );
93+
94+
TEST_ST_LD_BYPASS(59, ld, sd, 0x00112233, 0, tdat );
95+
TEST_ST_LD_BYPASS(60, ld, sd, 0x30011223, 8, tdat );
96+
TEST_ST_LD_BYPASS(61, ld, sd, 0x33001122, 16, tdat );
97+
TEST_ST_LD_BYPASS(62, ld, sd, 0x23300112, 24, tdat );
98+
TEST_ST_LD_BYPASS(63, ld, sd, 0x22330011, 32, tdat );
99+
TEST_ST_LD_BYPASS(64, ld, sd, 0x12233001, 40, tdat );
100+
101+
# Test sw and lwu (unsigned word)
102+
TEST_ST_LD_BYPASS(65, lwu, sw, 0x00112233, 0, tdat );
103+
TEST_ST_LD_BYPASS(66, lwu, sw, 0x33001122, 8, tdat );
104+
TEST_ST_LD_BYPASS(67, lwu, sw, 0x30011223, 4, tdat );
105+
TEST_ST_LD_BYPASS(68, lwu, sw, 0x23300112, 12, tdat );
106+
TEST_ST_LD_BYPASS(69, lwu, sw, 0x22330011, 16, tdat );
107+
TEST_ST_LD_BYPASS(70, lwu, sw, 0x12233001, 20, tdat );
108+
#endif
109+
110+
li a0, 0xef # Immediate load for manual store test
111+
la a1, tdat # Load address of tdat
112+
sb a0, 3(a1) # Store byte at offset 3 of tdat
113+
lb a2, 3(a1) # Load byte back for verification
114+
115+
TEST_PASSFAIL
116+
117+
RVTEST_CODE_END
118+
119+
.data
120+
RVTEST_DATA_BEGIN
121+
122+
TEST_DATA
123+
124+
tdat:
125+
.rept 20
126+
.word 0xdeadbeef
127+
.endr
128+
129+
130+
RVTEST_DATA_END

0 commit comments

Comments
 (0)