Не усложняйте себе жизнь.
NET "rx_clk" CLOCK_DEDICATED_ROUTE = FALSE;
NET "rx_clk" TNM_NET = rx_clk;
TIMESPEC TS_rx_clk = PERIOD "rx_clk" 8 ns HIGH 50%;
NET "rx_clk" LOC = "AP11" ;
NET "rx_dv" LOC = "AM13";
INST "rx_dv_reg" LOC = ILOGIC_X2Y48;
NET "rx_data(0)" LOC = "AN13";
NET "rx_data(1)" LOC = "AF14";
NET "rx_data(2)" LOC = "AE14";
NET "rx_data(3)" LOC = "AN12";
NET "rx_data(4)" LOC = "AM12";
NET "rx_data(5)" LOC = "AD11";
NET "rx_data(6)" LOC = "AC12";
NET "rx_data(7)" LOC = "AC13";
Это все констрейны, которые я описывал для RX. Плюс ещё rx_data заводил на IDDR, для того, чтобы явно не указывать на лапы(к тому же, предполагается использовать RGMII). Всё чётко работает.
Вы же своим INST "*gmii_tx_er_reg" IOB = true; явно указываете имплементатору на расположение триггеров, а потом ещё пытаетесь его заставит выполнить свои пожелания TIMEGRP "IN_GMII" OFFSET = IN 2.5 ns VALID 3 ns BEFORE COMP "Phy_RxClk";
Надо выбрать что-либо одно)