11-13-2020 12:43 PM
This is how I buffer an external clock into the FPGA global clock tree.
IBUFG #(.IBUF_LOW_PWR("FALSE"), // Low power="TRUE", Highest performance="FALSE"
.IOSTANDARD("LVCMOS18")) // Specify the input I/O standard
IBUFG_inst (.O(clk_out), // Clock buffer output
.I(clk_in)); // Clock buffer input (connect directly to top-level port)
When I synthesize the design I get this warning:
[Netlist 29-432] The IBUFG primitive 'clkINPUT0/IBUFG_inst' has been retargeted to an IBUF primitive only. No BUFG will be added. If a global buffer is intended, please instantiate an available global clock primitive from the current architecture.
Why does this happen? Does it matter?
11-13-2020 12:57 PM
Which FPGA family?
If I remember right, that was an one old way of doing effectively IBUF -> BUFG - and maybe making sure the placer gave you a GCLK input. Maybe in the original Virtex and Spartan-II days, but wouldn't swear to it.
IBUFG isn't a valid primitive type for 7 series - see UG953. So it looks like it is converting it to the closest thing (IBUF). And then expecting you to add the BUFG if you that's what you wanted... Why didn't it do it for you? - not sure but I suspect it is because there are a lot more options (BUFR, BUFH, BUFIO) that there used to be.
Cheers,
bt
11-13-2020 12:57 PM
Which FPGA family?
If I remember right, that was an one old way of doing effectively IBUF -> BUFG - and maybe making sure the placer gave you a GCLK input. Maybe in the original Virtex and Spartan-II days, but wouldn't swear to it.
IBUFG isn't a valid primitive type for 7 series - see UG953. So it looks like it is converting it to the closest thing (IBUF). And then expecting you to add the BUFG if you that's what you wanted... Why didn't it do it for you? - not sure but I suspect it is because there are a lot more options (BUFR, BUFH, BUFIO) that there used to be.
Cheers,
bt
11-13-2020 01:13 PM
I'm using a Kintex-7 device: xc7k160t-2ffg676.
wire clk_int;
//IBUF: Single-ended Input Buffer
IBUF#(.IBUF_LOW_PWR("FALSE"), // Low power="TRUE", Highest performance="FALSE"
.IOSTANDARD("LVCMOS18")) // Specify the input I/O standard
IBUF_inst (.O(clk_int), // Clock buffer output
.I(clk_in)); // Clock buffer input (connect directly to top-level port)
// BUFG: Global Clock Simple Buffer
BUFG BUFG_inst (.O(clk_out), // 1-bit output: Clock output
.I(clk_int)); // 1-bit input: Clock input
This returns no synthesis warning, and should do what I want.
I guess I was using an old libraries guide. I got IBUFG from page 152 of the 7 series libraries HDL. I'll use the updated guide you mentioned. I didn't realize there was a newer one. Thanks.
11-15-2020 03:23 PM
Take a look at this post on the IBUFG - there is no "real physical cell" called an IBUFG - it is simply a coding shortcut for an IBUF that (in earlier families) would give an error message if it was LOC'ed to anything other than a clock capable site. It is still legal to use the IBUFG in all technologies, but it is (and should be) mapped to an IBUF after synthesis.
Avrum