Skip to content

Commit ea1ca2a

Browse files
authored
컴퓨터구조 - P2
1 parent 43d6f60 commit ea1ca2a

15 files changed

+349
-0
lines changed

add_test.asm

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
addi x16, x0, 10
2+
addi x17, x0, 20
3+
add x18, x16, x17
4+
addi x9, x0, 10

add_test.hex

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
00a00813
2+
01400893
3+
01180933
4+
00a00493

addi_test.asm

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
addi x0, x0, 10
2+
addi x1, x0, 10
3+
addi x2, x0, 10
4+
addi x3, x0, 10
5+
addi x4, x0, 10
6+
addi x5, x0, 10
7+
addi x6, x0, 10
8+
addi x7, x0, 10
9+
addi x8, x0, 10
10+
addi x10, x0, 10
11+
addi x11, x0, 10
12+
addi x12, x0, 10
13+
addi x13, x0, 10
14+
addi x14, x0, 10
15+
addi x15, x0, 10
16+
addi x16, x0, 10
17+
addi x17, x0, 10
18+
addi x18, x0, 10
19+
addi x19, x0, 10
20+
addi x20, x0, 10
21+
addi x21, x0, 10
22+
addi x22, x0, 10
23+
addi x23, x0, 10
24+
addi x24, x0, 10
25+
addi x25, x0, 10
26+
addi x26, x0, 10
27+
addi x27, x0, 10
28+
addi x28, x0, 10
29+
addi x29, x0, 10
30+
addi x30, x0, 10
31+
addi x31, x0, 10
32+
addi x9, x0, 10

addi_test.hex

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
00a00013
2+
00a00093
3+
00a00113
4+
00a00193
5+
00a00213
6+
00a00293
7+
00a00313
8+
00a00393
9+
00a00413
10+
00a00513
11+
00a00593
12+
00a00613
13+
00a00693
14+
00a00713
15+
00a00793
16+
00a00813
17+
00a00893
18+
00a00913
19+
00a00993
20+
00a00a13
21+
00a00a93
22+
00a00b13
23+
00a00b93
24+
00a00c13
25+
00a00c93
26+
00a00d13
27+
00a00d93
28+
00a00e13
29+
00a00e93
30+
00a00f13
31+
00a00f93
32+
00a00493

beq_test.asm

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
addi x16, x0, 30
2+
addi x17, x0, 30
3+
beq x16, x17, L1
4+
addi x18, x0, 10
5+
L1: addi x9, x0, 10

beq_test.hex

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
01e00813
2+
01e00893
3+
01180463
4+
00a00913
5+
00a00493

jal_test.asm

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
jal x1, L
2+
addi x16, x0, 10
3+
L: addi x17, x0, 20
4+
addi x9, x0, 10
5+

jal_test.hex

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
008000ef
2+
00a00813
3+
01400893
4+
00a00493

jalr_test.asm

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
jal x31, L
2+
jal x0, END
3+
addi x16, x0, 10
4+
L: addi x16, x0, 10
5+
addi x17, x0, 20
6+
jalr x0, 0(x31)
7+
addi x18, x0, 20
8+
END: addi x19, x0, 20
9+
addi x9, x0, 10

jalr_test.hex

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
00c00fef
2+
0180006f
3+
00a00813
4+
00a00813
5+
01400893
6+
000f8067
7+
01400913
8+
01400993
9+
00a48493

riscv_sim.c

+184
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
#include <stdio.h>
2+
#include <math.h>
3+
#include <stdlib.h>
4+
5+
//clock cycles
6+
long long cycles = 0;
7+
8+
// registers
9+
long long int regs[32];
10+
11+
// program counter
12+
unsigned long pc = 0;
13+
14+
// memory
15+
#define INST_MEM_SIZE 32*1024
16+
#define DATA_MEM_SIZE 32*1024
17+
unsigned long inst_mem[INST_MEM_SIZE]; //instruction memory
18+
unsigned long long data_mem[DATA_MEM_SIZE]; //data memory
19+
20+
//misc. function
21+
int init(char* filename);
22+
23+
void print_cycles();
24+
void print_reg();
25+
void print_pc();
26+
27+
//fetch an instruction from a instruction memory
28+
void fetch() {
29+
30+
}
31+
32+
//decode the instruction and read data from register file
33+
void decode() {
34+
35+
}
36+
37+
//perform the appropriate operation
38+
void exe() {
39+
40+
}
41+
42+
//access the data memory
43+
void mem() {
44+
45+
}
46+
47+
//write result of arithmetic operation or data read from the data memory if required
48+
void wb() {
49+
50+
}
51+
52+
int main(int ac, char* av[])
53+
{
54+
55+
if (ac < 3)
56+
{
57+
printf("./riscv_sim filename mode\n");
58+
return -1;
59+
}
60+
61+
62+
char done = 0;
63+
if (init(av[1]) != 0)
64+
return -1;
65+
while (!done)
66+
{
67+
68+
fetch();
69+
decode();
70+
exe();
71+
mem();
72+
wb();
73+
74+
75+
cycles++; //increase clock cycle
76+
77+
//if debug mode, print clock cycle, pc, reg
78+
if (*av[2] == '0') {
79+
print_cycles(); //print clock cycles
80+
print_pc(); //print pc
81+
print_reg(); //print registers
82+
}
83+
84+
// check the exit condition, do not delete!!
85+
if (regs[9] == 10) //if value in $t1 is 10, finish the simulation
86+
done = 1;
87+
}
88+
89+
if (*av[2] == '1')
90+
{
91+
print_cycles(); //print clock cycles
92+
print_pc(); //print pc
93+
print_reg(); //print registers
94+
}
95+
96+
return 0;
97+
}
98+
99+
100+
/* initialize all datapat elements
101+
//fill the instruction and data memory
102+
//reset the registers
103+
*/
104+
int init(char* filename)
105+
{
106+
FILE* fp = fopen(filename, "r");
107+
int i;
108+
long inst;
109+
110+
if (fp == NULL)
111+
{
112+
fprintf(stderr, "Error opening file.\n");
113+
return -1;
114+
}
115+
116+
/* fill instruction memory */
117+
i = 0;
118+
while (fscanf(fp, "%lx", &inst) == 1)
119+
{
120+
inst_mem[i++] = inst;
121+
}
122+
123+
124+
/*reset the registers*/
125+
for (i = 0; i < 32; i++)
126+
{
127+
regs[i] = 0;
128+
}
129+
130+
/*reset pc*/
131+
pc = 0;
132+
/*reset clock cycles*/
133+
cycles = 0;
134+
return 0;
135+
}
136+
137+
void print_cycles()
138+
{
139+
printf("---------------------------------------------------\n");
140+
141+
printf("Clock cycles = %lld\n", cycles);
142+
}
143+
144+
void print_pc()
145+
{
146+
printf("PC = %ld\n\n", pc);
147+
}
148+
149+
void print_reg()
150+
{
151+
printf("x0 = %d\n", regs[0]);
152+
printf("x1 = %d\n", regs[1]);
153+
printf("x2 = %d\n", regs[2]);
154+
printf("x3 = %d\n", regs[3]);
155+
printf("x4 = %d\n", regs[4]);
156+
printf("x5 = %d\n", regs[5]);
157+
printf("x6 = %d\n", regs[6]);
158+
printf("x7 = %d\n", regs[7]);
159+
printf("x8 = %d\n", regs[8]);
160+
printf("x9 = %d\n", regs[9]);
161+
printf("x10 = %d\n", regs[10]);
162+
printf("x11 = %d\n", regs[11]);
163+
printf("x12 = %d\n", regs[12]);
164+
printf("x13 = %d\n", regs[13]);
165+
printf("x14 = %d\n", regs[14]);
166+
printf("x15 = %d\n", regs[15]);
167+
printf("x16 = %d\n", regs[16]);
168+
printf("x17 = %d\n", regs[17]);
169+
printf("x18 = %d\n", regs[18]);
170+
printf("x19 = %d\n", regs[19]);
171+
printf("x20 = %d\n", regs[20]);
172+
printf("x21 = %d\n", regs[21]);
173+
printf("x22 = %d\n", regs[22]);
174+
printf("x23 = %d\n", regs[23]);
175+
printf("x24 = %d\n", regs[24]);
176+
printf("x25 = %d\n", regs[25]);
177+
printf("x26 = %d\n", regs[26]);
178+
printf("x27 = %d\n", regs[27]);
179+
printf("x28 = %d\n", regs[28]);
180+
printf("x29 = %d\n", regs[29]);
181+
printf("x30 = %d\n", regs[30]);
182+
printf("x31 = %d\n", regs[31]);
183+
printf("\n");
184+
}

runme.asm

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
main:
2+
addi x2, x0, 800
3+
addi x10, x0, 10 #n=10
4+
jal x1, accum #call accum
5+
jal x0, exit #exit
6+
accum:
7+
addi x2, x2, -16 #adjust sp
8+
sd x1, 8(x2) #push return address
9+
sd x10, 0(x2) #push n
10+
addi x5, x10, -1 #t=n-1
11+
beq x0, x0, L1
12+
L2: addi x10, x0, 1 #r=1
13+
addi x2, x2, 16 #adjust sp
14+
jalr x0 0(x1) #return to caller
15+
L1: beq x5, x0, L2 #if n==0?
16+
addi x10, x10, -1 #t=n-1
17+
jal x1 accum #call fact
18+
addi x6, x10, 0 #t1=n
19+
ld x10, 0(x2) #pop n
20+
ld x1, 8(x2) #pop return address
21+
addi x2, x2, 16 #adjust sp
22+
add x10, x10, x6 #n+accum(n-1)
23+
jalr x0, 0(x1) #return to caller
24+
exit: addi x9, x0, 10

runme.hex

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
32000113
2+
00a00513
3+
008000ef
4+
0480006f
5+
ff010113
6+
00113423
7+
00a13023
8+
fff50293
9+
00000863
10+
00100513
11+
01010113
12+
00008067
13+
fe028ae3
14+
fff50513
15+
fd9ff0ef
16+
00050313
17+
00013503
18+
00813083
19+
01010113
20+
00650533
21+
00008067
22+
00a00493

sd_ld_test.asm

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
addi x29, x29, 0
2+
addi x4, x0, 30
3+
sd x4, 8(x29)
4+
ld x16, 8(x29)
5+
addi x9, x0, 10

sd_ld_test.hex

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
00000e93
2+
01e00213
3+
004eb423
4+
008eb803
5+
00a00493

0 commit comments

Comments
 (0)