module retention_cell (B1, B2B, CK, D, Q, RD, SE, SI); reg Q1, QN1; wire Q1_clear, Q1_preset; reg Q2, QN2; input B1; input B2B; input CK; input D; output Q; assign Q = Q1; // "Q1" input RD; input SE; input SI; always @(posedge CK, posedge Q1_clear, posedge Q1_preset) begin if (Q1_clear) begin Q1 <= 0; end else if (Q1_preset) begin Q1 <= 1; end else begin Q1 <= ((D&(~SE))|(SI&SE)); end end always @(posedge CK, posedge Q1_clear, posedge Q1_preset) begin if (Q1_clear) begin QN1 <= 1; end else if (Q1_preset) begin QN1 <= 0; end else begin QN1 <= ~(((D&(~SE))|(SI&SE))); end end assign Q1_clear = (((~B2B)&(~Q2))|(~RD)); assign Q1_preset = ((~B2B)&Q2); always @* begin if (B1) begin Q2 <= Q1; QN2 <= ~(Q1); end end endmodule