| // Copyright 2020-2022 F4PGA Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| `timescale 1ps/1ps |
| |
| `default_nettype none |
| |
| (* abc9_flop, lib_whitebox *) |
| module sh_dff( |
| output reg Q, |
| input wire D, |
| (* clkbuf_sink *) |
| input wire C |
| ); |
| |
| initial Q <= 1'b0; |
| always @(posedge C) |
| Q <= D; |
| |
| specify |
| (posedge C => (Q +: D)) = 0; |
| $setuphold(posedge C, D, 0, 0); |
| endspecify |
| |
| endmodule |
| |
| (* abc9_box, lib_blackbox *) |
| module adder_carry( |
| output wire sumout, |
| output wire cout, |
| input wire p, |
| input wire g, |
| input wire cin |
| ); |
| assign sumout = p ^ cin; |
| assign cout = p ? cin : g; |
| |
| specify |
| (p => sumout) = 0; |
| (g => sumout) = 0; |
| (cin => sumout) = 0; |
| (p => cout) = 0; |
| (g => cout) = 0; |
| (cin => cout) = 0; |
| endspecify |
| |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dff( |
| output reg Q, |
| input wire D, |
| (* clkbuf_sink *) |
| input wire C |
| ); |
| initial Q <= 1'b0; |
| |
| always @(posedge C) |
| Q <= D; |
| |
| specify |
| (posedge C=>(Q+:D)) = 0; |
| $setuphold(posedge C, D, 0, 0); |
| endspecify |
| |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dffn( |
| output reg Q, |
| input wire D, |
| (* clkbuf_sink *) |
| input wire C |
| ); |
| initial Q <= 1'b0; |
| |
| always @(negedge C) |
| Q <= D; |
| |
| specify |
| (negedge C=>(Q+:D)) = 0; |
| $setuphold(negedge C, D, 0, 0); |
| endspecify |
| |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dffsre( |
| output reg Q, |
| input wire D, |
| (* clkbuf_sink *) |
| input wire C, |
| input wire E, |
| input wire R, |
| input wire S |
| ); |
| initial Q <= 1'b0; |
| |
| always @(posedge C or negedge S or negedge R) |
| if (!R) |
| Q <= 1'b0; |
| else if (!S) |
| Q <= 1'b1; |
| else if (E) |
| Q <= D; |
| |
| specify |
| (posedge C => (Q +: D)) = 0; |
| (R => Q) = 0; |
| (S => Q) = 0; |
| $setuphold(posedge C, D, 0, 0); |
| $setuphold(posedge C, E, 0, 0); |
| $setuphold(posedge C, R, 0, 0); |
| $setuphold(posedge C, S, 0, 0); |
| $recrem(posedge R, posedge C, 0, 0); |
| $recrem(posedge S, posedge C, 0, 0); |
| endspecify |
| |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dffnsre( |
| output reg Q, |
| input wire D, |
| (* clkbuf_sink *) |
| input wire C, |
| input wire E, |
| input wire R, |
| input wire S |
| ); |
| initial Q <= 1'b0; |
| |
| always @(negedge C or negedge S or negedge R) |
| if (!R) |
| Q <= 1'b0; |
| else if (!S) |
| Q <= 1'b1; |
| else if (E) |
| Q <= D; |
| |
| specify |
| (negedge C => (Q +: D)) = 0; |
| (R => Q) = 0; |
| (S => Q) = 0; |
| $setuphold(negedge C, D, 0, 0); |
| $setuphold(negedge C, E, 0, 0); |
| $setuphold(negedge C, R, 0, 0); |
| $setuphold(negedge C, S, 0, 0); |
| $recrem(posedge R, negedge C, 0, 0); |
| $recrem(posedge S, negedge C, 0, 0); |
| endspecify |
| |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module sdffsre( |
| output reg Q, |
| input wire D, |
| (* clkbuf_sink *) |
| input wire C, |
| input wire E, |
| input wire R, |
| input wire S |
| ); |
| initial Q <= 1'b0; |
| |
| always @(posedge C) |
| if (!R) |
| Q <= 1'b0; |
| else if (!S) |
| Q <= 1'b1; |
| else if (E) |
| Q <= D; |
| |
| specify |
| (posedge C => (Q +: D)) = 0; |
| $setuphold(posedge C, D, 0, 0); |
| $setuphold(posedge C, R, 0, 0); |
| $setuphold(posedge C, S, 0, 0); |
| $setuphold(posedge C, E, 0, 0); |
| endspecify |
| |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module sdffnsre( |
| output reg Q, |
| input wire D, |
| (* clkbuf_sink *) |
| input wire C, |
| input wire E, |
| input wire R, |
| input wire S |
| ); |
| initial Q <= 1'b0; |
| |
| always @(negedge C) |
| if (!R) |
| Q <= 1'b0; |
| else if (!S) |
| Q <= 1'b1; |
| else if (E) |
| Q <= D; |
| |
| specify |
| (negedge C => (Q +: D)) = 0; |
| $setuphold(negedge C, D, 0, 0); |
| $setuphold(negedge C, R, 0, 0); |
| $setuphold(negedge C, S, 0, 0); |
| $setuphold(negedge C, E, 0, 0); |
| endspecify |
| |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module latchsre ( |
| output reg Q, |
| input wire S, |
| input wire R, |
| input wire D, |
| input wire G, |
| input wire E |
| ); |
| initial Q <= 1'b0; |
| |
| always @* |
| begin |
| if (!R) |
| Q <= 1'b0; |
| else if (!S) |
| Q <= 1'b1; |
| else if (E && G) |
| Q <= D; |
| end |
| |
| specify |
| (posedge G => (Q +: D)) = 0; |
| $setuphold(posedge G, D, 0, 0); |
| $setuphold(posedge G, E, 0, 0); |
| $setuphold(posedge G, R, 0, 0); |
| $setuphold(posedge G, S, 0, 0); |
| endspecify |
| |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module latchnsre ( |
| output reg Q, |
| input wire S, |
| input wire R, |
| input wire D, |
| input wire G, |
| input wire E |
| ); |
| initial Q <= 1'b0; |
| |
| always @* |
| begin |
| if (!R) |
| Q <= 1'b0; |
| else if (!S) |
| Q <= 1'b1; |
| else if (E && !G) |
| Q <= D; |
| end |
| |
| specify |
| (negedge G => (Q +: D)) = 0; |
| $setuphold(negedge G, D, 0, 0); |
| $setuphold(negedge G, E, 0, 0); |
| $setuphold(negedge G, R, 0, 0); |
| $setuphold(negedge G, S, 0, 0); |
| endspecify |
| |
| endmodule |
| |