微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Verilog计算错误8位1的补码减法器

如何解决Verilog计算错误8位1的补码减法器

我正在编写一个8位1的补码减法器,它不使用+或-等字级运算符。

我相信它正在工作(对其他值进行手动测试),但是分配的最后一部分是让测试台迭代所有可能的值并将它们加在一起(256 * 256或65,536个可能的值)(不所有累加的数字都会产生一个非常大的数字,但0 + 1、0 + 2,... 1 + 1、1 + 2等),并与我的其他模块一起检查计算出的值并打印值的数量正确匹配减法器和不正确的值数。

我编写了以下代码,没有任何编译错误,但仍未显示正确或不正确计算的数量。它为我的每个数字显示一个x。

module refonesub (
  output [7:0] subtractionresult,output carryoverflow,input    [7:0] A,input    [7:0] B,input mode 
  );

wire B0; 
wire B1; 
wire B2; 
wire B3; 
wire B4; 
wire B5; 
wire B6; 
wire B7; 

wire C0; 
wire C1; 
wire C2; 
wire C3;
wire C4; 
wire C5; 
wire C6; 
wire C7;  

xor(B0,B[0],mode);
xor(B1,B[1],mode);
xor(B2,B[2],mode);
xor(B3,B[3],mode);
xor(B4,B[4],mode);
xor(B5,B[5],mode);
xor(B6,B[6],mode);
xor(B7,B[7],mode);


onesub U0(A[0],B0,mode,C0,subtractionresult[0]);
onesub U1(A[1],B1,C1,subtractionresult[1]);
onesub U2(A[2],B2,C2,subtractionresult[2]);
onesub U3(A[3],B3,C3,subtractionresult[3]);
onesub U4(A[4],B4,C4,subtractionresult[4]);
onesub U5(A[5],B5,C5,subtractionresult[5]);
onesub U6(A[6],B6,C6,subtractionresult[6]);
onesub U7(A[7],B7,C7,subtractionresult[7]);  

xor (carryoverflow,C7);                

endmodule


module onesub ( A,B,Cin,Cout,S );

output Cout ;
output  S ;           


input A ;
wire A ;
input B ;
wire B ;
input Cin ;
wire Cin ;    

reg Cout;
reg S;

always @(A or B or Cin) begin
    case ({A,Cin})
     0: begin Cout=0; S=0; end
     1: begin Cout=0; S=1; end
     2: begin Cout=0; S=1; end      
     3: begin Cout=1; S=0; end
     4: begin Cout=0; S=1; end
     5: begin Cout=1; S=0; end
     6: begin Cout=1; S=0; end
     7: begin Cout=1; S=1; end
    endcase
    end
endmodule


module testbench;
   
   reg [7:0] A;
   reg [7:0] B;
   reg       mode;
   wire [7:0] subtractionresult;
   reg  [7:0] subtractionresult_expect;
   wire      carryoverflow;
   
   refonesub sub( 
                  .A(A),.B(B),.mode(mode),.subtractionresult(subtractionresult),.carryoverflow(carryoverflow) );

   
    integer    i,j;
    initial begin
        for (A = 0; i < 256; A = A + 1) begin
            for (B = 0; B < 256; B = B + 1) begin
                subtractionresult_expect = A+B;
                if (subtractionresult == subtractionresult_expect) begin
                    i = i + 1;
                end else begin
                    j = j + 1;
                end
            end
        end
        $display("All cases tested; %d correct,%d Failed",i,j);
   end

endmodule

它打印:

All cases tested;           x correct,x Failed

解决方法

测试平台中有多个错误。

您需要初始化i和j(它们默认为x)。

您可能想要A < 255,而不是i < 256

您需要检查255,而不是256。

我在显示屏之前添加了#1,以确保打印出一些东西

initial begin
    i = 0;
    j = 0;
    for (A = 0; A < 255; A = A + 1) begin
        for (B = 0; B < 255; B = B + 1) begin
            subtractionresult_expect = A+B;
            if (subtractionresult == subtractionresult_expect) begin
                i = i + 1;
            end else begin
                j = j + 1;
            end
        end
    end
    #1 $display("All cases tested; %d correct,%d failed",i,j);   
end

我得到了不同的显示,但是可能不是您想要的:

All cases tested;           0 correct,65025 failed

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。