2016-02-22 72 views
-1

我試圖實現一個verilog程序,大部分測試用例都通過了(1440中的1,188)。然而,我的問題是,我期望的溢出輸出當前顯示爲0,而期望值應該是1.Verilog測試平臺實現

繼承人打印到日誌的兩個示例,期望值不正確(一直滾動向右):

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 

我找不到我確實出錯的地方。所以我想我的問題是,我究竟做錯了什麼?謝謝!

繼承人蔘考我的Verilog代碼的實現:

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

你的代碼不會合成,因爲'overflow'被分配在幾個總是block的地方。它只能被分配在一個總是阻止合成。 – Greg

+0

'1001'是十進制一千和一個,'4'b1001'是二進制的十進制九 – Greg

回答

1

重新分配相同的變量會導致這樣的錯誤。嘗試爲你的代碼添加新的變量/寄存器,你也可以在單個程序中刪除「always @ *」(在任何情況下),並使用「begin ...。end」格式。如果你開始「開始」,最後「結束」,它會正常工作。