iverilog/ivtest/ivltests/scanf4.v

1319 lines
39 KiB
Verilog

`timescale 1ns/10ps
module top;
reg pass;
reg [80*8:1] str;
reg [63:0] a, b, c;
real r;
integer code;
initial begin
pass = 1'b1;
// Check that a failing match stops the matching process.
str = "2 3";
code = $sscanf(str, "%b%d", a, b);
if (code !== 0) begin
$display("FAILED(mb) to stop matching found %d", code);
pass = 1'b0;
end
str = "8 3";
code = $sscanf(str, "%o%d", a, b);
if (code !== 0) begin
$display("FAILED(mo) to stop matching found %d", code);
pass = 1'b0;
end
str = "g 3";
code = $sscanf(str, "%h%d", a, b);
if (code !== 0) begin
$display("FAILED(mh) to stop matching found %d", code);
pass = 1'b0;
end
str = "g 3";
code = $sscanf(str, "%x%d", a, b);
if (code !== 0) begin
$display("FAILED(mx) to stop matching found %d", code);
pass = 1'b0;
end
str = "a 3";
code = $sscanf(str, "%d%d", a, b);
if (code !== 0) begin
$display("FAILED(md) to stop matching found %d", code);
pass = 1'b0;
end
// Check parsing all the binary values (%b).
str = "01_?xzXZ";
code = $sscanf(str, "%b", a);
if (code !== 1) begin
$display("FAILED(b) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 'b01xxzxz) begin
$display("FAILED(b) argument value, expected 01xxzxz, got %b", a);
pass = 1'b0;
end
// Check that a leaading underscore is invalid.
a = 'bx;
str = "_01_?xzXZ";
code = $sscanf(str, "%b", a);
if (code !== 0) begin
$display("FAILED(bi) to parse zero argument found %d", code);
pass = 1'b0;
end
if (a !== 'bx) begin
$display("FAILED(bi) argument value, expected x, got %b", a);
pass = 1'b0;
end
// Check parsing all the octal values (%o).
str = "01234567_xzXZ?";
code = $sscanf(str, "%o", a);
if (code !== 1) begin
$display("FAILED(o) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 64'o01234567xzxzx) begin
$display("FAILED(o) argument value, expected 01234567xzxzx, got %o", a);
pass = 1'b0;
end
// Check that a leaading underscore is invalid.
a = 'bx;
str = "_01234567_xzXZ?";
code = $sscanf(str, "%o", a);
if (code !== 0) begin
$display("FAILED(oi) to parse zero argument found %d", code);
pass = 1'b0;
end
if (a !== 'ox) begin
$display("FAILED(oi) argument value, expected x, got %o", a);
pass = 1'b0;
end
// Check parsing all the decimal values (%d).
str = "+01234_56789";
code = $sscanf(str, "%d", a);
if (code !== 1) begin
$display("FAILED(d1) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 'd0123456789) begin
$display("FAILED(d1) argument value, expected 0123456789, got %d", a);
pass = 1'b0;
end
str = "01234_56789";
code = $sscanf(str, "%d", a);
if (code !== 1) begin
$display("FAILED(d2) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 'd0123456789) begin
$display("FAILED(d2) argument value, expected 0123456789, got %d", a);
pass = 1'b0;
end
str = "-01234_56789";
code = $sscanf(str, "%d", a);
if (code !== 1) begin
$display("FAILED(d3) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== -'d0123456789) begin
$display("FAILED(d3) argument value, expected -0123456789, got %d", a);
pass = 1'b0;
end
str = "x";
code = $sscanf(str, "%d", a);
if (code !== 1) begin
$display("FAILED(d4) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 'dx) begin
$display("FAILED(d4) argument value, expected x, got %d", a);
pass = 1'b0;
end
str = "X";
code = $sscanf(str, "%d", a);
if (code !== 1) begin
$display("FAILED(d5) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 'dx) begin
$display("FAILED(d5) argument value, expected x, got %d", a);
pass = 1'b0;
end
str = "z";
code = $sscanf(str, "%d", a);
if (code !== 1) begin
$display("FAILED(d6) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 'dz) begin
$display("FAILED(d6) argument value, expected z, got %d", a);
pass = 1'b0;
end
str = "Z";
code = $sscanf(str, "%d", a);
if (code !== 1) begin
$display("FAILED(d7) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 'dz) begin
$display("FAILED(d7) argument value, expected z, got %d", a);
pass = 1'b0;
end
str = "?";
code = $sscanf(str, "%d", a);
if (code !== 1) begin
$display("FAILED(d8) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 'dx) begin
$display("FAILED(d8) argument value, expected x, got %d", a);
pass = 1'b0;
end
// A plus or minus must have a digit after to match.
a = 'bx;
str = "-q";
code = $sscanf(str, "%d", a);
if (code !== 0) begin
$display("FAILED(d9) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (a !== 'dx) begin
$display("FAILED(d9) argument value, expected x, got %d", a);
pass = 1'b0;
end
a = 'bx;
str = "+q";
code = $sscanf(str, "%d", a);
if (code !== 0) begin
$display("FAILED(d0) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (a !== 'dx) begin
$display("FAILED(d0) argument value, expected x, got %d", a);
pass = 1'b0;
end
// Check that a leaading underscore is invalid.
a = 'dx;
str = "_01234_56789";
code = $sscanf(str, "%d", a);
if (code !== 0) begin
$display("FAILED(di) to parse zero argument found %d", code);
pass = 1'b0;
end
if (a !== 'dx) begin
$display("FAILED(di) argument value, expected x, got %d", a);
pass = 1'b0;
end
// Check parsing all the hex values (both %h and %x).
str = "0123456789_xzXZ?";
code = $sscanf(str, "%h", a);
if (code !== 1) begin
$display("FAILED(h1) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 64'h0123456789xzxzx) begin
$display("FAILED(h1) argument value, expected 0123456789xzxzx, got %h", a);
pass = 1'b0;
end
str = "aA_bB_cC_dD_eE_fF";
code = $sscanf(str, "%h", a);
if (code !== 1) begin
$display("FAILED(h2) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 64'haabbccddeeff) begin
$display("FAILED(h2) argument value, expected aabbccddeeff, got %h", a);
pass = 1'b0;
end
str = "0123456789_xzXZ?";
code = $sscanf(str, "%x", a);
if (code !== 1) begin
$display("FAILED(h3) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 64'h0123456789xzxzx) begin
$display("FAILED(h3) argument value, expected 0123456789xzxzx, got %h", a);
pass = 1'b0;
end
str = "aA_bB_cC_dD_eE_fF";
code = $sscanf(str, "%x", a);
if (code !== 1) begin
$display("FAILED(h4) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 64'haabbccddeeff) begin
$display("FAILED(h4) argument value, expected aabbccddeeff, got %h", a);
pass = 1'b0;
end
// Check that a leaading underscore is invalid.
a = 'dx;
str = "_0123456789_xzXZ?";
code = $sscanf(str, "%h", a);
if (code !== 0) begin
$display("FAILED(hi) to parse zero argument found %d", code);
pass = 1'b0;
end
if (a !== 'hx) begin
$display("FAILED(hi) argument value, expected x, got %h", a);
pass = 1'b0;
end
// Check parsing real values %f.
str = "+0123456789";
code = $sscanf(str, "%f", r);
if (code !== 1) begin
$display("FAILED(f1) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 123456789.0) begin
$display("FAILED(f1) argument value, expected 123456789.0, got %f", r);
pass = 1'b0;
end
str = "0123456789";
code = $sscanf(str, "%f", r);
if (code !== 1) begin
$display("FAILED(f2) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 123456789.0) begin
$display("FAILED(f2) argument value, expected 123456789.0, got %f", r);
pass = 1'b0;
end
str = "-0123456789";
code = $sscanf(str, "%f", r);
if (code !== 1) begin
$display("FAILED(f3) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != -123456789.0) begin
$display("FAILED(f3) argument value, expected -123456789.0, got %f", r);
pass = 1'b0;
end
// A plus or minus must have a digit after to match.
r = 1.0;
str = "-q";
code = $sscanf(str, "%f", r);
if (code !== 0) begin
$display("FAILED(f4) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(f4) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "+q";
code = $sscanf(str, "%f", r);
if (code !== 0) begin
$display("FAILED(f5) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(f5) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "q";
code = $sscanf(str, "%f", r);
if (code !== 0) begin
$display("FAILED(f6) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(f6) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
// Check starting/trailing decimal point.
str = "2.";
code = $sscanf(str, "%f", r);
if (code !== 1) begin
$display("FAILED(f7) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 2.0) begin
$display("FAILED(f7) argument value, expected 2.0, got %f", r);
pass = 1'b0;
end
str = ".2";
code = $sscanf(str, "%f", r);
if (code !== 1) begin
$display("FAILED(f8) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 0.2) begin
$display("FAILED(f8) argument value, expected 0.2, got %f", r);
pass = 1'b0;
end
// Check with an exponent.
str = "2.e1";
code = $sscanf(str, "%f", r);
if (code !== 1) begin
$display("FAILED(f9) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 20.0) begin
$display("FAILED(f9) argument value, expected 20.0, got %f", r);
pass = 1'b0;
end
str = "2.e-1";
code = $sscanf(str, "%f", r);
if (code !== 1) begin
$display("FAILED(f10) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 0.2) begin
$display("FAILED(f10) argument value, expected 0.2, got %f", r);
pass = 1'b0;
end
// Check failing exponent cases.
r = 1.0;
str = "2.ea";
code = $sscanf(str, "%f", r);
if (code !== 0) begin
$display("FAILED(f11) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(f11) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "2.e+a";
code = $sscanf(str, "%f", r);
if (code !== 0) begin
$display("FAILED(f12) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(f12) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "2.e-a";
code = $sscanf(str, "%f", r);
if (code !== 0) begin
$display("FAILED(f13) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(f13) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
str = "1e5000";
code = $sscanf(str, "%f", r);
if (code !== 1) begin
$display("FAILED(f14) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0/0.0) begin
$display("FAILED(f14) argument value, expected inf, got %f", r);
pass = 1'b0;
end
str = "-1e5000";
code = $sscanf(str, "%f", r);
if (code !== 1) begin
$display("FAILED(f14) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != -1.0/0.0) begin
$display("FAILED(f14) argument value, expected -inf, got %f", r);
pass = 1'b0;
end
// Check parsing real values %e.
str = "+0123456789";
code = $sscanf(str, "%e", r);
if (code !== 1) begin
$display("FAILED(e1) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 123456789.0) begin
$display("FAILED(e1) argument value, expected 123456789.0, got %f", r);
pass = 1'b0;
end
str = "0123456789";
code = $sscanf(str, "%e", r);
if (code !== 1) begin
$display("FAILED(e2) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 123456789.0) begin
$display("FAILED(e2) argument value, expected 123456789.0, got %f", r);
pass = 1'b0;
end
str = "-0123456789";
code = $sscanf(str, "%e", r);
if (code !== 1) begin
$display("FAILED(e3) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != -123456789.0) begin
$display("FAILED(e3) argument value, expected -123456789.0, got %f", r);
pass = 1'b0;
end
// A plus or minus must have a digit after to match.
r = 1.0;
str = "-q";
code = $sscanf(str, "%e", r);
if (code !== 0) begin
$display("FAILED(e4) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(e4) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "+q";
code = $sscanf(str, "%e", r);
if (code !== 0) begin
$display("FAILED(e5) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(e5) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "q";
code = $sscanf(str, "%e", r);
if (code !== 0) begin
$display("FAILED(e6) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(e6) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
// Check starting/trailing decimal point.
str = "2.";
code = $sscanf(str, "%e", r);
if (code !== 1) begin
$display("FAILED(e7) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 2.0) begin
$display("FAILED(e7) argument value, expected 2.0, got %f", r);
pass = 1'b0;
end
str = ".2";
code = $sscanf(str, "%e", r);
if (code !== 1) begin
$display("FAILED(e8) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 0.2) begin
$display("FAILED(e8) argument value, expected 0.2, got %f", r);
pass = 1'b0;
end
// Check with an exponent.
str = "2.e1";
code = $sscanf(str, "%e", r);
if (code !== 1) begin
$display("FAILED(e9) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 20.0) begin
$display("FAILED(e9) argument value, expected 20.0, got %f", r);
pass = 1'b0;
end
str = "2.e-1";
code = $sscanf(str, "%e", r);
if (code !== 1) begin
$display("FAILED(e10) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 0.2) begin
$display("FAILED(e10) argument value, expected 0.2, got %f", r);
pass = 1'b0;
end
// Check failing exponent cases.
r = 1.0;
str = "2.ea";
code = $sscanf(str, "%e", r);
if (code !== 0) begin
$display("FAILED(e11) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(e11) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "2.e+a";
code = $sscanf(str, "%e", r);
if (code !== 0) begin
$display("FAILED(e12) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(e12) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "2.e-a";
code = $sscanf(str, "%e", r);
if (code !== 0) begin
$display("FAILED(e13) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(e13) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
str = "1e5000";
code = $sscanf(str, "%e", r);
if (code !== 1) begin
$display("FAILED(e14) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0/0.0) begin
$display("FAILED(e14) argument value, expected inf, got %f", r);
pass = 1'b0;
end
str = "-1e5000";
code = $sscanf(str, "%e", r);
if (code !== 1) begin
$display("FAILED(e14) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != -1.0/0.0) begin
$display("FAILED(e14) argument value, expected -inf, got %f", r);
pass = 1'b0;
end
// Check parsing real values %g.
str = "+0123456789";
code = $sscanf(str, "%g", r);
if (code !== 1) begin
$display("FAILED(g1) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 123456789.0) begin
$display("FAILED(g1) argument value, expected 123456789.0, got %f", r);
pass = 1'b0;
end
str = "0123456789";
code = $sscanf(str, "%g", r);
if (code !== 1) begin
$display("FAILED(g2) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 123456789.0) begin
$display("FAILED(g2) argument value, expected 123456789.0, got %f", r);
pass = 1'b0;
end
str = "-0123456789";
code = $sscanf(str, "%g", r);
if (code !== 1) begin
$display("FAILED(g3) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != -123456789.0) begin
$display("FAILED(g3) argument value, expected -123456789.0, got %f", r);
pass = 1'b0;
end
// A plus or minus must have a digit after to match.
r = 1.0;
str = "-q";
code = $sscanf(str, "%g", r);
if (code !== 0) begin
$display("FAILED(g4) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(g4) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "+q";
code = $sscanf(str, "%g", r);
if (code !== 0) begin
$display("FAILED(g5) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(g5) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "q";
code = $sscanf(str, "%g", r);
if (code !== 0) begin
$display("FAILED(g6) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(g6) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
// Check starting/trailing decimal point.
str = "2.";
code = $sscanf(str, "%g", r);
if (code !== 1) begin
$display("FAILED(g7) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 2.0) begin
$display("FAILED(g7) argument value, expected 2.0, got %f", r);
pass = 1'b0;
end
str = ".2";
code = $sscanf(str, "%g", r);
if (code !== 1) begin
$display("FAILED(g8) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 0.2) begin
$display("FAILED(g8) argument value, expected 0.2, got %f", r);
pass = 1'b0;
end
// Check with an exponent.
str = "2.e1";
code = $sscanf(str, "%g", r);
if (code !== 1) begin
$display("FAILED(g9) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 20.0) begin
$display("FAILED(g9) argument value, expected 20.0, got %f", r);
pass = 1'b0;
end
str = "2.e-1";
code = $sscanf(str, "%g", r);
if (code !== 1) begin
$display("FAILED(g10) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 0.2) begin
$display("FAILED(g10) argument value, expected 0.2, got %f", r);
pass = 1'b0;
end
// Check failing exponent cases.
r = 1.0;
str = "2.ea";
code = $sscanf(str, "%g", r);
if (code !== 0) begin
$display("FAILED(g11) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(g11) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "2.e+a";
code = $sscanf(str, "%g", r);
if (code !== 0) begin
$display("FAILED(g12) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(g12) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
r = 1.0;
str = "2.e-a";
code = $sscanf(str, "%g", r);
if (code !== 0) begin
$display("FAILED(g13) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0) begin
$display("FAILED(g13) argument value, expected 1.0, got %f", r);
pass = 1'b0;
end
str = "1e5000";
code = $sscanf(str, "%g", r);
if (code !== 1) begin
$display("FAILED(g14) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != 1.0/0.0) begin
$display("FAILED(g14) argument value, expected inf, got %f", r);
pass = 1'b0;
end
str = "-1e5000";
code = $sscanf(str, "%g", r);
if (code !== 1) begin
$display("FAILED(g14) to parse one arguments found %d", code);
pass = 1'b0;
end
if (r != -1.0/0.0) begin
$display("FAILED(g14) argument value, expected -inf, got %f", r);
pass = 1'b0;
end
// Check parsing time values (%t).
// The %t format uses the real code to parse the number so all the
// corner cases are tested above.
str = "+012345678925";
code = $sscanf(str, "%t", r);
if (code !== 1) begin
$display("FAILED(t1) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 123456789.25) begin
$display("FAILED(t1) argument value, expected 123456789.25, got %f", r);
pass = 1'b0;
end
str = "012345678925";
code = $sscanf(str, "%t", r);
if (code !== 1) begin
$display("FAILED(t2) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 123456789.25) begin
$display("FAILED(t2) argument value, expected 123456789.25, got %f", r);
pass = 1'b0;
end
str = "-012345678925";
code = $sscanf(str, "%t", r);
if (code !== 1) begin
$display("FAILED(t3) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != -123456789.25) begin
$display("FAILED(t3) argument value, expected -123456789.25, got %f", r);
pass = 1'b0;
end
// Check using different scaling and rounding.
$timeformat(-9, 3, "ns", 20);
str = "10.125";
code = $sscanf(str, "%t", r);
if (code !== 1) begin
$display("FAILED(t4) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 10.125) begin
$display("FAILED(t4) argument value, expected 10.125, got %f", r);
pass = 1'b0;
end
str = "10.0625";
code = $sscanf(str, "%t", r);
if (code !== 1) begin
$display("FAILED(t5) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 10.063) begin
$display("FAILED(t5) argument value, expected 10.063, got %f", r);
pass = 1'b0;
end
str = "10.03125";
code = $sscanf(str, "%t", r);
if (code !== 1) begin
$display("FAILED(t6) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 10.031) begin
$display("FAILED(t6) argument value, expected 10.031, got %f", r);
pass = 1'b0;
end
$timeformat(-9, 1, "ns", 20);
str = "10.543";
code = $sscanf(str, "%t", r);
if (code !== 1) begin
$display("FAILED(t7) to parse one argument found %d", code);
pass = 1'b0;
end
if (r != 10.5) begin
$display("FAILED(t7) argument value, expected 10.5, got %f", r);
pass = 1'b0;
end
// Check parsing a single character (%c).
str = "t";
code = $sscanf(str, "%c", a);
if (code !== 1) begin
$display("FAILED(c) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== 116) begin // t has an ASCII code of 116
$display("FAILED(c) argument value, expected t, got %c", a);
pass = 1'b0;
end
// Check parsing a string value (%s).
str = "hi ho";
code = $sscanf(str, "%s %s", a, b);
if (code !== 2) begin
$display("FAILED(s) to parse two arguments found %d", code);
pass = 1'b0;
end
if (a !== "hi") begin
$display("FAILED(s) first argument value, expected hi, got %s", a);
pass = 1'b0;
end
if (b !== "ho") begin
$display("FAILED(s) second argument value, expected ho, got %s", b);
pass = 1'b0;
end
// Check an empty %s match.
a = "skip";
str = " ";
code = $sscanf(str, "%s", a);
if (code !== 0) begin
$display("FAILED(ep) to parse zero arguments found %d", code);
pass = 1'b0;
end
if (a !== "skip") begin
$display("FAILED(ep) first argument value, expected skip, got %s", a);
pass = 1'b0;
end
// Check an empty %s second match.
b = "skip";
str = "one ";
code = $sscanf(str, "%s %s", a, b);
if (code !== 1) begin
$display("FAILED(es) to parse one arguments found %d", code);
pass = 1'b0;
end
if (a !== "one") begin
$display("FAILED(es) first argument value, expected one, got %s", a);
pass = 1'b0;
end
if (b !== "skip") begin
$display("FAILED(es) second argument value, expected skip, got %s", a);
pass = 1'b0;
end
// Check parsing 2 state unformatted binary values (%u).
// Check parsing 4 state unformatted binary values (%z).
// Check geting the current module (%m).
code = $sscanf(" ", "%m", a);
if (code !== 1) begin
$display("FAILED(m) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== "top") begin
$display("FAILED(m) first argument value, expected top, got %s", a);
pass = 1'b0;
end
// Check a string using a width.
str = "helloworld";
code = $sscanf(str, "%5s %s", a, b);
if (code !== 2) begin
$display("FAILED(sw) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== "hello") begin
$display("FAILED(sw) first argument value, expected hello, got %s", a);
pass = 1'b0;
end
if (b !== "world") begin
$display("FAILED(sw) second argument value, expected world, got %s", b);
pass = 1'b0;
end
// Check a binary using a width.
str = "01101001";
code = $sscanf(str, "%4b %b", a, b);
if (code !== 2) begin
$display("FAILED(bw) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'b0110) begin
$display("FAILED(bw) first argument value, expected 'b0110, got %b", a);
pass = 1'b0;
end
if (b !== 'b1001) begin
$display("FAILED(bw) second argument value, expected 'b1001, got %b", b);
pass = 1'b0;
end
// Check an octal using a width.
str = "234567";
code = $sscanf(str, "%3o %o", a, b);
if (code !== 2) begin
$display("FAILED(ow) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'o234) begin
$display("FAILED(ow) first argument value, expected 'o234, got %o", a);
pass = 1'b0;
end
if (b !== 'o567) begin
$display("FAILED(ow) second argument value, expected 'o567, got %o", b);
pass = 1'b0;
end
// Check a hex using a width.
str = "89abcdef";
code = $sscanf(str, "%4h %h", a, b);
if (code !== 2) begin
$display("FAILED(hw) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'h89ab) begin
$display("FAILED(hw) first argument value, expected 'h89ab, got %h", a);
pass = 1'b0;
end
if (b !== 'hcdef) begin
$display("FAILED(hw) second argument value, expected 'hcdef, got %h", b);
pass = 1'b0;
end
// Check a decimal using a width.
str = "23456789";
code = $sscanf(str, "%4d %d", a, b);
if (code !== 2) begin
$display("FAILED(dw) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'd2345) begin
$display("FAILED(dw) first argument value, expected 'd2345, got %d", a);
pass = 1'b0;
end
if (b !== 'd6789) begin
$display("FAILED(dw) second argument value, expected 'd6789, got %d", b);
pass = 1'b0;
end
// Check a real using a width.
str = "-2.2566789";
code = $sscanf(str, "%6f %d", r, a);
if (code !== 2) begin
$display("FAILED(fw1) to parse two argument found %d", code);
pass = 1'b0;
end
if (r != -2.256) begin
$display("FAILED(fw1) first argument value, expected 2.256, got %f", r);
pass = 1'b0;
end
if (a !== 'd6789) begin
$display("FAILED(fw1) second argument value, expected 'd6789, got %d", a);
pass = 1'b0;
end
str = "+2.e+16789";
code = $sscanf(str, "%6f %d", r, a);
if (code !== 2) begin
$display("FAILED(fw2) to parse two argument found %d", code);
pass = 1'b0;
end
if (r != 20.0) begin
$display("FAILED(fw2) first argument value, expected 20.0, got %f", r);
pass = 1'b0;
end
if (a !== 'd6789) begin
$display("FAILED(fw2) second argument value, expected 'd6789, got %d", a);
pass = 1'b0;
end
str = "-2.2566789";
code = $sscanf(str, "%6e %d", r, a);
if (code !== 2) begin
$display("FAILED(ew1) to parse two argument found %d", code);
pass = 1'b0;
end
if (r != -2.256) begin
$display("FAILED(ew1) first argument value, expected 2.256, got %f", r);
pass = 1'b0;
end
if (a !== 'd6789) begin
$display("FAILED(ew1) second argument value, expected 'd6789, got %d", a);
pass = 1'b0;
end
str = "+2.e+16789";
code = $sscanf(str, "%6e %d", r, a);
if (code !== 2) begin
$display("FAILED(ew2) to parse two argument found %d", code);
pass = 1'b0;
end
if (r != 20.0) begin
$display("FAILED(ew2) first argument value, expected 20.0, got %f", r);
pass = 1'b0;
end
if (a !== 'd6789) begin
$display("FAILED(ew2) second argument value, expected 'd6789, got %d", a);
pass = 1'b0;
end
str = "-2.2566789";
code = $sscanf(str, "%6g %d", r, a);
if (code !== 2) begin
$display("FAILED(gw1) to parse two argument found %d", code);
pass = 1'b0;
end
if (r != -2.256) begin
$display("FAILED(gw1) first argument value, expected 2.256, got %f", r);
pass = 1'b0;
end
if (a !== 'd6789) begin
$display("FAILED(gw1) second argument value, expected 'd6789, got %d", a);
pass = 1'b0;
end
str = "+2.e+16789";
code = $sscanf(str, "%6g %d", r, a);
if (code !== 2) begin
$display("FAILED(gw2) to parse two argument found %d", code);
pass = 1'b0;
end
if (r != 20.0) begin
$display("FAILED(gw2) first argument value, expected 20.0, got %f", r);
pass = 1'b0;
end
if (a !== 'd6789) begin
$display("FAILED(gw2) second argument value, expected 'd6789, got %d", a);
pass = 1'b0;
end
// Check a time using a width.
$timeformat(-9, 3, "ns", 20);
str = "-2.2566789";
code = $sscanf(str, "%6t %d", r, a);
if (code !== 2) begin
$display("FAILED(tw1) to parse two argument found %d", code);
pass = 1'b0;
end
if (r != -2.256) begin
$display("FAILED(tw1) first argument value, expected 2.256, got %f", r);
pass = 1'b0;
end
if (a !== 'd6789) begin
$display("FAILED(tw1) second argument value, expected 'd6789, got %d", a);
pass = 1'b0;
end
str = "+2.e+16789";
code = $sscanf(str, "%6t %d", r, a);
if (code !== 2) begin
$display("FAILED(tw2) to parse two argument found %d", code);
pass = 1'b0;
end
if (r != 20.0) begin
$display("FAILED(tw2) first argument value, expected 20.0, got %f", r);
pass = 1'b0;
end
if (a !== 'd6789) begin
$display("FAILED(tw2) second argument value, expected 'd6789, got %d", a);
pass = 1'b0;
end
// Check a suppressed string.
str = "hello bad world";
code = $sscanf(str, "%s %*s %s", a, b);
if (code !== 2) begin
$display("FAILED(ss) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== "hello") begin
$display("FAILED(sw) first argument value, expected hello, got %s", a);
pass = 1'b0;
end
if (b !== "world") begin
$display("FAILED(sw) second argument value, expected world, got %s", b);
pass = 1'b0;
end
// Check a suppressed binary.
str = "0110 xxz 1001";
code = $sscanf(str, "%b %*b %b", a, b);
if (code !== 2) begin
$display("FAILED(bs) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'b0110) begin
$display("FAILED(bs) first argument value, expected 'b0110, got %b", a);
pass = 1'b0;
end
if (b !== 'b1001) begin
$display("FAILED(bs) second argument value, expected 'b1001, got %b", b);
pass = 1'b0;
end
// Check a suppressed octal.
str = "234 xxz 567";
code = $sscanf(str, "%o %*o %o", a, b);
if (code !== 2) begin
$display("FAILED(os) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'o234) begin
$display("FAILED(os) first argument value, expected 'o234, got %o", a);
pass = 1'b0;
end
if (b !== 'o567) begin
$display("FAILED(os) second argument value, expected 'o567, got %o", b);
pass = 1'b0;
end
// Check a suppressed hex.
str = "89ab xz CDEF";
code = $sscanf(str, "%h %*h %h", a, b);
if (code !== 2) begin
$display("FAILED(hs) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'h89ab) begin
$display("FAILED(hs) first argument value, expected 'h89ab, got %h", a);
pass = 1'b0;
end
if (b !== 'hcdef) begin
$display("FAILED(hs) second argument value, expected 'hcdef, got %h", b);
pass = 1'b0;
end
// Check a suppressed decimal.
str = "2345 x 6789";
code = $sscanf(str, "%d %*d %d", a, b);
if (code !== 2) begin
$display("FAILED(ds) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'd2345) begin
$display("FAILED(ds) first argument value, expected 'd2345, got %d", a);
pass = 1'b0;
end
if (b !== 'd6789) begin
$display("FAILED(ds) second argument value, expected 'd6789, got %d", b);
pass = 1'b0;
end
// Check a suppressed real.
str = "2345 1.0 2.0";
code = $sscanf(str, "%d %*f %f", a, r);
if (code !== 2) begin
$display("FAILED(fs) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'd2345) begin
$display("FAILED(fs) first argument value, expected 'd2345, got %d", a);
pass = 1'b0;
end
if (r != 2.0) begin
$display("FAILED(fs) second argument value, expected 2.0, got %f", r);
pass = 1'b0;
end
str = "2345 1.0 2.0";
code = $sscanf(str, "%d %*e %e", a, r);
if (code !== 2) begin
$display("FAILED(es) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'd2345) begin
$display("FAILED(es) first argument value, expected 'd2345, got %d", a);
pass = 1'b0;
end
if (r != 2.0) begin
$display("FAILED(es) second argument value, expected 2.0, got %f", r);
pass = 1'b0;
end
str = "2345 1.0 2.0";
code = $sscanf(str, "%d %*g %g", a, r);
if (code !== 2) begin
$display("FAILED(gs) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'd2345) begin
$display("FAILED(gs) first argument value, expected 'd2345, got %d", a);
pass = 1'b0;
end
if (r != 2.0) begin
$display("FAILED(gs) second argument value, expected 2.0, got %f", r);
pass = 1'b0;
end
// Check a suppressed time.
str = "2345 1.0 2.0";
code = $sscanf(str, "%d %*t %t", a, r);
if (code !== 2) begin
$display("FAILED(ts) to parse two argument found %d", code);
pass = 1'b0;
end
if (a !== 'd2345) begin
$display("FAILED(ts) first argument value, expected 'd2345, got %d", a);
pass = 1'b0;
end
if (r != 2.0) begin
$display("FAILED(ts) second argument value, expected 2.0, got %f", r);
pass = 1'b0;
end
// Check matching normal characters. Also check %%.
str = "test% str";
code = $sscanf(str, "test%% %s", a);
if (code !== 1) begin
$display("FAILED(nc) to parse one argument found %d", code);
pass = 1'b0;
end
if (a !== "str") begin
$display("FAILED(nc) first argument value, expected str, got %s", a);
pass = 1'b0;
end
// Check different spacing issues, tab, leading space, extra space, etc.
str = " one \t\n two ";
code = $sscanf(str, "%s %s", a, b);
if (code !== 2) begin
$display("FAILED(sp) to parse two arguments found %d", code);
pass = 1'b0;
end
if (a !== "one") begin
$display("FAILED(sp) first argument value, expected one, got %s", a);
pass = 1'b0;
end
if (b !== "two") begin
$display("FAILED(sp) second argument value, expected two, got %s", b);
pass = 1'b0;
end
// Check for a failing match.
a = 'bx;
b = 'bx;
str = "BAD";
code = $sscanf(str, "GOOD %s %s", a, b);
if (code !== 0) begin
$display("FAILED(fl) to parse bad match arguments found %d", code);
pass = 1'b0;
end
if (a !== 'bx) begin
$display("FAILED(fl) first argument value, expected 'bx, got %b", a);
pass = 1'b0;
end
if (b !== 'bx) begin
$display("FAILED(fl) second argument value, expected 'bx, got %b", b);
pass = 1'b0;
end
b = 'bx;
str = "a ";
// Check a failing character match at EOF.
code = $sscanf(str, "%s %c", a, b);
if (code !== 1) begin
$display("FAILED(fle) character at end, expected one found %d", code);
pass = 1'b0;
end
if (a !== "a") begin
$display("FAILED(fle) first argument value, expected a, got %s", a);
pass = 1'b0;
end
if (b !== 'bx) begin
$display("FAILED(fle) second argument value, expected 'bx, got %b", b);
pass = 1'b0;
end
// Check for no match.
a = 'bx;
b = 'bx;
str = "";
code = $sscanf(str, "GOOD %s %s", a, b);
if (code !== -1) begin
$display("FAILED(no) to parse no match arguments found %d", code);
pass = 1'b0;
end
if (a !== 'bx) begin
$display("FAILED(no) first argument value, expected 'bx, got %s", a);
pass = 1'b0;
end
if (b !== 'bx) begin
$display("FAILED(no) second argument value, expected 'bx, got %s", b);
pass = 1'b0;
end
// Check for an undefined conversion string.
a = 'bx;
str = "foo";
code = $sscanf(str, 'bx, a);
if (code !== -1) begin
$display("FAILED(udef) to parse undefined string returned %d", code);
pass = 1'b0;
end
if (a !== 'bx) begin
$display("FAILED(udef) first argument value, expected 'bx, got %s", a);
pass = 1'b0;
end
if (pass) $display("PASSED");
end
endmodule