iverilog/ivtest/ivltests/swrite.v

327 lines
12 KiB
Verilog

`timescale 1ns/1ps
//`define DEBUG
module top;
parameter length = 34;
parameter str = "%s";
reg [length*8-1:0] result, fmt;
integer val = 1000;
reg [31:0] eval, uval, zval;
reg [63:0] hval, sval;
real rval = 1234.567;
wire net;
time tm = 234567;
realtime rtm = 2345.678;
reg failed;
`ifdef DEBUG
integer lp;
`endif
assign (pull1, strong0) net = 1'b1;
task check_result;
input [length*8-1:0] result, value;
input [80*8-1:0] message;
if (result != value) begin
$display("%0s", message);
$display("Got :%s:", result);
$display("Wanted :%s:", value);
`ifdef DEBUG
for (lp=0; lp<length; lp=lp+1) begin
$display("%d - %d, %d", lp, result[lp*8 +: 8], value[lp*8 +: 8]);
end
`endif
failed = 1;
end
endtask
initial begin
$timeformat(-12, 4, " ps", 20);
fmt = "%s";
failed = 0;
// Determine the endian order.
$swrite(result, "%u", "Help");
if (result != "\000Help") begin
// Big endian so reverse the bytes.
eval = 32'h22000000;
hval = 64'h206d652148656c70;
uval = 32'b010010xz_01100101_01101100_01110000;
zval = 32'b01z01000_0xx0zx0x_0xx01x0z_01x1000z;
sval = " me!Help";
end else begin
// Little endian.
eval = 32'h00000022;
hval = 64'h21656d20706c6548;
uval = 32'b01110000_01101100_01100101_010010xz;
zval = 32'b01x1000z_0xx01x0z_0xx0zx0x_01z01000;
sval = "!em pleH";
end
#1;
// Basic variables and functions.
$swrite(result, val);
check_result(result, " 1000", "Decimal in $swrite failed!");
$swriteb(result, val);
check_result(result, "00000000000000000000001111101000",
"Decimal in $swriteb failed!");
$swriteo(result, val);
check_result(result, "00000001750", "Decimal in $swriteo failed!");
$swriteh(result, val);
check_result(result, "000003e8", "Decimal in $swriteo failed!");
$swrite(result, rval);
check_result(result, "1234.57", "Real in $swrite failed!");
$swrite(result, "Normal string.");
check_result(result, "Normal string.", "String in $swrite failed!");
$swrite(result, tm);
check_result(result, " 234567", "Time in $swrite failed!");
$swrite(result, rtm);
check_result(result, "2345.68", "Real time in $swrite failed!");
$swrite(result, $time);
check_result(result, " 1", "$time in $swrite failed!");
$swrite(result, $stime);
check_result(result, " 1", "$stime in $swrite failed!");
$swrite(result, $simtime);
check_result(result, " 1000", "$simtime in $swrite failed!");
$swrite(result, $realtime);
check_result(result, "1.000", "$realtime in $swrite failed!");
// %% and extra variables.
$swrite(result, "%%",, val);
check_result(result, "% 1000", "% and value in $swrite failed!");
// %b
$swrite(result, "%b", net);
check_result(result, "1", "%b in $swrite failed!");
$swrite(result, "%B", net);
check_result(result, "1", "%b in $swrite failed!");
$swrite(result, "%b", 8'b00001001);
check_result(result, "00001001", "%b in $swrite failed!");
$swrite(result, "%0b", 8'b00001001);
check_result(result, "1001", "%0b in $swrite failed!");
$swrite(result, "%14b", 8'b00001001);
check_result(result, " 00001001", "%14b in $swrite failed!");
$swrite(result, "%-14b", 8'b00001001);
check_result(result, "00001001 ", "%-14b in $swrite failed!");
// %o
$swrite(result, "%o", 8'b00001001);
check_result(result, "011", "%o in $swrite failed!");
$swrite(result, "%O", 8'b00001001);
check_result(result, "011", "%O in $swrite failed!");
$swrite(result, "%0o", 8'b00001001);
check_result(result, "11", "%0o in $swrite failed!");
$swrite(result, "%14o", 8'b00001001);
check_result(result, " 011", "%14o in $swrite failed!");
$swrite(result, "%-14o", 8'b00001001);
check_result(result, "011 ", "%-14o in $swrite failed!");
// %h
$swrite(result, "%h", 8'b00001001);
check_result(result, "09", "%h in $swrite failed!");
$swrite(result, "%H", 8'b00001001);
check_result(result, "09", "%H in $swrite failed!");
$swrite(result, "%0h", 8'b00001001);
check_result(result, "9", "%0h in $swrite failed!");
$swrite(result, "%14h", 8'b00001001);
check_result(result, " 09", "%14h in $swrite failed!");
$swrite(result, "%-14h", 8'b00001001);
check_result(result, "09 ", "%-14h in $swrite failed!");
// %c
$swrite(result, "%c", "abcd");
check_result(result, "d", "%c in $swrite failed!");
$swrite(result, "%C", "abcd");
check_result(result, "d", "%C in $swrite failed!");
$swrite(result, "%4c", "abcd");
check_result(result, " d", "%4c in $swrite failed!");
$swrite(result, "%-4c", "abcd");
check_result(result, "d ", "%-4c in $swrite failed!");
// %d
$swrite(result, "%d", val);
check_result(result, " 1000", "%d in $swrite failed!");
$swrite(result, "%D", val);
check_result(result, " 1000", "%D in $swrite failed!");
$swrite(result, "%d", length);
`ifdef OLD_UNSIZED
check_result(result, " 34", "%d in $swrite failed!");
`else
check_result(result, " 34", "%d in $swrite failed!");
`endif
$swrite(result, "%d", 31);
`ifdef OLD_UNSIZED
check_result(result, " 31", "%d in $swrite failed!");
`else
check_result(result, " 31", "%d in $swrite failed!");
`endif
$swrite(result, "%d", $unsigned(31));
`ifdef OLD_UNSIZED
check_result(result, "31", "%d in $swrite failed!");
`else
check_result(result, " 31", "%d in $swrite failed!");
`endif
$swrite(result, "%0d", val);
check_result(result, "1000", "%0d in $swrite failed!");
$swrite(result, "%+d", val);
check_result(result, " +1000", "%+d in $swrite failed!");
$swrite(result, "%14d", val);
check_result(result, " 1000", "%14d in $swrite failed!");
$swrite(result, "%-14d", val);
check_result(result, "1000 ", "%-14d in $swrite failed!");
// %e
$swrite(result, "%e", rval);
check_result(result, "1.234567e+03", "%e in $swrite failed!");
$swrite(result, "%E", rval);
check_result(result, "1.234567E+03", "%E in $swrite failed!");
$swrite(result, "%+e", rval);
check_result(result, "+1.234567e+03", "%+e in $swrite failed!");
$swrite(result, "%14.3e", rval);
check_result(result, " 1.235e+03", "%14.3e in $swrite failed!");
$swrite(result, "%-14.3e", rval);
check_result(result, "1.235e+03 ", "%-14.3e in $swrite failed!");
// %f
$swrite(result, "%f", rval);
check_result(result, "1234.567000", "%f in $swrite failed!");
$swrite(result, "%F", rval);
check_result(result, "1234.567000", "%F in $swrite failed!");
$swrite(result, "%+f", rval);
check_result(result, "+1234.567000", "%+f in $swrite failed!");
$swrite(result, "%14.3f", rval);
check_result(result, " 1234.567", "%14.3f in $swrite failed!");
$swrite(result, "%-14.3f", rval);
check_result(result, "1234.567 ", "%-14.3f in $swrite failed!");
// %g
$swrite(result, "%g", rval);
check_result(result, "1234.57", "%g in $swrite failed!");
$swrite(result, "%G", rval);
check_result(result, "1234.57", "%G in $swrite failed!");
$swrite(result, "%+g", rval);
check_result(result, "+1234.57", "%+g in $swrite failed!");
$swrite(result, "%14.3g", rval);
check_result(result, " 1.23e+03", "%14.3g in $swrite failed!");
$swrite(result, "%-14.3G", rval);
check_result(result, "1.23E+03 ", "%-14.3G in $swrite failed!");
// %l is currently unsupported.
$swrite(result, "%l");
check_result(result, "<%l>", "%l in $swrite failed!");
$swrite(result, "%L");
check_result(result, "<%L>", "%L in $swrite failed!");
// %m
$swrite(result, "%m");
check_result(result, "top", "%m in $swrite failed!");
$swrite(result, "%M");
check_result(result, "top", "%M in $swrite failed!");
$swrite(result, "%8m");
check_result(result, " top", "%m in $swrite failed!");
$swrite(result, "%-8m");
check_result(result, "top ", "%m in $swrite failed!");
// %s
$swrite(result, "%s", "Hello");
check_result(result, "Hello", "%s in $swrite failed!");
$swrite(result, "%S", "Hello");
check_result(result, "Hello", "%S in $swrite failed!");
$swrite(result, str, "Hello");
check_result(result, "Hello", "%s in $swrite failed!");
$swrite(result, "%14s", "Hello");
check_result(result, " Hello", "%14s in $swrite failed!");
$swrite(result, "%-14s", "Hello");
check_result(result, "Hello ", "%-14s in $swrite failed!");
// %t
$swrite(result, "%t", 0);
check_result(result, " 0.0000 ps", "%t in $swrite failed!");
$swrite(result, "%t", 1);
check_result(result, " 1000.0000 ps", "%t in $swrite failed!");
$swrite(result, "%T", 1);
check_result(result, " 1000.0000 ps", "%T in $swrite failed!");
$swrite(result, "%t", 10_000);
check_result(result, " 10000000.0000 ps", "%t in $swrite failed!");
$swrite(result, "%t", $time);
check_result(result, " 1000.0000 ps", "%t $time in $swrite failed!");
// $swrite(result, "%t", $simtime);
// check_result(result, " 1000.0000 ps",
// "%t $simtime in $swrite failed!");
$swrite(result, "%-t", 1);
check_result(result, "1000.0000 ps ", "%-t in $swrite failed!");
$swrite(result, "%15t", 1);
check_result(result, " 1000.0000 ps", "%15t in $swrite failed!");
$swrite(result, "%-15t", 1);
check_result(result, "1000.0000 ps ", "%-15t in $swrite failed!");
$swrite(result, "%15.1t", 1);
check_result(result, " 1000.0 ps", "%15.1t in $swrite failed!");
// Real values.
$swrite(result, "%t", 1.1);
check_result(result, " 1100.0000 ps", "%t in $swrite failed!");
$swrite(result, "%t", $realtime);
check_result(result, " 1000.0000 ps",
"%t $realtime in $swrite failed!");
$swrite(result, "%-t", 1.1);
check_result(result, "1100.0000 ps ", "%-t in $swrite failed!");
$swrite(result, "%15t", 1.1);
check_result(result, " 1100.0000 ps", "%15t in $swrite failed!");
$swrite(result, "%-15t", 1.1);
check_result(result, "1100.0000 ps ", "%-15t in $swrite failed!");
$swrite(result, "%15.1t", 1.1);
check_result(result, " 1100.0 ps", "%15.1t in $swrite failed!");
// %u
$swrite(result, "%u", eval);
check_result(result, "\"", "%u in $swrite failed!");
$swrite(result, "%U", eval);
check_result(result, "\"", "%U in $swrite failed!");
$swrite(result, "%u", sval);
check_result(result, "Help me!", "%u in $swrite failed!");
// "Help me!"
$swrite(result, "%u", hval);
check_result(result, "Help me!", "%u in $swrite failed!");
// "Help" with check for correct x and z functionality.
$swrite(result, "%u", uval);
check_result(result, "Help", "%u in $swrite failed!");
// %v
$swrite(result, "%v", net);
check_result(result, "Pu1", "%v in $swrite failed!");
$swrite(result, "%V", net);
check_result(result, "Pu1", "%V in $swrite failed!");
$swrite(result, "%14v", net);
check_result(result, " Pu1", "%14v in $swrite failed!");
$swrite(result, "%-14v", net);
check_result(result, "Pu1 ", "%-14v in $swrite failed!");
// %z
$swrite(result, "%z", eval);
check_result(result, "\"", "%z in $swrite failed!");
$swrite(result, "%Z", eval);
check_result(result, "\"", "%Z in $swrite failed!");
// "Help me!", but because of NULLs we only get "Help"
$swrite(result, "%z", hval);
check_result(result, "Help", "%z in $swrite failed!");
// "Help me!" encoded using all the states!
$swrite(result, "%z", zval);
check_result(result, "Help me!", "%z in $swrite failed!");
// $sformat()
$sformat(result, "%s", "Hello world");
check_result(result, "Hello world", "String in $sformat failed!");
$sformat(result, str, "Hello world");
check_result(result, "Hello world", "Parameter in $sformat failed!");
$sformat(result, fmt, "Hello world");
check_result(result, "Hello world", "Register in $sformat failed!");
$sformat(result, "%s");
check_result(result, "<%s>", "$sformat missing argument failed!");
$sformat(result, "%s", "Hello world", 2);
check_result(result, "Hello world", "$sformat extra argument failed!");
if (!failed) $display("All tests passed.");
end
endmodule