47 lines
1.0 KiB
Coq
47 lines
1.0 KiB
Coq
|
|
`timescale 1ns/1ns
|
||
|
|
|
||
|
|
module sum_test;
|
||
|
|
reg clk;
|
||
|
|
wire [10:0] s;
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
clk = 0;
|
||
|
|
forever #10 clk = ~clk;
|
||
|
|
end
|
||
|
|
|
||
|
|
sum #(5, 8) sum (clk, {8'd10,8'd20,8'd30,8'd40,8'd50}, s);
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
$display("Starting...");
|
||
|
|
repeat (50) @(posedge clk);
|
||
|
|
$display("sum = %d",s);
|
||
|
|
if (s !== 150)
|
||
|
|
$display("FAILED: expected 150, received %0d",s);
|
||
|
|
else
|
||
|
|
$display("PASSED");
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
endmodule
|
||
|
|
|
||
|
|
module sum
|
||
|
|
#(
|
||
|
|
parameter n = 4,
|
||
|
|
parameter width = 8,
|
||
|
|
parameter log_n = $clog2(n)
|
||
|
|
)
|
||
|
|
(
|
||
|
|
input clk,
|
||
|
|
input [n*width-1:0]addends,
|
||
|
|
output reg [log_n+width-1:0] s
|
||
|
|
);
|
||
|
|
|
||
|
|
// This should fail at the first recursion since this is not inside
|
||
|
|
// a generate block.
|
||
|
|
wire [$clog2(n/2)+width-1:0] a1;
|
||
|
|
wire [$clog2(n-n/2)+width-1:0] a2;
|
||
|
|
sum #(n/2, width) s0 (clk, addends[(n/2)*width-1:0], a1);
|
||
|
|
sum #(n-n/2, width) s1 (clk, addends[n*width-1:(n/2)*width], a2);
|
||
|
|
always @(posedge clk) s <= a1 + a2;
|
||
|
|
|
||
|
|
endmodule // sum
|