| module oddr_wrapper ( | |
| input wire C, | |
| input wire OCE, | |
| input wire S, | |
| input wire R, | |
| input wire D1, | |
| input wire D2, | |
| output wire OQ | |
| ); | |
| parameter USE_PHY_ODDR = 0; | |
| parameter SRTYPE = "SYNC"; | |
| parameter INIT = 0; | |
| parameter DDR_CLK_EDGE = "OPPOSITE_EDGE"; | |
| // Use a physical ODDR block | |
| generate if (USE_PHY_ODDR != 0) begin | |
| ODDR # ( | |
| .SRTYPE (SRTYPE), | |
| .INIT (INIT), | |
| .DDR_CLK_EDGE (DDR_CLK_EDGE) | |
| ) the_oddr ( | |
| .C (C), | |
| .CE (OCE), | |
| .S (S), | |
| .R (R), | |
| .D1 (D1), | |
| .D2 (D2), | |
| .Q (OQ) | |
| ); | |
| // Simulate ODDR behavior using logic | |
| // TODO: Reset/Set SYNC/ASYNC | |
| end else begin | |
| reg q1; | |
| reg q2; | |
| initial q1 <= INIT; | |
| initial q2 <= INIT; | |
| // OPPOSITE_EDGE | |
| if(DDR_CLK_EDGE == "OPPOSITE_EDGE") begin | |
| always @(posedge C) | |
| if (OCE) | |
| q1 <= D1; | |
| always @(negedge C) | |
| if (OCE) | |
| q2 <= D2; | |
| // SAME_EDGE | |
| end else if (DDR_CLK_EDGE == "SAME_EDGE" || DDR_CLK_EDGE == "SAME_EDGE_PIPELINED") begin | |
| always @(posedge C) | |
| if (OCE) | |
| q1 <= D1; | |
| always @(posedge C) | |
| if (OCE) | |
| q2 <= D2; | |
| end | |
| // Use clock as a mux select FIXME: This shouldn't be done this way! | |
| assign OQ = (C) ? q1 : q2; | |
| end endgenerate | |
| endmodule |