iverilog/ivtest/ivltests/br948.v

71 lines
2.0 KiB
Verilog

module top;
reg pass;
reg in;
reg pout;
wire out;
function invert;
input in;
// When this is a named block the compiler creates a fork/join to
// create the new scope. The problem with this is that of_EXEC_UFUNC
// opcode does not work correctly since the vthread_run(child) call
// returns when the join is executed which then copies the return value
// before the function body code has actually run. This causes the
// results to be delayed by one call. Does this need to be split into
// two functions. One that acts like fork and copies the input values
// and one that acts like join and returns the function result?
// It appears that procedural user function calls work correctly since
// they use fork/join to call the user function.
// Both V0.9 and development have this problem.
begin: block_name
invert = ~in;
$display("Function should return %b when given %b.", invert, in);
end
endfunction
assign out = invert(in);
initial begin
pass = 1'b1;
in = 1'b0;
#1;
if (out !== 1'b1) begin
$display("CA result was %b when given %b, expect 1'b1.", out, in);
pass = 1'b0;
end
pout = invert(in);
if (pout !== 1'b1) begin
$display("Result was %b when given %b, expect 1'b1.", pout, in);
pass = 1'b0;
end
in = 1'b1;
#1;
if (out !== 1'b0) begin
$display("CA result was %b when given %b, expect 1'b0.", out, in);
pass = 1'b0;
end
pout = invert(in);
if (pout !== 1'b0) begin
$display("Result was %b when given %b, expect 1'b0.", pout, in);
pass = 1'b0;
end
in = 1'bz;
#1;
if (out !== 1'bx) begin
$display("CA result was %b when given %b, expect 1'bx.", out, in);
pass = 1'b0;
end
pout = invert(in);
if (pout !== 1'bx) begin
$display("Result was %b when given %b, expect 1'bx.", pout, in);
pass = 1'b0;
end
if (pass) $display("PASSED");
end
endmodule