108 lines
2.9 KiB
Systemverilog
108 lines
2.9 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
|
// any use, without warranty, 2025 by Wilson Snyder.
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
`define stop $stop
|
|
`define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%0x exp=%0x (%s !== %s)\n", `__FILE__,`__LINE__, (gotv), (expv), `"gotv`", `"expv`"); `stop; end while(0);
|
|
|
|
module top;
|
|
logic pEdge = 1'b0;
|
|
logic nEdge = 1'b1;
|
|
logic edgeP = 1'b0;
|
|
logic edgeN = 1'b1;
|
|
logic changeP = 1'b0;
|
|
logic changeN = 1'b1;
|
|
|
|
int pEdgeCnt = 0;
|
|
int nEdgeCnt = 0;
|
|
int edgePCnt = 0;
|
|
int edgeNCnt = 0;
|
|
int changePCnt = 0;
|
|
int changeNCnt = 0;
|
|
|
|
time pEdgeTime[3] = '{-1, -1, -1};
|
|
time nEdgeTime[3] = '{-1, -1, -1};
|
|
time edgePTime[3] = '{-1, -1, -1};
|
|
time edgeNTime[3] = '{-1, -1, -1};
|
|
time changePTime[3] = '{-1, -1, -1};
|
|
time changeNTime[3] = '{-1, -1, -1};
|
|
|
|
initial begin
|
|
pEdge = 1'b1;
|
|
nEdge = 1'b0;
|
|
edgeP = 1'b1;
|
|
edgeN = 1'b0;
|
|
changeP = 1'b1;
|
|
changeN = 1'b0;
|
|
|
|
#10;
|
|
pEdge = 1'b0;
|
|
nEdge = 1'b1;
|
|
edgeP = 1'b0;
|
|
edgeN = 1'b1;
|
|
changeP = 1'b0;
|
|
changeN = 1'b1;
|
|
|
|
#10;
|
|
pEdge = 1'b1;
|
|
nEdge = 1'b0;
|
|
edgeP = 1'b1;
|
|
edgeN = 1'b0;
|
|
changeP = 1'b1;
|
|
changeN = 1'b0;
|
|
|
|
#10;
|
|
$display("pEdgeCnt: %0d", pEdgeCnt);
|
|
$display("nEdgeCnt: %0d", nEdgeCnt);
|
|
$display("edgePCnt: %0d", edgePCnt);
|
|
$display("edgeNCnt: %0d", edgeNCnt);
|
|
$display("changePCnt: %0d", changePCnt);
|
|
$display("changeNCnt: %0d", changeNCnt);
|
|
|
|
$display("pEdgeTime: %p", pEdgeTime);
|
|
$display("nEdgeTime: %p", nEdgeTime);
|
|
$display("edgePTime: %p", edgePTime);
|
|
$display("edgeNTime: %p", edgeNTime);
|
|
$display("changePTime: %p", changePTime);
|
|
$display("changeNTime: %p", changeNTime);
|
|
|
|
`checkh(pEdgeCnt, 2);
|
|
`checkh(nEdgeCnt, 2);
|
|
`checkh(edgePCnt, 3);
|
|
`checkh(edgeNCnt, 3);
|
|
`checkh(changePCnt, 3);
|
|
`checkh(changeNCnt, 3);
|
|
|
|
`checkh(pEdgeTime[0], 0);
|
|
`checkh(pEdgeTime[1], 20);
|
|
`checkh(pEdgeTime[2], -1);
|
|
`checkh(nEdgeTime[0], 0);
|
|
`checkh(nEdgeTime[1], 20);
|
|
`checkh(nEdgeTime[2], -1);
|
|
`checkh(edgePTime[0], 0);
|
|
`checkh(edgePTime[1], 10);
|
|
`checkh(edgePTime[2], 20);
|
|
`checkh(edgeNTime[0], 0);
|
|
`checkh(edgeNTime[1], 10);
|
|
`checkh(edgeNTime[2], 20);
|
|
`checkh(changePTime[0], 0);
|
|
`checkh(changePTime[1], 10);
|
|
`checkh(changePTime[2], 20);
|
|
`checkh(changeNTime[0], 0);
|
|
`checkh(changeNTime[1], 10);
|
|
`checkh(changeNTime[2], 20);
|
|
$write("*-* All Finished *-*\n");
|
|
$finish;
|
|
end
|
|
|
|
always @(posedge pEdge) pEdgeTime[pEdgeCnt++] = $time;
|
|
always @(negedge nEdge) nEdgeTime[nEdgeCnt++] = $time;
|
|
always @(edge edgeP) edgePTime[edgePCnt++] = $time;
|
|
always @(edge edgeN) edgeNTime[edgeNCnt++] = $time;
|
|
always @(changeP) changePTime[changePCnt++] = $time;
|
|
always @(changeN) changeNTime[changeNCnt++] = $time;
|
|
|
|
endmodule // test
|