I have a board with a Lattice ICE40 5LP1K FPGA that does some small jobs like handling communication protocol and some IOs. My problem is that I cannot compile the project as the IceCube tells me

I2709: Tool unable to complete IOPlacement for the design
E2694: PLL: pll_inst.pll_pll_inst could not be placed
E2693: PLL placement is infeasible for the design

I'm using a PLL of type SB_PLL40_2F_CORE

Now if I free up the global buffer G0 PIOT_46B (exclude it from the pin assignment file) everything works fine. So I assume the PLL requires a global buffer to be placed, but I'm using pin PIOT_46B as a normal LVCMOS IO, does this also occupy the global buffer? My Clock is on PIOB_3b.

Freeing up any other global buffer pin doesn't solve my problem, it has to be this specific one as it seems.

I further found some information that it would may help to use SB_PLL40_2F_PAD instead of _CORE but that's only supported for clock inputs on bank0 or 2 but mine is placed on bank3.

Is there any solution/explanation for this issue or do I have to change my board routing to be able to free up PIOT_46B?

Edit It appears that only inputs are not supported, if I define PIOT_46B to be an output the design can be synthesized. But so far I don't understand the phenomenon.

  • \$\begingroup\$ I'd look at the routing map if the lattice software generates one, odds are your running out of some global resource like a wire because there are too many signals using global resources and it's trying to route the PLL signal on the global wires that are connected to all the blocks. \$\endgroup\$
    – Voltage Spike
    Commented Mar 21, 2019 at 15:01
  • \$\begingroup\$ It generates a placer output file but I don't know if that contains any useful information regarding my issue. What I figured out according to PLL User Guide is that it works if PIOT_46b is used as an output.I just don't understand what all my GBs are used up for... \$\endgroup\$
    – po.pe
    Commented Mar 25, 2019 at 7:53
  • \$\begingroup\$ Here's the correct document link PLL User Guide \$\endgroup\$
    – po.pe
    Commented Mar 25, 2019 at 8:00
  • \$\begingroup\$ Someone ever faced the same issue? If I know there's nothing I can do about it I at least know that I have to change my PCB. \$\endgroup\$
    – po.pe
    Commented Mar 26, 2019 at 8:11

2 Answers 2


I remember that I had some trouble with the PLL instantiation (SB_PLL40_CORE) for a ICE40UL1K-CM36A. IIRC it was the combination of "which input and output to use". In my case the solution was to avoid PLLOUTCORE and use PLLOUTGLOBAL instead. I think I let the tool decide where to place the clock and locked that pin (F2) later.

So my recommendation: check if different combination of CORE vs GLOBAL make any difference if this does not help let the tool decide where to place the clkin pin. Maybe you are lucky and there is another pin which is not G6 and the tool is fine with.


I just ran into this today and found that the problem was that I assigned pin A6 (on the C132 package of ICE40HX8K) named IOT_198_GBIN0 to an input. If I changed that pin to an output (or used a different non-global input) then the problem of not being able to place the PLL went away. I use the GLOBAL output of the PLL since this is the main clock for my tiny example.

Kind of a bummer that the tool does not offer an easy solution to the problem (or solve the problem itself). I use none of the other 8 global pins except GBIN5 which is being used as the clock input. There are two PLLs in this device so if that pin is really tied to a particular PLL, it seems that the other PLL could have been used without me knowing what is going on. Maybe that is not possible since the PLL is tied to a particular global input. I learn something new every day with this device and tools.

The most painful thing I learned about global resources was that I needed to add this syn_global_buffers magic after my top level module to get the design to place. For example:

module Gpu(
     input  Clk
    ,input  nRst
    ,output[7:0] Led
    ,input UsbRx    
    ,output UsbTx
    ,output[7:0] Debug
)    /* synthesis syn_global_buffers = 4 */ ;
  • \$\begingroup\$ As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center. \$\endgroup\$
    – Community Bot
    Commented Oct 29, 2023 at 20:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.