【问题标题】:Verilog Calculation Error 8-bit 1's Complement SubtractorVerilog 计算错误 8 位 1 的补码减法器
【发布时间】:2020-09-12 00:05:48
【问题描述】:

我正在编写一个 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,C0,C1,subtractionresult[1]);
onesub U2(A[2],B2,C1,C2,subtractionresult[2]);
onesub U3(A[3],B3,C2,C3,subtractionresult[3]);
onesub U4(A[4],B4,C3,C4,subtractionresult[4]);
onesub U5(A[5],B5,C4,C5,subtractionresult[5]);
onesub U6(A[6],B6,C5,C6,subtractionresult[6]);
onesub U7(A[7],B7,C6,C7,subtractionresult[7]);  

xor (carryoverflow,C6,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,B,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

【问题讨论】:

    标签: for-loop if-statement verilog xor


    【解决方案1】:

    您的测试平台中存在多个错误。

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

    您可能想要A &lt; 255,而不是i &lt; 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 2021-09-09
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      相关资源
      最近更新 更多