iverilog/ivtest/ivltests/big_int.v

164 lines
3.5 KiB
Verilog

// Note: when __ICARUS_UNSIZED__ is not defined, this test assumes integers
// are 32 bits wide.
module main();
reg [34:0] my_reg;
reg error;
reg [34:0] ref_val;
reg [34:0] ref_val2;
reg [7:0] count;
initial
begin
error = 0;
// Create reference value that is bigger than 32 bits...
ref_val = 0;
ref_val[0] = 1;
ref_val[34] = 1;
$display("*:%d", ref_val);
ref_val2 = 35'h7ffffffff;
$display("*:%d", ref_val2);
// Trivial test to see that small unsized integers still work.
my_reg = 100;
if (my_reg != 'h64)
begin
error = 1;
$display("Error: expected 100");
end
my_reg = 17179869185;
$display("1:%d", my_reg);
`ifdef __ICARUS_UNSIZED__
// Ordinary compilers will truncate unsized integer
// constants to 32bits. Icarus Verilog is more generous.
if (my_reg !== 35'h4_00000001) begin
error = 1;
$display("Error: expected 17179869185");
end
`else
// Unsized integers bigger than 32 bits are truncated...
// Value below has bit 34 and bit 0 set to '1'
if (my_reg != 1)
begin
error = 1;
$display("Error: expected 1");
end
`endif
// Another unsized integer, but this time 'd specifier...
my_reg = 'd17179869184;
$display("2:%d", my_reg);
`ifdef __ICARUS_UNSIZED__
// Ordinary compilers will truncate unsized integer
// constants to 32bits. Icarus Verilog is more generous.
if (my_reg !== 35'h4_00000000) begin
error = 1;
$display("Error: expected 17179869184");
end
`else
if (my_reg != 0)
begin
error = 1;
$display("Error: expected 1");
end
`endif
// This should finally work!
my_reg = 35'sd17179869185;
$display("3:%d", my_reg);
if (my_reg != ref_val)
begin
error = 1;
$display("Error: expected 17179869185");
end
// This should work too.
my_reg = 35'd 17179869185;
$display("4:%d", my_reg);
if (my_reg != ref_val)
begin
error = 1;
$display("Error: expected 17179869185");
end
// Overflow...
my_reg = 35'd 34359738369;
$display("5:%d", my_reg);
if (my_reg != 1)
begin
error = 1;
$display("Error: expected 1");
end
// Just no overflow
my_reg = 35'd 34359738367;
$display("6:%d", my_reg);
if (my_reg != ref_val2)
begin
error = 1;
$display("Error: expected 34359738367");
end
`ifdef __ICARUS_UNSIZED__
// Since Icarus Verilog doesn't truncate constant values,
// the whole idea of truncating then sign-extending the result
// to go into the wide reg does not apply. So skip this
// test.
`else
// Unsized integers bigger than 32 bits are truncated...
// Here all the bits are set. Since there is no 'd prefix,
// it will be sign extended later on.
my_reg = 17179869183;
$display("7:%d", my_reg);
if (my_reg != ref_val2)
begin
error = 1;
$display("Error: expected 34359738367");
end
`endif
// Unsized integers bigger than 32 bits are truncated...
// Here all the bits are set. Since there *IS* a 'd prefix
// it will NOT be sign extended later on.
my_reg = 'd17179869183;
$display("8:%d", my_reg);
`ifdef __ICARUS_UNSIZED__
if (my_reg != 'd17179869183)
begin
error = 1;
$display("Error: expected 'd17179869183");
end
`else
if (my_reg != 'd4294967295)
begin
error = 1;
$display("Error: expected 4294967295");
end
`endif
if (error==1)
begin
$display("FAILED");
end
else
begin
$display("PASSED");
end
$finish;
end
endmodule