blob: d2fc0a721af26017e8281719724a99c902403919 [file] [log] [blame]
Karol Gugalae8140892022-03-30 13:43:15 +02001// Copyright 2020-2022 F4PGA Authors
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -08002//
Karol Gugalae8140892022-03-30 13:43:15 +02003// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -08006//
Karol Gugalae8140892022-03-30 13:43:15 +02007// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15// SPDX-License-Identifier: Apache-2.0
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -080016
rakeshm6eaaa3a2022-12-20 12:57:30 -080017`timescale 1ps/1ps
18
Paweł Czarnecki931a2f52022-04-14 14:01:33 +020019`default_nettype none
20
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -080021(* abc9_flop, lib_whitebox *)
22module sh_dff(
23 output reg Q,
Paweł Czarnecki931a2f52022-04-14 14:01:33 +020024 input wire D,
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -080025 (* clkbuf_sink *)
Paweł Czarnecki931a2f52022-04-14 14:01:33 +020026 input wire C
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -080027);
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -080028
Maciej Kurccbc6ed92022-06-13 14:59:14 +020029 initial Q <= 1'b0;
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -080030 always @(posedge C)
Maciej Kurccbc6ed92022-06-13 14:59:14 +020031 Q <= D;
rakeshm3611e4b2022-11-15 07:06:08 -080032
33 specify
34 (posedge C => (Q +: D)) = 0;
35 $setuphold(posedge C, D, 0, 0);
36 endspecify
Maciej Kurccbc6ed92022-06-13 14:59:14 +020037
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -080038endmodule
39
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -080040(* abc9_box, lib_blackbox *)
41module adder_carry(
Paweł Czarnecki931a2f52022-04-14 14:01:33 +020042 output wire sumout,
43 output wire cout,
44 input wire p,
45 input wire g,
46 input wire cin
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -080047);
48 assign sumout = p ^ cin;
49 assign cout = p ? cin : g;
rakeshm3611e4b2022-11-15 07:06:08 -080050
51 specify
52 (p => sumout) = 0;
53 (g => sumout) = 0;
54 (cin => sumout) = 0;
55 (p => cout) = 0;
56 (g => cout) = 0;
57 (cin => cout) = 0;
58 endspecify
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -080059
60endmodule
61
Maciej Kurc0a3daaf2022-07-01 13:39:40 +020062(* abc9_flop, lib_whitebox *)
63module dff(
64 output reg Q,
65 input wire D,
66 (* clkbuf_sink *)
67 input wire C
68);
69 initial Q <= 1'b0;
70
71 always @(posedge C)
72 Q <= D;
73
rakeshm3611e4b2022-11-15 07:06:08 -080074 specify
75 (posedge C=>(Q+:D)) = 0;
76 $setuphold(posedge C, D, 0, 0);
77 endspecify
78
Maciej Kurc0a3daaf2022-07-01 13:39:40 +020079endmodule
80
81(* abc9_flop, lib_whitebox *)
82module dffn(
83 output reg Q,
84 input wire D,
85 (* clkbuf_sink *)
86 input wire C
87);
88 initial Q <= 1'b0;
89
90 always @(negedge C)
91 Q <= D;
rakeshm3611e4b2022-11-15 07:06:08 -080092
93 specify
94 (negedge C=>(Q+:D)) = 0;
95 $setuphold(negedge C, D, 0, 0);
96 endspecify
Maciej Kurc0a3daaf2022-07-01 13:39:40 +020097
98endmodule
Maciej Kurcf4bb47e2022-06-07 11:44:48 +020099
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800100(* abc9_flop, lib_whitebox *)
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800101module dffsre(
102 output reg Q,
Paweł Czarnecki931a2f52022-04-14 14:01:33 +0200103 input wire D,
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800104 (* clkbuf_sink *)
Paweł Czarnecki931a2f52022-04-14 14:01:33 +0200105 input wire C,
106 input wire E,
107 input wire R,
108 input wire S
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800109);
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200110 initial Q <= 1'b0;
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800111
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200112 always @(posedge C or negedge S or negedge R)
113 if (!R)
114 Q <= 1'b0;
115 else if (!S)
116 Q <= 1'b1;
117 else if (E)
118 Q <= D;
119
rakeshm3611e4b2022-11-15 07:06:08 -0800120 specify
121 (posedge C => (Q +: D)) = 0;
122 (R => Q) = 0;
123 (S => Q) = 0;
124 $setuphold(posedge C, D, 0, 0);
125 $setuphold(posedge C, E, 0, 0);
126 $setuphold(posedge C, R, 0, 0);
127 $setuphold(posedge C, S, 0, 0);
128 $recrem(posedge R, posedge C, 0, 0);
129 $recrem(posedge S, posedge C, 0, 0);
130 endspecify
131
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800132endmodule
133
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200134(* abc9_flop, lib_whitebox *)
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800135module dffnsre(
136 output reg Q,
Paweł Czarnecki931a2f52022-04-14 14:01:33 +0200137 input wire D,
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800138 (* clkbuf_sink *)
Paweł Czarnecki931a2f52022-04-14 14:01:33 +0200139 input wire C,
140 input wire E,
141 input wire R,
142 input wire S
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800143);
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200144 initial Q <= 1'b0;
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800145
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200146 always @(negedge C or negedge S or negedge R)
147 if (!R)
148 Q <= 1'b0;
149 else if (!S)
150 Q <= 1'b1;
151 else if (E)
152 Q <= D;
rakeshm3611e4b2022-11-15 07:06:08 -0800153
154 specify
155 (negedge C => (Q +: D)) = 0;
156 (R => Q) = 0;
157 (S => Q) = 0;
158 $setuphold(negedge C, D, 0, 0);
159 $setuphold(negedge C, E, 0, 0);
160 $setuphold(negedge C, R, 0, 0);
161 $setuphold(negedge C, S, 0, 0);
162 $recrem(posedge R, negedge C, 0, 0);
163 $recrem(posedge S, negedge C, 0, 0);
164 endspecify
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200165
166endmodule
167
168(* abc9_flop, lib_whitebox *)
169module sdffsre(
170 output reg Q,
171 input wire D,
172 (* clkbuf_sink *)
173 input wire C,
174 input wire E,
175 input wire R,
176 input wire S
177);
178 initial Q <= 1'b0;
179
180 always @(posedge C)
181 if (!R)
182 Q <= 1'b0;
183 else if (!S)
184 Q <= 1'b1;
185 else if (E)
186 Q <= D;
rakeshm3611e4b2022-11-15 07:06:08 -0800187
188 specify
189 (posedge C => (Q +: D)) = 0;
190 $setuphold(posedge C, D, 0, 0);
191 $setuphold(posedge C, R, 0, 0);
192 $setuphold(posedge C, S, 0, 0);
193 $setuphold(posedge C, E, 0, 0);
194 endspecify
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200195
196endmodule
197
198(* abc9_flop, lib_whitebox *)
199module sdffnsre(
200 output reg Q,
201 input wire D,
202 (* clkbuf_sink *)
203 input wire C,
204 input wire E,
205 input wire R,
206 input wire S
207);
208 initial Q <= 1'b0;
209
210 always @(negedge C)
211 if (!R)
212 Q <= 1'b0;
213 else if (!S)
214 Q <= 1'b1;
215 else if (E)
216 Q <= D;
rakeshm3611e4b2022-11-15 07:06:08 -0800217
218 specify
219 (negedge C => (Q +: D)) = 0;
220 $setuphold(negedge C, D, 0, 0);
221 $setuphold(negedge C, R, 0, 0);
222 $setuphold(negedge C, S, 0, 0);
223 $setuphold(negedge C, E, 0, 0);
224 endspecify
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200225
226endmodule
227
228(* abc9_flop, lib_whitebox *)
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800229module latchsre (
230 output reg Q,
Paweł Czarnecki931a2f52022-04-14 14:01:33 +0200231 input wire S,
232 input wire R,
233 input wire D,
234 input wire G,
235 input wire E
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800236);
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200237 initial Q <= 1'b0;
238
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800239 always @*
240 begin
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200241 if (!R)
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800242 Q <= 1'b0;
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200243 else if (!S)
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800244 Q <= 1'b1;
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200245 else if (E && G)
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800246 Q <= D;
247 end
rakeshm3611e4b2022-11-15 07:06:08 -0800248
249 specify
250 (posedge G => (Q +: D)) = 0;
251 $setuphold(posedge G, D, 0, 0);
252 $setuphold(posedge G, E, 0, 0);
253 $setuphold(posedge G, R, 0, 0);
254 $setuphold(posedge G, S, 0, 0);
255 endspecify
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200256
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800257endmodule
258
259(* abc9_flop, lib_whitebox *)
260module latchnsre (
261 output reg Q,
Paweł Czarnecki931a2f52022-04-14 14:01:33 +0200262 input wire S,
263 input wire R,
264 input wire D,
265 input wire G,
266 input wire E
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800267);
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200268 initial Q <= 1'b0;
269
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800270 always @*
271 begin
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200272 if (!R)
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800273 Q <= 1'b0;
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200274 else if (!S)
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800275 Q <= 1'b1;
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200276 else if (E && !G)
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800277 Q <= D;
278 end
rakeshm3611e4b2022-11-15 07:06:08 -0800279
280 specify
281 (negedge G => (Q +: D)) = 0;
282 $setuphold(negedge G, D, 0, 0);
283 $setuphold(negedge G, E, 0, 0);
284 $setuphold(negedge G, R, 0, 0);
285 $setuphold(negedge G, S, 0, 0);
286 endspecify
Maciej Kurcf4bb47e2022-06-07 11:44:48 +0200287
Tarachand Pagarani3e6e3992021-11-21 23:53:26 -0800288endmodule
289