0

在 Lattice Verilog FPGA 设计中,我有两个 PLL 生成的时钟,频率相同,为 125MHz (8ns),但第二个时钟与第一个时钟相移 90°:

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]));
...

设计非常拥挤,我得到所有 wbuf 的以下 HOLD 错误:

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

我如何将两个时钟之间的这条路径限制在彼此成 90° 的位置,以关闭我的设计时序?强制 wbuf 保持 2ns(8ns 的 90°)是否有意义,我如何通过时序约束来实现?

4

1 回答 1

1

一些想法,虽然我不会声称它是答案,但作为答案发布比作为评论发布更好的结构;-)

两个上升沿之间只有 2 ns 的时间可能太短,无法实现时序收敛,因为 wbuf 触发器 (FF) 位于主逻辑中,其中 DDR ODDRXE 位于 IO 边缘。

根据您在实际设计中可以做什么,有几种可能性:

  • 在 clk 的下降沿重新捕获 wbuf 数据,这为直接触发器 (FF) 传输提供 4 ns,然后将重新捕获的值用于 clk90,从而获得 6 ns(270 度)
  • 在 clk90 上重新捕获 FF 中的 wbuf 数据,然后将重新捕获的值馈送到 clk90 处的 ODDRXE,虽然它只提供 2 ns 用于重新捕获,但重新捕获是在主逻辑中完成的,因此不在主逻辑和边缘 DDR 之间
  • 将时钟 clk90 更改为时钟 clk270,然后重新对齐 DDR ODDRXE 的数据以进行相应匹配,这将在 DDR ODDRXE 的上升沿捕获 DDR 输入数据之前提供 6 ns
  • 将 wbuf 逻辑移至 clk90,从而在主逻辑内部获得 clk 和 clk90 之间的时钟域交叉,同时将 wbuf 直接用于 DDR ODDRXE
于 2022-02-26T09:39:49.970 回答