In a Lattice Verilog FPGA design, I have two PLL-generated clocks at the same frequency 125MHz (8ns) but the second clock is at 90° shift of the first clock:
wire clk;
wire clk90; //clk90 is clk with phase at 90°
pllm pllm_inst(.CLKI(oscInternal), .CLKOP(clk), .CLKOS(clk90));
reg [63:0] wbuf;
always @(posedge clk) begin
wbuf <= wbuf + 1;//Fake logic
end
wire [31:0] sdram_dq_tx;
ODDRXE ODDRXE00_inst(.D0(wbuf[0]), .D1(wbuf[16]), .SCLK(clk90), .RST(1'b0), .Q(sdram_dq_tx[0]));
...
The design is very crowded and I get the following HOLD errors for all wbuf:
Error: The following path exceeds requirements by 1.585ns
Logical Details: Cell type Pin type Cell/ASIC name (clock net +/-)
Source: FF Q sdram_inst/wbuf[0] (from clkop +)
Destination: FF Data in sdram_inst/ODDRXE00_inst (to clkop2 +)
Delay: 0.380ns (34.5% logic, 65.5% route), 1 logic levels.
Constraint Details:
0.380ns physical path delay sdram_inst/SLICE_1029 to ddr_Dq[0]_MGIOL exceeds
-0.011ns DO_HLD and
0.000ns delay constraint less
-1.976ns skew less
0.000ns feedback compensation requirement (totaling 1.965ns) by 1.585ns
How could I constraint this path between the two clocks at 90° of each other in order to close the timing of my design? Would it make sense to force on wbuf a hold of 2ns (90° of 8ns) and how can I achieve that with a timing constraint?