blob: 4a12be62fb35ab8aae5dba8f340723241879ba75 [file] [log] [blame] [edit]
`timescale 1ps/1ps
(* FASM_PARAMS="ZINV.QCK=Z_QCKS" *)
(* whitebox *)
module Q_FRAG (QCK, QST, QRT, QEN, QZ, QD, CONST0, CONST1);
(* CLOCK *)
(* clkbuf_sink *)
input wire QCK;
// Cannot model timing, VPR currently does not support async SET/RESET
(* SETUP="QCK 1e-10" *) (* NO_COMB *)
input wire QST;
// Cannot model timing, VPR currently does not support async SET/RESET
(* SETUP="QCK 1e-10" *) (* NO_COMB *)
input wire QRT;
// No timing for QEN -> QZ in LIB/SDF
(* SETUP="QCK {setup_QCK_QEN}" *) (* NO_COMB *)
(* HOLD="QCK {hold_QCK_QEN}" *) (* NO_COMB *)
input wire QEN;
// QD can either go to CZI or QDI.
// There is no setup/hold for CZI -> QZ. Instead there are setup/hold
// constraints for other LOGIC inputs. Use the same timing as for QDI
(* SETUP="QCK {setup_QCK_QDI}" *) (* NO_COMB *)
(* HOLD="QCK {hold_QCK_QDI}" *) (* NO_COMB *)
input wire QD;
// CONST0 and CONST1 are always connected to 0 and 1 respectively. Even
// thouth they are routed through the QDS input of the LOGIC cell there
// is no need for timing specification for them.
(* NO_COMB *)
input wire CONST0;
(* NO_COMB *)
input wire CONST1;
// The output
(* CLK_TO_Q = "QCK {iopath_QCK_QZ}" *)
output reg QZ;
specify
// FIXME: VPR recognizes only posedges
(posedge QCK => (QZ +: QD)) = 0;
$setup(QD, posedge QCK, "");
$hold(posedge QCK, QD, "");
$setup(QST, posedge QCK, "");
$hold(posedge QCK, QST, "");
$setup(QRT, posedge QCK, "");
$hold(posedge QCK, QRT, "");
$setup(QEN, posedge QCK, "");
$hold(posedge QCK, QEN, "");
$setup(CONST0, posedge QCK, "");
$hold(posedge QCK, CONST0, "");
$setup(CONST1, posedge QCK, "");
$hold(posedge QCK, CONST1, "");
endspecify
// Parameters
parameter [0:0] Z_QCKS = 1'b1;
// The flip-flop model
initial QZ <= 1'b0;
generate if (Z_QCKS == 1'b1) begin
always @(posedge QCK or posedge QST or posedge QRT) begin
if (QST)
QZ <= 1'b1;
else if (QRT)
QZ <= 1'b0;
else if (QEN)
QZ <= QD;
end
end else begin
always @(negedge QCK or posedge QST or posedge QRT) begin
if (QST)
QZ <= 1'b1;
else if (QRT)
QZ <= 1'b0;
else if (QEN)
QZ <= QD;
end
end endgenerate
endmodule