iverilog/ivtest/ivltests/multiply_large.v

175 lines
3.2 KiB
Coq
Raw Normal View History

//
// multiply_large.v
//
// Copyright (c) 2001 ajb
//
// This source code is free software; you can redistribute it
// and/or modify it in source code form under the terms of the GNU
// General Public License as published by the Free Software
// Foundation; either version 2 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
//
`define W (65) // any value past 32 will suffice
module multiplier(a,b,sum);
parameter N=1;
input[N-1:0] a, b;
output[N-1:0] sum;
reg [(N-1)*2:0] tmp;
integer i;
always @(a or b)
begin
tmp = 0;
for(i=0;i<N;i=i+1)
begin
if(b[i]) tmp=tmp + ({{N{1'b0}}, a} << i);
end
end
assign sum = tmp[N:0];
endmodule
module multiply_large;
reg [0:`W-1] a, b;
wire [0:`W-1] c, s;
reg [0:`W-1] d;
integer i, j;
reg rc;
assign c=a*b;
multiplier #(`W) mpy(a,b,s);
initial
begin
rc=0;
a={{`W-1{1'b0}}, 1'b1}; // walking 1s
for(i=0;i<`W;i=i+1)
begin
b={{`W-1{1'b0}}, 1'b1};
for(j=0;j<`W;j=j+1)
begin
#1;
d=a*b;
if ((c!=d)||(c!=s))
begin
$display("a=%h b=%h c=%h d=%h s=%h", a,b,c,d,s);
rc=1;
end
b={b[1:`W-1], 1'b0};
end
a={a[1:`W-1], 1'b0};
end
a={{`W-1{1'b1}}, 1'b0}; // walking 0s
for(i=0;i<`W;i=i+1)
begin
b={{`W-1{1'b1}}, 1'b0};
for(j=0;j<`W;j=j+1)
begin
#1;
d=a*b;
if ((c!=d)||(c!=s))
begin
$display("a=%h b=%h c=%h d=%h s=%h", a,b,c,d,s);
rc=1;
end
b={b[1:`W-1], 1'b1};
end
a={a[1:`W-1], 1'b1};
end
a={{`W-2{1'b0}}, 2'b11}; // walking 11s
for(i=0;i<`W;i=i+1)
begin
b={{`W-2{1'b0}}, 2'b11};
for(j=0;j<`W;j=j+1)
begin
#1;
d=a*b;
if ((c!=d)||(c!=s))
begin
$display("a=%h b=%h c=%h d=%h s=%h", a,b,c,d,s);
rc=1;
end
b={b[1:`W-1], 1'b0};
end
a={a[1:`W-1], 1'b0};
end
a={{`W-2{1'b1}}, 2'b00}; // walking 00s
for(i=0;i<`W;i=i+1)
begin
b={{`W-2{1'b1}}, 2'b00};
for(j=0;j<`W;j=j+1)
begin
#1;
d=a*b;
if ((c!=d)||(c!=s))
begin
$display("a=%h b=%h c=%h d=%h s=%h", a,b,c,d,s);
rc=1;
end
b={b[1:`W-1], 1'b1};
end
a={a[1:`W-1], 1'b1};
end
a={{`W-3{1'b0}}, 3'b101}; // walking 101s
for(i=0;i<`W;i=i+1)
begin
b={{`W-3{1'b0}}, 3'b101};
for(j=0;j<`W;j=j+1)
begin
#1;
d=a*b;
if ((c!=d)||(c!=s))
begin
$display("a=%h b=%h c=%h d=%h s=%h", a,b,c,d,s);
rc=1;
end
b={b[1:`W-1], 1'b0};
end
a={a[1:`W-1], 1'b0};
end
a={{`W-3{1'b1}}, 3'b010}; // walking 010s
for(i=0;i<`W;i=i+1)
begin
b={{`W-3{1'b1}}, 3'b010};
for(j=0;j<`W;j=j+1)
begin
#1;
d=a*b;
if ((c!=d)||(c!=s))
begin
$display("a=%h b=%h c=%h d=%h s=%h", a,b,c,d,s);
rc=1;
end
b={b[1:`W-1], 1'b1};
end
a={a[1:`W-1], 1'b1};
end
if (rc) $display("FAILED"); else $display("PASSED");
$finish;
end
endmodule