359 lines
9.7 KiB
Verilog
359 lines
9.7 KiB
Verilog
// Still need to check real wires and what they return!
|
|
module top;
|
|
// Any unsized negative value will be 32 bits or more!
|
|
parameter pm1 = $clog2(-1);
|
|
parameter prm1 = $clog2(-1.0);
|
|
parameter prm30 = $clog2(-(2**31-1));
|
|
parameter prm31 = $clog2(-(2**31));
|
|
parameter prm32 = $clog2(-(33'sd2**32));
|
|
parameter prm67 = $clog2(-(68'sd2**67));
|
|
parameter p0 = $clog2(0);
|
|
parameter p1 = $clog2(1);
|
|
parameter p2 = $clog2(2);
|
|
parameter p3 = $clog2(3);
|
|
parameter p4 = $clog2(4);
|
|
parameter p5 = $clog2(5);
|
|
parameter p8 = $clog2(8);
|
|
parameter p8r = $clog2(8.49999);
|
|
parameter p128 = $clog2(129'h100000000000000000000000000000000);
|
|
parameter p128p = $clog2(129'sd2**128);
|
|
// These all return 'bx.
|
|
parameter pminf = $clog2(-1.0/0.0); // -Inf
|
|
parameter pinf = $clog2(1.0/0.0); // +Inf
|
|
parameter px = $clog2('bx);
|
|
|
|
reg [$clog2(8)-1:0] reg8 = 'b0;
|
|
|
|
reg pass = 1'b1;
|
|
|
|
integer result;
|
|
|
|
reg [128:0] in;
|
|
wire [7:0] out = $clog2(in);
|
|
|
|
real rin;
|
|
wire [7:0] rout = $clog2(rin);
|
|
|
|
wire real rin2 = rin * 2.0;
|
|
wire [7:0] rout2 = $clog2(rin2);
|
|
|
|
initial begin
|
|
|
|
/* Test the elab_pexpr implementation. */
|
|
|
|
if ($bits(reg8) !== 3) begin
|
|
$display("Failed register size, expected 3, got %d", $bits(reg8));
|
|
pass = 1'b0;
|
|
end
|
|
|
|
if (pm1 !== 32) begin
|
|
$display("Failed with param. -1, expected 32, got %d", pm1);
|
|
pass = 1'b0;
|
|
end
|
|
if (prm1 !== 32) begin
|
|
$display("Failed with param. -1.0, expected 32, got %d", prm1);
|
|
pass = 1'b0;
|
|
end
|
|
if (prm30 !== 32) begin
|
|
$display("Failed with param. -(2**30-1), expected 32, got %d", prm30);
|
|
pass = 1'b0;
|
|
end
|
|
if (prm31 !== 32) begin
|
|
$display("Failed with param. -(2**31), expected 32, got %d", prm31);
|
|
pass = 1'b0;
|
|
end
|
|
if (prm32 !== 32) begin
|
|
$display("Failed with param. -(2**32), expected 32, got %d", prm32);
|
|
pass = 1'b0;
|
|
end
|
|
if (prm67 !== 67) begin
|
|
$display("Failed with param. -(2**67), expected 67, got %d", prm67);
|
|
pass = 1'b0;
|
|
end
|
|
if (p0 !== 0) begin
|
|
$display("Failed with param. 0, expected 0, got %d", p0);
|
|
pass = 1'b0;
|
|
end
|
|
if (p1 !== 0) begin
|
|
$display("Failed with param. 1, expected 0, got %d", p1);
|
|
pass = 1'b0;
|
|
end
|
|
if (p2 !== 1) begin
|
|
$display("Failed with param. 2, expected 1, got %d", p2);
|
|
pass = 1'b0;
|
|
end
|
|
if (p3 !== 2) begin
|
|
$display("Failed with param. 3, expected 2, got %d", p3);
|
|
pass = 1'b0;
|
|
end
|
|
if (p4 !== 2) begin
|
|
$display("Failed with param. 4, expected 2, got %d", p4);
|
|
pass = 1'b0;
|
|
end
|
|
if (p5 !== 3) begin
|
|
$display("Failed with param. 5, expected 3, got %d", p5);
|
|
pass = 1'b0;
|
|
end
|
|
if (p8 !== 3) begin
|
|
$display("Failed with param. 8, expected 3, got %d", p8);
|
|
pass = 1'b0;
|
|
end
|
|
if (p8r !== 3) begin
|
|
$display("Failed with param. 8 (real), expected 3, got %d", p8r);
|
|
pass = 1'b0;
|
|
end
|
|
if (p128 !== 128) begin
|
|
$display("Failed with param. 129'h10...0, expected 128, got %d", p128);
|
|
pass = 1'b0;
|
|
end
|
|
if (p128p !== 128) begin
|
|
$display("Failed with param. 2**128, expected 128, got %d", p128p);
|
|
pass = 1'b0;
|
|
end
|
|
if (pinf !== 32'bx) begin
|
|
$display("Failed with param. Inf, expected 32'bx, got %b", pinf);
|
|
pass = 1'b0;
|
|
end
|
|
if (pminf !== 32'bx) begin
|
|
$display("Failed with param. -Inf, expected 32'bx, got %b", pminf);
|
|
pass = 1'b0;
|
|
end
|
|
if (px !== 32'bx) begin
|
|
$display("Failed with param. `bx, expected 32'bx, got %b", px);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
/* Test the eval_tree implementation. */
|
|
|
|
// Any unsized negative value will be 32 bits or more!
|
|
result = $clog2(-1);
|
|
if (result !== 32) begin
|
|
$display("Failed with -1, expected 32, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(-1.0);
|
|
if (result !== 32) begin
|
|
$display("Failed with -1.0, expected 32, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(-(2**31));
|
|
if (result !== 32) begin
|
|
$display("Failed with -(2**31), expected 32, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(-(33'sd2**32));
|
|
if (result !== 32) begin
|
|
$display("Failed with -(2**32), expected 32, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(-(68'sd2**67));
|
|
if (result !== 67) begin
|
|
$display("Failed with -(2**67), expected 67, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(0);
|
|
if (result !== 0) begin
|
|
$display("Failed with 0, expected 0, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
result = $clog2(1);
|
|
if (result !== 0) begin
|
|
$display("Failed with 1, expected 0, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(2);
|
|
if (result !== 1) begin
|
|
$display("Failed with 2, expected 1, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(3);
|
|
if (result !== 2) begin
|
|
$display("Failed with 3, expected 2, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
result = $clog2(4);
|
|
if (result !== 2) begin
|
|
$display("Failed with 4, expected 2, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(5);
|
|
if (result !== 3) begin
|
|
$display("Failed with 5, expected 3, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
result = $clog2(8);
|
|
if (result !== 3) begin
|
|
$display("Failed with 8, expected 3, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
result = $clog2(8.1);
|
|
if (result !== 3) begin
|
|
$display("Failed with 8.1, expected 3, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
result = $clog2(8.49999);
|
|
if (result !== 3) begin
|
|
$display("Failed with 8.49999, expected 3, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
result = $clog2(8.5);
|
|
if (result !== 4) begin
|
|
$display("Failed with 8.5, expected 4, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(129'h100000000000000000000000000000000);
|
|
if (result !== 128) begin
|
|
$display("Failed with 129'h10...0, expected 128, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(129'sd2**128);
|
|
if (result !== 128) begin
|
|
$display("Failed with 2**128, expected 128, got %d", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(1.0/0.0); // Inf
|
|
if (result !== 32'bx) begin
|
|
$display("Failed with Inf, expected 32'bx, got %b", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2(-1.0/0.0); // -Inf
|
|
if (result !== 32'bx) begin
|
|
$display("Failed with -Inf, expected 32'bx, got %b", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
result = $clog2('bx);
|
|
if (result !== 32'bx) begin
|
|
$display("Failed with `bx, expected 32'bx, got %b", result);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
/* Test the CA statements and the vpi implementation. */
|
|
|
|
in = -1; // This is not an unsized value ('in' is 129 bits)!
|
|
#1 if (out != 129) begin
|
|
$display("Failed CA with -1, expected 129, got %d", out);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
in = 0;
|
|
#1 if (out !== 0) begin
|
|
$display("Failed CA with 0, expected 0, got %d", out);
|
|
pass = 1'b0;
|
|
end
|
|
in = 1;
|
|
#1 if (out !== 0) begin
|
|
$display("Failed CA with 1, expected 0, got %d", out);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
in = 2;
|
|
#1 if (out !== 1) begin
|
|
$display("Failed CA with 2, expected 1, got %d", out);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
in = 3;
|
|
#1 if (out !== 2) begin
|
|
$display("Failed CA with 3, expected 2, got %d", out);
|
|
pass = 1'b0;
|
|
end
|
|
in = 4;
|
|
#1 if (out !== 2) begin
|
|
$display("Failed CA with 4, expected 2, got %d", out);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
in = 5;
|
|
#1 if (out !== 3) begin
|
|
$display("Failed CA with 5, expected 3, got %d", out);
|
|
pass = 1'b0;
|
|
end
|
|
in = 8;
|
|
#1 if (out !== 3) begin
|
|
$display("Failed CA with 8, expected 3, got %d", out);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
rin = -1.0; // This is an unsized value (reals are unsized)!
|
|
#1 if (rout !== 32 && rout2 !== 32) begin
|
|
$display("Failed CA with -1.0, expected 32/32, got %d/%d", rout, rout2);
|
|
pass = 1'b0;
|
|
end
|
|
rin = 8.1;
|
|
#1 if (rout !== 3 && rout2 !== 4) begin
|
|
$display("Failed CA with 8.1, expected 3/4, got %d/%d", rout, rout2);
|
|
pass = 1'b0;
|
|
end
|
|
rin = 8.49999;
|
|
#1 if (rout !== 3 && rout2 !== 4) begin
|
|
$display("Failed CA with 8.49999, expected 3/4, got %d/%d", rout, rout2);
|
|
pass = 1'b0;
|
|
end
|
|
rin = 8.5;
|
|
#1 if (rout !== 4 && rout2 !== 5) begin
|
|
$display("Failed CA with 8.5, expected 4/5, got %d/%d", rout, rout2);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
in = 129'h100000000000000000000000000000000;
|
|
#1 if (out !== 128) begin
|
|
$display("Failed CA with 129'h10...0, expected 128, got %d", out);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
in = 2**128;
|
|
#1 if (out !== 128) begin
|
|
$display("Failed CA with 2**128, expected 128, got %d", out);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
in = 'bx;
|
|
#1 if (out !== 8'bx) begin
|
|
$display("Failed CA with 'bx, expected 8'bx, got %b", out);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
rin = 1.0/0.0;
|
|
#1 if (rout !== 8'bx && rout2 !== 8'bx) begin
|
|
$display("Failed CA with Inf, expected 8'bx/8'bx got %b/%b", rout, rout2);
|
|
pass = 1'b0;
|
|
end
|
|
rin = -1.0/0.0;
|
|
#1 if (rout !== 8'bx && rout2 !== 8'bx) begin
|
|
$display("Failed CA with -Inf, expected 8'bx/8'bx got %b/%b", rout, rout2);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
/* Check that the result is sign extended correctly. */
|
|
// Compile time generated.
|
|
in = $clog2(1.0/0.0);
|
|
if (in !== 129'bx) begin
|
|
$display("Failed sign extended Inf (C), expected 129'bx got %b", in);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
// Run time generated.
|
|
rin = 1.0;
|
|
in = $clog2(rin/0.0);
|
|
if (in !== 129'bx) begin
|
|
$display("Failed sign extended Inf (RT), expected 129'bx got %b", in);
|
|
pass = 1'b0;
|
|
end
|
|
|
|
if (pass) $display("PASSED");
|
|
end
|
|
endmodule
|