@@ -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*/
289340endmodule
0 commit comments