2016-09-08 1 views
-2

빠른 곱셈 알고리즘 프로그램에서이 오류가 발생했습니다. 이 프로그램은 구문 오류가 없으며 LOW DIGIT NUMBERS (a, b < 12)에 대한 올바른 출력을 생성합니다. 내 프로그램에서 a = 123456745678901, b = 098765467845623은 각각 multipicand 및 multiplier입니다. 테스트 벤치도 추가되었습니다.Verilog HDL 프로그램에서 "십진수 상수 123456745678901이 너무 커서 -2089244619를 사용하십시오"라는 오류가 무엇입니까?

`timescale 1ns/1ps 
    module multiply (a,b,s); 
    parameter n=200; 
    input [0:n-1] a,b; 
    output reg [0:2*n-1] s; 
    wire [0:n-1] num0,num1,pow0,pow1; 
    reg [0:n-1] num00,num01; 
numdigits a0(a,num0); // count the number of digits 
numdigits a1(b,num1); // count the number of digits 
powerof2 a2(num0,pow0);// checks the distance between num0 and the next power of 2 
powerof2 a3(num1,pow1);// checks the distance between num1 and the next power of 2 
always @(*) 
begin 
    if(pow0==0&&pow1==0&&num0==num1) 
    begin 
     // 1st type of task 
     split00 (a,b,num0,s); 
    end 
else if (pow0==0&&pow1==0&&num0>num1) 
    begin 
      split00 (a,b,num0,s); 
    end 

else if (pow0==0&&pow1==0&&num0<num1) 
    begin 
      split00 (a,b,num1,s); 
    end 


else if(pow0!=0 || pow1!=0)  
    begin 
     // 1st type of task 
      if(num0>num1) 
      begin 
      num00=num0+pow0; 
      split00 (a,b,num00,s); 
      end 
      else 
      begin 
      num01=num1+pow1; 
      split00(a,b,num01,s); 
      end 
    end 
end 
task automatic split00; 
input [0:n-1] a; 
input [0:n-1] b; 
input [0:n-1] num0; 
output [0:2*n-1] s; 
reg [0:n-1] a0,b0,u0,v0,w0,s0,s1,a1,b1,a2,b2,u1,w1,v1; 
reg [0:n-1] num00,num; 
begin 
    num00=num0; 
    /*if(num00==2) 
     begin 
      u0=(a/10)*(b/10); 
      w0=(a%10)*(b%10); 
      if ((a%10-a/10)<(b%10-b/10)) 
      begin 
      v0=((a%10-a/10)*(b/10-b%10)); 
      s=u0*100+(u0+w0+v0)*10+w0; 
      end 
      if ((a%10-a/10)>(b%10-b/10)) 
      begin 
      v0=(a%10-a/10)*(b%10-b/10); 
      s=u0*100+(u0+w0-v0)*10+w0; 
      end 
      else 
      begin 
      v0=((a%10-a/10)*(b/10-b%10)); 
      s=u0*100+(u0+w0+v0)*10+w0; 
      end 

     end */ 
    if(num00==2) 
     begin 
      u0=((a/10)*(b/10)); 
      w0=((a%10)*(b%10)); 
      if((a%10)<(a/10)) 
       begin 
        v0=(((a/10)-(a%10))*((b%10)-(b/10))); 
        s=((u0*100)+((u0+w0+v0)*10)+w0); 
       end 
      else if((b%10)<(b/10)) 
        begin 
         v0=(((a%10)-(a/10))*((b/10)-(b%10))); 
         s=((u0*100)+((u0+w0+v0)*10)+w0); 
        end 
       else 
        begin 
         v0=(((a%10)-(a/10))*((b%10)-(b/10))); 
         s=((u0*100)+((u0+w0-v0)*10)+w0); 
        end 
     end 

    else 
    begin 
    num=num00/2; 
    a0=a/(10**(num00/2)); 
    a1=a%(10**(num00/2)); 
    b0=b/(10**(num00/2)); 
    b1=b%(10**(num00/2)); 
    split00(a0,b0,num,u1); 
    split00(a1,b1,num,w1); 
    if(a1<a0 && b1>b0) 
     begin 
     a2=a0-a1; 
     b2=b1-b0; 
     split00(a2,b2,num,v1); 
     s=u1*(10**num00)+(u1+v1+w1)*(10**(num00/2))+w1; 
     end 
    else if(a1>a0 && b1<b0) 
     begin 
     a2=a1-a0; 
     b2=b0-b1; 
     split00(a2,b2,num,v1); 
     s=u1*(10**num00)+(u1+v1+w1)*(10**(num00/2))+w1; 
     end 
    else if(a1<a0 && b1<b0) 
     begin 
     a2=a0-a1; 
     b2=b0-b1; 
     split00(a2,b2,num,v1); 
     s=u1*(10**num00)+(u1-v1+w1)*(10**(num00/2))+w1; 
     end 
    else 
     begin 
     a2=a1-a0; 
     b2=b1-b0; 
     split00(a2,b2,num,v1); 
     s=u1*(10**num00)+((u1-v1+w1)*(10**(num00/2)))+w1; 
     end 
    end 
end 
endtask 
endmodule 

/// 테스트 벤치

module karastubatest; 

    // Inputs 
    reg [0:199] a; 
    reg [0:199] b; 

    // Outputs 
    wire [0:399] s; 

    // Instantiate the Unit Under Test (UUT) 
    multiply uut (
     .a(a), 
     .b(b), 
     .s(s) 
    ); 

    initial begin 
     // Initialize Inputs 
     a = 48'd123456745678901; 
     b = 48'd198765467845623; 


     // Wait 100 ns for global reset to finish 
     #100; 

     // Add stimulus here 

    end 

endmodule 
+0

오류 메시지를 생성하는 코드 줄을 표시하지 않습니다. –

답변

0

나는 당신의 질문의 제목에 오류 메시지를 가정 할 것입니다 귀하의 디자인을 자극하는 데 사용되는 테스트 벤치에서입니다 ///. 단순한 숫자의 디폴트 암시 적 크기는 32 비트입니다. 십진수 123456745678901은 적어도 48 비트가 필요하므로 48'd123456745678901으로 작성해야합니다. 200'd123456745678901이 가장 좋습니다.

+0

예 선생님, 테스트 벤치에 오류가 표시되었습니다. 내 오류를 수정했지만 시뮬레이션에서 출력 값 (">")이 있습니다. 왜 그렇게되는거야? –

+0

테스트 벤치를 보여줘야합니다. 결과가 잘리는 다른 장소가있을 수 있습니다. –

+0

선생님, 제 코드를 살펴보십시오. 이제 테스트 벤치가 추가되었습니다. 이 코드는 실제로 Karastuba alogo의 구현입니다. –

0

123456745678901 실제로 48 비트가 필요합니다.

11100000100100010000011011110001010100000110101 

도구 만 가지고 낮은 32 (dave_59에 의해 설명) : 2-보완, 수익률로 해석

10000011011110001010100000110101 

어느 : - 오류 메시지로 2089244619 .

관련 문제