50 lines
1.2 KiB
Coq
50 lines
1.2 KiB
Coq
|
|
module main;
|
||
|
|
|
||
|
|
|
||
|
|
// Model a pin with a weak keeper circuit. The way this works:
|
||
|
|
// If the pin value is 1, then attach a weak1 pullup, but
|
||
|
|
// if the pin value is 0, attach a weak0 pulldown.
|
||
|
|
wire pin;
|
||
|
|
pullup (weak1) (keep1);
|
||
|
|
pulldown (weak0) (keep0);
|
||
|
|
tranif1 (pin, keep1, pin);
|
||
|
|
tranif0 (pin, keep0, pin);
|
||
|
|
|
||
|
|
// Logic to drive a value onto a pin.
|
||
|
|
reg value, enable;
|
||
|
|
bufif1 (pin, value, enable);
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
value = 0;
|
||
|
|
enable = 1;
|
||
|
|
#1 if (pin !== 0) begin
|
||
|
|
$display("FAILED -- value=%b, enable=%b, pin=%b", value, enable, pin);
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
|
||
|
|
// pin should hold its value after the drive is removed.
|
||
|
|
enable = 0;
|
||
|
|
#1 if (pin !== 0) begin
|
||
|
|
$display("FAILED -- value=%b, enable=%b, pin=%b", value, enable, pin);
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
|
||
|
|
value = 1;
|
||
|
|
enable = 1;
|
||
|
|
#1 if (pin !== 1) begin
|
||
|
|
$display("FAILED -- value=%b, enable=%b, pin=%b", value, enable, pin);
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
|
||
|
|
// pin should hold its value after the drive is removed.
|
||
|
|
enable = 0;
|
||
|
|
#1 if (pin !== 1) begin
|
||
|
|
$display("FAILED -- value=%b, enable=%b, pin=%b", value, enable, pin);
|
||
|
|
$finish;
|
||
|
|
end
|
||
|
|
|
||
|
|
$display("PASSED");
|
||
|
|
end
|
||
|
|
|
||
|
|
endmodule // main
|