2016-02-22 3 views
-1

J'essaie de mettre en œuvre un programme verilog et la majorité des cas de test passent (1 188 sur 1440). Ma question cependant est que mon débordement attendu est actuellement affiché à 0 tandis que la valeur attendue est supposée être 1.Mise en œuvre de Verilog Testbench

Deux exemples de ce qui est imprimé dans les journaux avec la valeur attendue étant incorrecte (faites défiler tout le chemin à droite):

in1=1000000000000000 in2=1000000000000000 opCode=1001 result= 0111111111111111 expectedResult= 0111111111111111  overflow=0 expectedOverflow=1 in1=-32768   in2=-32768   opCode= 9 result= 32767   expectedResult= 32767    overflow=0 expectedOverflow=1 

in1=1000000000000000 in2=1000000000000001 opCode=1001 result= 0111111111111111 expectedResult= 0111111111111111  overflow=0 expectedOverflow=1 in1=-32768   in2=-32767   opCode= 9 result= 32767   expectedResult= 32767    overflow=0 expectedOverflow=1 

Je ne peux pas trouver exactement où je me suis trompé avec ma mise en œuvre. Donc je suppose que ma question est, qu'est-ce que j'ai fait de mal? Merci!

Heres une implémentation de mon code Verilog pour référence:

module Calculator(in1,in2,opCode,result,overflow); 

input signed[15:0] in1, in2; 

input[3:0] opCode; 
output reg signed[15:0] result; 
output reg overflow; 

always @ (*) begin 
if(opCode == 0000) begin 
    if(in1+in2<=32767 & in1+in2>= -32768) begin 
     overflow = 0; 
     end 
     else 
     begin 
     overflow = 1; 
     end 
     end 
end 

always @ (*) begin 
    if(opCode == 0001) begin 
    if(in1-in2<=32767 & in1-in2>= -32768) begin 
     overflow = 0; 
     end 
     else 
     begin 
     overflow = 1; 
     end 
     end 
end 

always @ (*) begin 
    if(opCode == 0010) begin 
    if(in1*5<=32767 & in1*5>= -32768) begin 
     overflow = 0; 
     end 
     else 
     begin 
     overflow = 1; 
     end 
     end 
end 

always @ (*) begin 
    if(opCode == 0011) begin 
    if ((in1 % 10) == 0) begin 
    overflow = 0; 
end else begin 
    overflow = 1; 
end 
    end 
end 

always @ (*) begin 
    if(opCode == 0100) begin 
    overflow = 0; 
     end 
end 

always @ (*) begin 
if(opCode == 0101) begin 
    overflow = 0; 
     end 
end 

always @ (*) begin 
    if(opCode == 0110) begin 
    overflow = 0; 
     end 
end 

always @ (*) begin 
    if(opCode == 0111) begin 
    overflow = 0; 
     end 
end 

always @ (*) begin 
    if(opCode == 1000) begin 
    if(in1 == 32767) begin 
     overflow = 1; 
     end 
     else begin 
     overflow = 0; 
     end 
     end 
end 

always @ (*) begin 
    if(opCode == 1001) begin 
    if(in1==-32768) begin 
     overflow = 1; 
     end 
     else 
     begin 
     overflow = 0; 
     end 
     end 
end 

always @ (*) begin 
case(opCode) 
4'b0000: result = in1+in2; //add 
4'b0001: result = in1-in2; //subtract 
4'b0010: result = in1*5; //mult by 5 
4'b0011: result = in1/10; //divide by 10 
4'b0100: result = in1&in2; //AND 
4'b0101: result = in1^in2; //XOR 
4'b0110: result = in1|in2; //OR 
4'b0111: result = /*((2^16)-1)-in1;*/(-(in1))-1; //complement 
4'b1001: result = in1-1; //decrement 
4'b1000: result = in1+1; //increment 
endcase 
end 

endmodule 
+1

Votre code ne synthétisera pas car 'overflow' est affecté dans plusieurs blocs toujours. Il ne peut être affecté que dans un bloc toujours à synthétiser. – Greg

+0

'1001' est décimal mille et un,' 4'b1001' est binaire pour décimal neuf – Greg

Répondre

1

Réaffectation la même variable entraînera de telles erreurs. Essayez d'ajouter de nouvelles variables/registres pour votre code et vous pouvez également supprimer le "always @ *" (dans tous les cas) et utiliser simplement le format "begin. .... End" dans un seul programme. Pourvu que vous "commenciez" initialement et "fin" finalement cela fonctionnera bien.