|  | `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 |