175 lines
3.2 KiB
Coq
175 lines
3.2 KiB
Coq
|
|
//
|
||
|
|
// 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
|