iverilog/ivtest/ivltests/pr2829776b.v

63 lines
1.2 KiB
Verilog

`timescale 1ns/1ps
module top;
reg pass;
reg ina, inb;
wire out;
my_or dut(out, ina, inb);
initial begin
pass = 1'b1;
ina = 1'b0;
inb = 1'b0;
#0.399
if (out !== 1'bx && out !== 1'bz) begin
$display("FAILED: gate had incorrect delay, expected x/z, got %b.", out);
pass = 1'b0;
end
#0.002
if (out !== 1'b0) begin
$display("FAILED: gate had incorrect delay, expected 0, got %b.", out);
pass = 1'b0;
end
// Check inertial delays.
ina = 1'b1;
#0.399
ina = 1'b0;
#0.002
if (out !== 1'b0) begin
$display("FAILED: inertial delay, expected 0, got %b.", out);
pass = 1'b0;
end
// Check that this change is relative to the first edge.
ina = 1'b1;
#0.200;
inb = 1'b1;
#0.201;
if (out !== 1'b1) begin
$display("FAILED: double edge delay, expected 1, got %b.", out);
pass = 1'b0;
#0.200;
if (out === 1'b1) begin
$display("FAILED: double edge delay was off second edge.");
end
end
if (pass) $display("PASSED");
end
endmodule
module my_or(out, ina, inb);
output out;
input ina, inb;
or(out, ina, inb);
specify
(ina, inb *> out) = 0.4;
endspecify
endmodule