The startup FSMs for RX and TX check that tx|rxoutclk is present before releasing the reset of the MMCM. This is done through one FF for pmaresetdone which is clocked directly with tx|rxoutclk.
The reset for the MMCM is only necessary when a MMCM is really used or has to be used. This reset is not used when using only BUFG/BUFH to generate the USRCLKs.
The usage of tx|rxoutclk directly infers BUFHCE as tx|rxoutclk have no direct clocking route path to FF.
So, for example, a 10 lane core which uses just one BUFG to generate TX|RXUSRCLK and TX|RXUSRCLK2, as they are the same frequency, will infer 20 BUFHCE which clock just 20 FF.
In another example, a 10 lane core with separate clocking for RX and TX, and the need of MMCM, would normally use 6 BUFG/BUFH and 2 MMCM, but it still infers the 20 BUFHCE which clock just 20 FF.
This is unnecessary and can cause congestion in real designs.
If a design runs into congestion errors due to clock routing, or runs out of clocking resources due to the inferred BUFHCE, the following can be done:
Cores, which use only BUFG/BUFH for the USRCLK generation, could use the USRCLK at the TX|RXOUTCLK input of the startup FSM (--> no additional BUFHCE inferred).
The change could be similar to the change with MMCM below, but just in the *_init module the connections to the TX|RXOUTCLK inputs of all startup FSMs needs to be changed similar to the following:
' .TXOUTCLK (gt0_txusrclk_in), '
For a multi lane core, the easiest way for the change here would be within the *_startup_fsm modules by replacing TX|RXOUTCLK with TX|RXUSRCLK in the code.
Here is an example for the *_tx_startup_fsm.v:
always @(posedge TXOUTCLK,posedge gttxreset_i)
begin
if(gttxreset_i == 1'b1)
txpmaresetdone_i <= `DLY 1'b0;
else
txpmaresetdone_i <= `DLY TXPMARESETDONE;
end
----------->
always @(posedge TXUSRCLK,posedge gttxreset_i)
begin
if(gttxreset_i == 1'b1)
txpmaresetdone_i <= `DLY 1'b0;
else
txpmaresetdone_i <= `DLY TXPMARESETDONE;
end
For cores, using an MMCM, only the tx|rxoutclk which drives the MMCM would be necessary to check. It would not be necessary to check tx|rxoutclk of each lane separately. The used tx|rxoutclk usually uses a BUG/BUFH to drive the input of a MMCM. The output of this BUFG/BUFH could be used to drive the TX|RXOUTCLK inputs of the startup FSMs; with this, there would also be no further BUFHCE inferred.
In the following example design, several modules need to be changed:
*_clock_module:
define clkin1 (output of the BUFG driving the MMCM) as output
*_gt_usrclk_source:
define clkin1 as output and connect to *_clock_module
*_support:
connect clkin1 from *_gt_usrclk_source to *_init
*_init:
define clkin1 as input and connect to TX|RXOUTCLK inputs of all startup FSMs
here one example for TX again:
.TXOUTCLK (gt0_txoutclk_i),
------------->
.TXOUTCLK (clkin1),
AR# 58608 | |
---|---|
日期 | 01/16/2014 |
状态 | Active |
Type | 综合文章 |
器件 | |
IP |