Skip to content

Commit 959352c

Browse files
status signals completed
1 parent f34d7f7 commit 959352c

3 files changed

Lines changed: 92 additions & 72 deletions

File tree

.vscode/configurationCache.log

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"buildTargets":["assemble","clean","clean-mem","compile","obj_dir/Vmips_machine","sim","verify","verify-all"],"launchTargets":[],"customConfigurationProvider":{"workspaceBrowse":{"browsePath":[],"compilerArgs":[]},"fileIndex":[]}}
1+
{"buildTargets":["assemble","clean","clean-mem","compile","make","obj_dir/Vmips_machine","sim","verify","verify-all"],"launchTargets":[],"customConfigurationProvider":{"workspaceBrowse":{"browsePath":[],"compilerArgs":[]},"fileIndex":[]}}

.vscode/targets.log

Lines changed: 15 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,8 @@ make all --print-data-base --no-builtin-variables --no-builtin-rules --question
66
# PARTICULAR PURPOSE.
77

88
# This program built for i386-apple-darwin11.3.0
9-
10-
make: *** No rule to make target `all'. Stop.
11-
129

13-
# Make data base, printed on Thu Jul 21 23:21:59 2022
10+
# Make data base, printed on Thu Jul 21 23:44:46 2022
1411

1512
# Variables
1613

@@ -159,7 +156,7 @@ CONDA_PREFIX = /Users/AMF/opt/anaconda3
159156
# environment
160157
VSCODE_PID = 16578
161158
# makefile (from `Makefile', line 23)
162-
INPUT = test/default/addiu
159+
INPUT = test/default/wanted
163160
# environment
164161
_CE_CONDA =
165162
# environment
@@ -174,11 +171,11 @@ LANG = C
174171
# Directories
175172

176173
# . (device 16777220, inode 79971131): 16 files, no impossibilities.
177-
# test/default (device 16777220, inode 79971255): 30 files, no impossibilities.
174+
# test/default (device 16777220, inode 79971255): 33 files, no impossibilities.
178175
# 323src (device 16777220, inode 79971231): 7 files, no impossibilities.
179-
# src (device 16777220, inode 79971241): 20 files, no impossibilities.
176+
# src (device 16777220, inode 79971241): 14 files, no impossibilities.
180177

181-
# 73 files, no impossibilities in 4 directories.
178+
# 70 files, no impossibilities in 4 directories.
182179

183180
# Implicit Rules
184181

@@ -196,7 +193,7 @@ LANG = C
196193

197194
# Files
198195

199-
obj_dir/Vmips_machine: src/EX.sv src/ID.sv src/IF.sv src/MEM.sv src/alu.sv src/cache.sv src/cache_control.sv src/controll.sv src/coprocessor.sv src/mips_core.sv src/pc.sv src/test_add_sub.sv src/test_cmp.sv src/test_div.sv src/test_mul.sv src/test_rev.sv src/test_rnd.sv 323src/dff.sv 323src/memory.sv 323src/mips_machine.sv 323src/regfile.sv 323src/sim_main.cpp
196+
obj_dir/Vmips_machine: src/EX.sv src/ID.sv src/IF.sv src/MEM.sv src/alu.sv src/cache.sv src/cache_control.sv src/controll.sv src/coprocessor.sv src/mips_core.sv src/pc.sv 323src/dff.sv 323src/memory.sv 323src/mips_machine.sv 323src/regfile.sv 323src/sim_main.cpp
200197
# Implicit rule search has not been done.
201198
# Modification time never checked.
202199
# File has not been updated.
@@ -208,18 +205,6 @@ obj_dir/Vmips_machine: src/EX.sv src/ID.sv src/IF.sv src/MEM.sv src/alu.sv src/c
208205
323src/sim_main.cpp
209206

210207

211-
# Not a target:
212-
src/test_add_sub.sv:
213-
# Implicit rule search has not been done.
214-
# Modification time never checked.
215-
# File has not been updated.
216-
217-
# Not a target:
218-
src/test_rnd.sv:
219-
# Implicit rule search has not been done.
220-
# Modification time never checked.
221-
# File has not been updated.
222-
223208
# Not a target:
224209
src/IF.sv:
225210
# Implicit rule search has not been done.
@@ -255,7 +240,7 @@ test/default/shifttest.mem:
255240
# Modification time never checked.
256241
# File has not been updated.
257242

258-
assemble: test/default/addiu.mem test/default/addtest.mem test/default/arithtest.mem test/default/brtest0.mem test/default/brtest2.mem test/default/float.mem test/default/memtest0.mem test/default/sb.mem test/default/shifttest.mem
243+
assemble: test/default/addiu.mem test/default/addtest.mem test/default/arithtest.mem test/default/brtest0.mem test/default/brtest2.mem test/default/float.mem test/default/memtest0.mem test/default/sb.mem test/default/shifttest.mem test/default/wanted.mem
259244
# Implicit rule search has not been done.
260245
# Modification time never checked.
261246
# File has not been updated.
@@ -266,12 +251,6 @@ assemble: test/default/addiu.mem test/default/addtest.mem test/default/arithtest
266251
# Modification time never checked.
267252
# File has not been updated.
268253

269-
# Not a target:
270-
src/test_rev.sv:
271-
# Implicit rule search has not been done.
272-
# Modification time never checked.
273-
# File has not been updated.
274-
275254
# Not a target:
276255
src/mips_core.sv:
277256
# Implicit rule search has not been done.
@@ -305,9 +284,8 @@ test/default/addiu.mem:
305284
# Not a target:
306285
Makefile:
307286
# Implicit rule search has been done.
308-
# Last modified 2022-07-19 01:45:55
287+
# Last modified 2022-07-21 23:25:44
309288
# File has been updated.
310-
311289
# Successfully updated.
312290
# variable set hash-table stats:
313291
# Load=0/32=0%, Rehash=0, Collisions=0/0=0%
@@ -318,14 +296,11 @@ src/cache.sv:
318296
# Modification time never checked.
319297
# File has not been updated.
320298

321-
# Not a target:
322-
323src/dff.sv:
323-
# Implicit rule search has not been done.
324-
# Modification time never checked.
325-
# File has not been updated.
299+
300+
make: *** No rule to make target `all'. Stop.
326301

327302
# Not a target:
328-
src/test_mul.sv:
303+
323src/dff.sv:
329304
# Implicit rule search has not been done.
330305
# Modification time never checked.
331306
# File has not been updated.
@@ -440,12 +415,6 @@ verify: sim
440415
diff -u ${INPUT}.reg output/regdump.reg 1>&2
441416

442417

443-
# Not a target:
444-
src/test_cmp.sv:
445-
# Implicit rule search has not been done.
446-
# Modification time never checked.
447-
# File has not been updated.
448-
449418
# Not a target:
450419
test/default/brtest2.mem:
451420
# Implicit rule search has not been done.
@@ -475,13 +444,13 @@ verify-all: compile assemble
475444

476445

477446
# Not a target:
478-
src/pc.sv:
447+
test/default/wanted.mem:
479448
# Implicit rule search has not been done.
480449
# Modification time never checked.
481450
# File has not been updated.
482451

483452
# Not a target:
484-
src/test_div.sv:
453+
src/pc.sv:
485454
# Implicit rule search has not been done.
486455
# Modification time never checked.
487456
# File has not been updated.
@@ -493,7 +462,7 @@ src/coprocessor.sv:
493462
# File has not been updated.
494463

495464
# files hash-table stats:
496-
# Load=44/1024=4%, Rehash=0, Collisions=0/96=0%
465+
# Load=39/1024=4%, Rehash=0, Collisions=0/86=0%
497466
# VPATH Search Paths
498467

499468
# No `vpath' search paths.
@@ -505,6 +474,6 @@ src/coprocessor.sv:
505474
# strcache size: total = 4096 / max = 4096 / min = 4096 / avg = 4096
506475
# strcache free: total = 4087 / max = 4087 / min = 4087 / avg = 4087
507476

508-
# Finished Make data base on Thu Jul 21 23:21:59 2022
477+
# Finished Make data base on Thu Jul 21 23:44:46 2022
509478

510479

src/coprocessor.sv

Lines changed: 76 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ module coprocessor(
3636

3737
/*verilator lint_off WIDTH*/
3838
always @(posedge clk) begin
39-
register[0] = 0;
39+
if (write_data_enable == 1'b1 || opcode == 6'b001011 || opcode == 6'b110000 || opcode == 6'b110001 || opcode == 6'b110010 ||
40+
opcode == 6'b110011 || opcode == 6'b110100 || opcode == 6'b110101 || opcode == 6'b110110)
41+
register[0] = 0;
4042

4143
if (!cache_done) begin
4244
if (write_data_enable == 1'b1) begin
@@ -49,9 +51,9 @@ module coprocessor(
4951

5052
// add and subtract
5153
else if (opcode[5:1] == 5'b11000) begin
52-
mantisa[0] = {1'b1, register[addr_reg_in2][22:0]}; // store the mantisa and exponent of each operand
54+
mantisa[0] = {1'b1, register[addr_reg_in2][22:0]};
5355
mantisa[1] = {1'b1, register[addr_reg_in1][22:0]};
54-
exponent[0] = register[addr_reg_in2][30:23]; // store the mantisa and exponent of each operand
56+
exponent[0] = register[addr_reg_in2][30:23];
5557
exponent[1] = register[addr_reg_in1][30:23];
5658
sign[0] = register[addr_reg_in2][31];
5759
sign[1] = register[addr_reg_in1][31];
@@ -69,20 +71,36 @@ module coprocessor(
6971
if(exponent[0] > exponent[1]) begin
7072
exponent[2] = exponent[0] - exponent[1];
7173
register[addr_destination][30:23] = exponent[0];
72-
mantisa[1]=(mantisa[1]) >> exponent[2];
74+
75+
for (i = 0; i < exponent[2]; i = i + 1) begin
76+
if (mantisa[1][i])
77+
register[0][3] = 1;
78+
end
79+
80+
mantisa[1] = (mantisa[1]) >> exponent[2];
7381
end else begin
7482
exponent[2] = exponent[1] - exponent[0];
7583
register[addr_destination][30:23] = exponent[1];
84+
85+
for (i = 0; i < exponent[2]; i = i + 1) begin
86+
if (mantisa[0][i])
87+
register[0][3] = 1;
88+
end
89+
7690
mantisa[0] = (mantisa[0]) >> exponent[2];
7791
end
78-
if((opcode[0] == 0 && !(sign[0] ^ sign[1]))
92+
93+
if ((opcode[0] == 0 && !(sign[0] ^ sign[1]))
7994
||(opcode[0] == 1 && (sign[0] ^ sign[1]))) begin
8095
mantisa_sum = mantisa[0] + mantisa[1];
81-
if(mantisa_sum[24] == 0) begin
96+
if (mantisa_sum[24] == 0) begin
8297
register[addr_destination][22:0] = mantisa_sum[22:0];
8398
register[addr_destination][31] = register[addr_reg_in1][31];
8499
end
85100
else begin
101+
if (mantisa_sum[0])
102+
register[0][3] = 1;
103+
86104
mantisa_sum = mantisa_sum >> 1;
87105
register[addr_destination][30:23] = register[addr_destination][30:23] + 1;
88106
register[addr_destination][22:0] = mantisa_sum[22:0];
@@ -95,10 +113,11 @@ module coprocessor(
95113
d2 = mantisa[1];
96114
d2 = ~d2[23:0] +1;
97115
d2[24] = 0;
98-
mantisa_sum = d1 + (d2 + 1) ;
99-
if(mantisa_sum[24] == 1 && mantisa_sum[23:0] == 0) begin
116+
117+
mantisa_sum = d1 + (d2 + 1);
118+
if (mantisa_sum[24] == 1 && mantisa_sum[23:0] == 0)
100119
register[addr_destination] = 0;
101-
end
120+
102121
else begin
103122
if(mantisa_sum[24] == 0) begin
104123
mantisa_sum[23:0] = ~mantisa_sum[23:0] + 1;
@@ -109,7 +128,7 @@ module coprocessor(
109128
register[addr_destination][30:23] = register[addr_destination][30:23] - 1;
110129
end
111130
register[addr_destination][22:0] = mantisa_sum[22:0];
112-
if(mantisa[0] > mantisa[1])
131+
if (mantisa[0] > mantisa[1])
113132
register[addr_destination][31] = sign[0];
114133
else
115134
register[addr_destination][31] = opcode[0] == 0 ? sign[1]:~sign[1];
@@ -120,15 +139,19 @@ module coprocessor(
120139

121140
// multiply
122141
end else if(opcode == 6'b110010) begin
123-
mantisa[0] = {1'b1, register[addr_reg_in2][22:0]}; // store the mantisa and exponent of each operand
142+
mantisa[0] = {1'b1, register[addr_reg_in2][22:0]};
124143
mantisa[1] = {1'b1, register[addr_reg_in1][22:0]};
125-
exponent[0] = register[addr_reg_in2][30:23]; // store the mantisa and exponent of each operand
144+
exponent[0] = register[addr_reg_in2][30:23];
126145
exponent[1] = register[addr_reg_in1][30:23];
127146

128147
if (register[addr_reg_in2] == 0 || register[addr_reg_in1] == 0)
129148
register[addr_destination] = 0;
130149
else begin
131150
mul_ans = 0;
151+
152+
if (exponent[0] + exponent[1] - bias + 1 > 255)
153+
register[0][5] = 1;
154+
132155
register[addr_destination][30:23] = exponent[0] + exponent[1] - bias + 1;
133156
register[addr_destination][31] = register[addr_reg_in2][31] ^ register[addr_reg_in1][31];
134157
mul_ans = mantisa[0] * mantisa[1];
@@ -139,45 +162,56 @@ module coprocessor(
139162
end
140163

141164
register[addr_destination][22:0] = mul_ans[46:24];
165+
166+
if (mul_ans[23:0] != 0)
167+
register[0][3] = 1;
142168
end
143169

144170
// divide
145171
else if(opcode == 6'b110011) begin
146172

147-
mantisa[0] = {1'b1, register[addr_reg_in2][22:0]}; // store the mantisa and exponent of each operand
173+
mantisa[0] = {1'b1, register[addr_reg_in2][22:0]};
148174
mantisa[1] = {1'b1, register[addr_reg_in1][22:0]};
149-
exponent[0] = register[addr_reg_in2][30:23]; // store the mantisa and exponent of each operand
175+
exponent[0] = register[addr_reg_in2][30:23];
150176
exponent[1] = register[addr_reg_in1][30:23];
151177
if (register[addr_reg_in1] == 0)
152178
register[0][0] = 1;
153-
else if(register[addr_reg_in2] == 0)
179+
else if (register[addr_reg_in2] == 0)
154180
register[addr_destination] = 0;
155181
else begin
156182
register[addr_destination][31] = register[addr_reg_in2][31] ^ register[addr_reg_in1][31];
157183

158-
extra = {mantisa[0],24'b0};
159-
extra = extra / mantisa[1];
184+
extra = {mantisa[0], 24'b0};
185+
extra = extra / mantisa[1];
186+
187+
if (extra[24] == 1) begin
188+
if (extra[0])
189+
register[0][3] = 1;
160190

161-
if(extra[24] == 1)
162191
extra = extra >> 1;
163-
else
192+
end else
164193
exponent[0] = exponent[0] - 1;
194+
165195
div_ans = extra[23:0];
196+
197+
if (exponent[0] < exponent[1] - bias)
198+
register[0][4] = 1;
199+
166200
register[addr_destination][30:23] = exponent[0] - exponent[1] + bias;
167201

168-
for (i = 0; i<23 && div_ans[23] != 1 ; i = i + 1 ) begin
202+
for (i = 0; i<23 && div_ans[23] != 1 ; i = i + 1 )
169203
div_ans = div_ans << 1;
170-
end
204+
171205
register[addr_destination][22:0] = div_ans[22:0];
172206
end
173207

174208
end
175209

176210
//compare //cmp
177211
else if(opcode == 6'b110100) begin
178-
mantisa[0] = {1'b1, register[addr_reg_in2][22:0]}; // store the mantisa and exponent of each operand
212+
mantisa[0] = {1'b1, register[addr_reg_in2][22:0]};
179213
mantisa[1] = {1'b1, register[addr_reg_in1][22:0]};
180-
exponent[0] = register[addr_reg_in2][30:23]; // store the mantisa and exponent of each operand
214+
exponent[0] = register[addr_reg_in2][30:23];
181215
exponent[1] = register[addr_reg_in1][30:23];
182216
sign[0] = register[addr_reg_in2][31];
183217
sign[1] = register[addr_reg_in1][31];
@@ -242,12 +276,19 @@ module coprocessor(
242276
extra = {mantisa[0], 24'b0};
243277
extra = extra / mantisa[1];
244278

245-
if(extra[24] == 1)
279+
if(extra[24] == 1) begin
280+
if (extra[0])
281+
register[0][3] = 1;
282+
246283
extra = extra >> 1;
247-
else
284+
end else
248285
exponent[0] = exponent[0] - 1;
249286

250287
div_ans = extra[23:0];
288+
289+
if (exponent[0] < exponent[1] - bias)
290+
register[0][4] = 1;
291+
251292
register[addr_destination][30:23] = exponent[0] - exponent[1] + bias;
252293

253294
for (i = 0; i<23 && div_ans[23] != 1 ; i = i + 1 ) begin
@@ -284,6 +325,16 @@ module coprocessor(
284325
end
285326
end
286327
end
328+
329+
if (write_data_enable == 1'b1 || opcode == 6'b001011 || opcode == 6'b110000 || opcode == 6'b110001 || opcode == 6'b110010 ||
330+
opcode == 6'b110011 || opcode == 6'b110101 || opcode == 6'b110110) begin
331+
if (&register[addr_destination][30:23] == 1 && |register[addr_destination][22:0] != 0) begin
332+
if (register[addr_destination][22])
333+
register[0][1] = 1;
334+
else
335+
register[0][2] = 1;
336+
end
337+
end
287338
end
288339
/*verilator lint_off WIDTH*/
289340
endmodule

0 commit comments

Comments
 (0)