빠른 곱셈 알고리즘 프로그램에서이 오류가 발생했습니다. 이 프로그램은 구문 오류가 없으며 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
오류 메시지를 생성하는 코드 줄을 표시하지 않습니다. –