iverilog/ivtest/ivltests/edge.v

109 lines
1.9 KiB
Verilog

module top;
reg passed;
reg pevt;
reg evt;
reg pedge;
reg nedge;
initial begin
passed = 1'b1;
#1; // Check X to 0
{pedge, nedge} = 2'b01;
evt = 1'b0;
#1; // Check 0 to X
pevt = evt;
{pedge, nedge} = 2'b10;
evt = 1'bx;
#1; // Check X to 1
pevt = evt;
{pedge, nedge} = 2'b10;
evt = 1'b1;
#1; // Check 1 to X
pevt = evt;
{pedge, nedge} = 2'b01;
evt = 1'bx;
#1; // Check X to Z
pevt = evt;
{pedge, nedge} = 2'b00;
evt = 1'bz;
#1; // Check Z to X
pevt = evt;
{pedge, nedge} = 2'b00;
evt = 1'bx;
#1; // Check X to Z (again)
pevt = evt;
{pedge, nedge} = 2'b00;
evt = 1'bz;
#1; // Check Z to 0
pevt = evt;
{pedge, nedge} = 2'b01;
evt = 1'b0;
#1; // Check 0 to Z
pevt = evt;
{pedge, nedge} = 2'b10;
evt = 1'bz;
#1; // Check Z to 1
pevt = evt;
{pedge, nedge} = 2'b10;
evt = 1'b1;
#1; // Check 1 to Z
pevt = evt;
{pedge, nedge} = 2'b01;
evt = 1'bz;
#1; // Check Z to 1 (again)
pevt = evt;
{pedge, nedge} = 2'b10;
evt = 1'b1;
#1; // Check 1 to 0
pevt = evt;
{pedge, nedge} = 2'b01;
evt = 1'b0;
#1; // Check 0 to 1
pevt = evt;
{pedge, nedge} = 2'b10;
evt = 1'b1;
#1;
if (passed) $display("PASSED");
end
always @(posedge evt) begin
if (!pedge) begin
$display("Error: posedge detected for %b -> %b", pevt, evt);
passed = 1'b0;
end
end
always @(negedge evt) begin
if (!nedge) begin
$display("Error: negedge detected for %b -> %b", pevt, evt);
passed = 1'b0;
end
end
always @(edge evt) begin
if (!nedge && !pedge) begin
$display("Error: edge detected for %b -> %b", pevt, evt);
passed = 1'b0;
end
end
always @(evt)
$display("Checking the %b -> %b event", pevt, evt);
endmodule