verilogtestbench实现

verilogtestbench实现,verilog,digital-design,Verilog,Digital Design,我正在尝试实现一个verilog程序,大多数测试用例都通过了(1440个测试用例中有1188个)。然而,我的问题是,我的预期溢出输出当前显示为0,而预期值应为1 下面是两个示例,说明打印到日志中的内容的预期值不正确(一直向右滚动): 我找不到我的实现到底哪里出了问题。所以我想我的问题是,我到底做错了什么?谢谢 以下是我的verilog代码的实现,供参考: module Calculator(in1,in2,opCode,result,overflow); input signed[15:0]

我正在尝试实现一个verilog程序,大多数测试用例都通过了(1440个测试用例中有1188个)。然而,我的问题是,我的预期溢出输出当前显示为0,而预期值应为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
模块计算器(in1、in2、操作码、结果、溢出);
输入符号为[15:0]的in1,in2;
输入[3:0]操作码;
输出reg签名[15:0]结果;
输出寄存器溢出;
始终@(*)开始
如果(操作码==0000)开始
如果(in1+in2=-32768)开始
溢出=0;
结束
其他的
开始
溢出=1;
结束
结束
结束
始终@(*)开始
如果(操作码==0001)开始
如果(in1-in2=-32768)开始
溢出=0;
结束
其他的
开始
溢出=1;
结束
结束
结束
始终@(*)开始
如果(操作码==0010)开始
如果(in1*5=-32768)开始
溢出=0;
结束
其他的
开始
溢出=1;
结束
结束
结束
始终@(*)开始
如果(操作码==0011)开始
如果((in1%10)==0)开始
溢出=0;
结束,否则开始
溢出=1;
结束
结束
结束
始终@(*)开始
如果(操作码==0100)开始
溢出=0;
结束
结束
始终@(*)开始
如果(操作码==0101)开始
溢出=0;
结束
结束
始终@(*)开始
如果(操作码==0110)开始
溢出=0;
结束
结束
始终@(*)开始
如果(操作码==0111)开始
溢出=0;
结束
结束
始终@(*)开始
如果(操作码==1000)开始
如果(in1==32767)开始
溢出=1;
结束
否则开始
溢出=0;
结束
结束
结束
始终@(*)开始
如果(操作码==1001)开始
如果(in1==-32768)开始
溢出=1;
结束
其他的
开始
溢出=0;
结束
结束
结束
始终@(*)开始
案例(操作码)
4'b0000:结果=in1+in2//添加
4'b0001:结果=in1-in2//减去
4'b0010:结果=in1*5//乘5的骡子
4'b0011:结果=1/10//除以10
4'b0100:结果=in1和in2//及
4'b0101:结果=in1^in2//异或
4'b0110:结果=in1 | in2//或
4'b0111:result=/*((2^16)-1)-in1*/((in1))-1//补足
4'b1001:结果=in1-1//减量
4'b1000:结果=in1+1//增量
尾声
结束
端模

重新分配同一变量将导致此类错误。尝试为您的代码添加新的变量/寄存器,您也可以删除“始终@*”(在每种情况下),只需在单个程序中使用“开始…结束”格式。如果你先“开始”然后“结束”,它会工作得很好

您的代码不会合成,因为
溢出
被分配到多个始终块中。它只能分配到一个always块中进行合成。
1001
是十进制的一千零一,
4'b1001
是十进制的二进制
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