TIMING-14#1 Critical Warning
LUT on the clock tree
The LUT xxx has been found on the clock tree. Run opt_design to optimize the clock trees.
아래 구문과 같이 clock_sel신호로 클럭을 선택해서 클럭을 출력하면 TIMING-14의 치명적인 경고가 발생합니다.
signal clock_out : std_logic;
signal clock_sel : std_logic;
signal clock_nsel : std_logic;
clock_sel <= ‘1’;
clock_nsel <= not(clock_sel);
clock_out <= clock_10MHz when(clock_sel = ‘1’) else clock_20MHz;
해결방법 : 전용 클럭버퍼를 사용한다. (BUFG, BUFGCE, BUFGCTRL, BUFGMUX 등)
Artix에서는 BUFGMUX는 지원 안함.
<다른 클럭중 하나를 선택하는 경우>
Library UNISIM;
use UNISIM.vcomponents.all;
-----------------------------------
signal clock_out : std_logic;
signal clock_sel : std_logic;
signal clock_nsel : std_logic;
-----------------------------------
-- TIMING-14 Critical Warning
-- clock_out <= clock_20Mhz when(clock_sel = ‘0’) else clock_10Mhz;
clock_sel <= ‘1’;
clock_nsel <= not(clock_sel);
BUFGCTRL_inst : BUFGCTRL
generic map (
INIT_OUT => 0, -- Initial value of BUFGCTRL output, 0-1
PRESELECT_I0 => FALSE, -- BUFGCTRL output uses I0 input, FALSE, TRUE
PRESELECT_I1 => FALSE, -- BUFGCTRL output uses I1 input, FALSE, TRUE
-- Programmable Inversion Attributes: Specifies built-in programmable inversion on specific pins
IS_CE0_INVERTED => '0', -- Optional inversion for CE0
IS_CE1_INVERTED => '0', -- Optional inversion for CE1
IS_I0_INVERTED => '0', -- Optional inversion for I0
IS_I1_INVERTED => '0', -- Optional inversion for I1
IS_IGNORE0_INVERTED => '0', -- Optional inversion for IGNORE0
IS_IGNORE1_INVERTED => '0', -- Optional inversion for IGNORE1
IS_S0_INVERTED => '0', -- Optional inversion for S0
IS_S1_INVERTED => '0', -- Optional inversion for S1
SIM_DEVICE => "VERSAL_PRIME" -- VERSAL_PRIME, VERSAL_PRIME_ES1
)
port map (
O => clock_out, -- 1-bit output: Clock output
CE0 => ‘1’, -- 1-bit input: Clock enable input for I0
CE1 => ‘1’, -- 1-bit input: Clock enable input for I1
I0 => clock_10MHz, -- 1-bit input: Primary clock
I1 => clock_20MHz, -- 1-bit input: Secondary clock
IGNORE0 => ‘0’, -- 1-bit input: Clock ignore input for I0
IGNORE1 => ‘0’, -- 1-bit input: Clock ignore input for I1
S0 => clock_sel, -- 1-bit input: Clock select for I0
S1 => clock_nsel -- 1-bit input: Clock select for I1
);
<클럭 선택이 ‘0’일 경우 ‘0’을 출력하고 ‘1’일때만 클럭을 출력하는 경우>
Library UNISIM;
use UNISIM.vcomponents.all;
signal clk_sel : std_logic;
signal clk_out : std_logic;
-- TIMING-14 Critical Warning
-- clk_out <= ‘0’ when(clk_out = ‘0’) else clock_10Mhz;
BUFGCE_inst : BUFGCE
generic map (
CE_TYPE => “SYNC”, -- ASYNC, HARDSYNC, SYNC
IS_CE_INVERTED => ‘0’, -- Programmable inversion on CE
IS_I_INVERTED => ‘0’, -- Programmable inversion on I
SIM_DEVICE => “VERSAL_PRIME” -- VERSAL_PRIME, VERSAL_PRIME_ES1
)
port map (
O => clk_out, -- 1-bit output: Buffer
CE => clk_sel, -- 1-bit input: Buffer enable
I => clock_10Mhz -- 1-bit input: Buffer
);
<BUFG>
Primitive: General Clock Buffer
- PRIMITIVE_GROUP: CLOCK
- PRIMITIVE_SUBGROUP: BUFFER
소개
이 설계 요소는 신호의 낮은 스큐 분포를 위해 신호를 글로벌 라우팅 리소스에 연결하는 높은 팬아웃 버퍼입니다. BUFG는 일반적으로 클럭 네트뿐만 아니라 셋, 리셋 및 클럭 인에이블과 같은 팬아웃이 높은 다른 네트에도 사용됩니다.
포트설명
Port | Direction | Width | Function |
I | Input | 1 | Clock input. |
O | Output | 1 | Clock output. |
VHDL Instantiation Template
Library UNISIM;
use UNISIM.vcomponents.all;
-- BUFG: General Clock Buffer
-- Versal Prime series
-- Xilinx HDL Language Template, version 2022.2
BUFG_inst : BUFG
port map (
O => O, -- 1-bit output: Clock output.
I => I -- 1-bit input: Clock input.
);
-- End of BUFG_inst instantiation
Verilog Instantiation Template
// BUFG: General Clock Buffer
// Versal Prime series
// Xilinx HDL Language Template, version 2022.2
BUFG BUFG_inst (
.O(O), // 1-bit output: Clock output.
.I(I) // 1-bit input: Clock input.
);
// End of BUFG_inst instantiation
<BUFGCE>
Primitive: General Clock Buffer with Clock Enable
- PRIMITIVE_GROUP: CLOCK
- PRIMITIVE_SUBGROUP: BUFFER
소개
이 설계 요소는 단일 게이트 입력이 있는 일반 클록 버퍼입니다. 클록 활성화(CE)가 ‘0’일 때 O 출력은 0입니다. CE가 ‘1’이면 I 입력이 O 출력으로 전송됩니다.
Logic Table
Inputs | Outputs | |
I | CE | O |
X | 0 | 0 |
I | 1 | I |
Port Descriptions
Port | Direction | Width | Function |
CE | Input | 1 | Clock buffer active-High enable. |
I | Input | 1 | Buffer input. |
O | Output | 1 | Buffer output. |
Available Attributes
Attribute | Type | Allowed Values | Default | Description |
CE_TYPE | STRING | "SYNC", "ASYNC", "HARDSYNC" | "SYNC" | 활성화가 동기식(결함 없음) 또는 비동기식(입력 클록 전환 필요 없음)인지 여부를 지정합니다. Versal 장치에는 HARDSYNC 설정을 사용하여 활성화할 수 있는 선택적 강화 동기화 회로가 있습니다. |
IS_CE_INVERTED | BINARY | 1'b0 to 1'b1 | 1'b0 | CE 핀에서 프로그래밍 가능한 반전의 사용을 지정합니다. |
IS_I_INVERTED | BINARY | 1'b0 to 1'b1 | 1'b0 | I 핀에서 프로그래밍 가능한 반전의 사용을 지정합니다. |
SIM_DEVICE | STRING | "VERSAL_PRIME", "VERSAL_PRIME_ES1", "VERSAL_PRIME_ES2" | "ULTRASCALE" | 버전 설정 |
VHDL Instantiation Template
Library UNISIM;
use UNISIM.vcomponents.all;
-- BUFGCE: General Clock Buffer with Clock Enable
-- Versal Prime series
-- Xilinx HDL Language Template, version 2022.2
BUFGCE_inst : BUFGCE
generic map (
CE_TYPE => “SYNC”, -- ASYNC, HARDSYNC, SYNC
IS_CE_INVERTED => ‘0’, -- Programmable inversion on CE
IS_I_INVERTED => ‘0’, -- Programmable inversion on I
SIM_DEVICE => “VERSAL_PRIME” -- VERSAL_PRIME, VERSAL_PRIME_ES1
)
port map (
O => O, -- 1-bit output: Buffer
CE => CE, -- 1-bit input: Buffer enable
I => I -- 1-bit input: Buffer
);
-- End of BUFGCE_inst instantiation
Verilog Instantiation Template
// BUFGCE: General Clock Buffer with Clock Enable
// Versal Prime series
// Xilinx HDL Language Template, version 2022.2
BUFGCE #(
.CE_TYPE("SYNC"), // ASYNC, HARDSYNC, SYNC
.IS_CE_INVERTED(1'b0), // Programmable inversion on CE
.IS_I_INVERTED(1'b0), // Programmable inversion on I
.SIM_DEVICE("VERSAL_PRIME") // VERSAL_PRIME, VERSAL_PRIME_ES1
)
BUFGCE_inst (
.O(O), // 1-bit output: Buffer
.CE(CE), // 1-bit input: Buffer enable
.I(I) // 1-bit input: Buffer
);
// End of BUFGCE_inst instantiation
<BUFGCTRL>
Primitive: General Clock Control Buffer
- PRIMITIVE_GROUP: CLOCK
- PRIMITIVE_SUBGROUP: MUX
소개
BUFGCTRL 프리미티브는 2개의 클록 입력이 있는 동기/비동기 "glitch-free" 2:1 멀티플렉서로 설계된 일반 클록 버퍼입니다. 클록 멀티플렉싱이 필요하지 않은 경우 BUFG 또는 BUFGCE 구성 요소를 사용해야 합니다.
Port Descriptions
Port | Direction | Width | Function |
CE0 | Input | 1 | I0 클록 입력에 대한 클록 활성화 입력. 이 입력을 활성화하기 위해 CE0 핀을 사용할 때 설정/유지 시간이 보장되어야 합니다. 이 요구 사항을 충족하지 못하면 클럭 글리치가 발생할 수 있습니다. |
CE1 | Input | 1 | I1 클록 입력을 위한 클록 활성화 입력. 이 입력을 활성화하기 위해 CE1 핀을 사용할 때 설정/유지 시간이 보장되어야 합니다. 이 요구 사항을 충족하지 못하면 클럭 글리치가 발생할 수 있습니다. |
IGNORE0 | Input | 1 | I0 입력에 대한 클럭 무시 입력. IGNORE 핀을 어설션하면 BUFGCTRL이 두 클록 입력 간 전환 조건을 감지하지 못합니다. 즉, IGNORE를 어설션하면 선택 핀이 변경되는 순간 MUX가 입력을 전환하게 됩니다. IGNORE0은 선택 핀이 변경될 때 즉시 출력이 I0 입력에서 전환되도록 하는 반면, IGNORE1은 선택 핀이 변경될 때 즉시 출력이 I1 입력에서 전환되도록 합니다. |
IGNORE1 | Input | 1 | 클럭은 I1 입력에 대한 입력을 무시합니다. IGNORE 핀을 어설션하면 BUFGCTRL이 두 클록 입력 간 전환 조건을 감지하지 못합니다. 즉, IGNORE를 어설션하면 선택 핀이 변경되는 순간 MUX가 입력을 전환하게 됩니다. IGNORE0은 선택 핀이 변경될 때 즉시 출력이 I0 입력에서 전환되도록 하는 반면, IGNORE1은 선택 핀이 변경될 때 즉시 출력이 I1 입력에서 전환되도록 합니다. |
I0 | Input | 1 | CE0 입력에 의해 활성화되고 S0 입력에 의해 선택되는 BUFGCTRL에 대한 기본 클록 입력. |
I1 | Input | 1 | CE1 입력에 의해 활성화되고 S1 입력에 의해 선택된 BUFGCTRL로의 보조 클록 입력. |
O | Output | 1 | 클럭 출력 |
S0 | Input | 1 | I0에 대한 클록 선택 입력. S 핀은 각 클럭 입력에 대한 클럭 선택 핀을 나타냅니다. S 핀을 입력 선택으로 사용하는 경우 설정/유지 시간 요구 사항이 있습니다. CE 핀과 달리 이 요구 사항을 충족하지 못해도 클록 글리치가 발생하지 않습니다. 그러나 출력 클럭이 한 클럭 주기 후에 나타날 수 있습니다. |
S1 | Input | 1 | I1에 대한 클록 선택 입력. S 핀은 각 클럭 입력에 대한 클럭 선택 핀을 나타냅니다. S 핀을 입력 선택으로 사용하는 경우 설정/유지 시간 요구 사항이 있습니다. CE 핀과 달리 이 요구 사항을 충족하지 못해도 클록 글리치가 발생하지 않습니다. 그러나 출력 클럭이 한 클럭 주기 후에 나타날 수 있습니다. |
Available Attributes
Attribute | Type | Allowed Values | Default | Description |
INIT_OUT | DECIMAL | 0, 1 | 0 | 구성 후 BUFGCTRL 출력을 지정된 값으로 초기화합니다. |
PRESELECT_I0 | BOOLEAN | FALSE, TRUE | FALSE | TRUE인 경우 BUFGCTRL 출력은 구성 후 I0 입력을 사용합니다. |
PRESELECT_I1 | BOOLEAN | FALSE, TRUE | FALSE | TRUE인 경우 BUFGCTRL 출력은 구성 후 I1 입력을 사용합니다. |
SIM_DEVICE | STRING | "VERSAL_PRIME", "VERSAL_PRIME_ES1", "VERSAL_PRIME_ES2" | "ULTRASCALE" | 버전 설정 |
IS_CE0_INVERTED | BINARY | 1'b0 to 1'b1 | 1'b0 | 이 구성 요소의 CE0 핀에서 선택적 반전을 사용할지 여부를 지정합니다. |
IS_CE1_INVERTED | BINARY | 1'b0 to 1'b1 | 1'b0 | 이 구성 요소의 CE1 핀에서 선택적 반전을 사용할지 여부를 지정합니다. |
IS_IGNORE0_INVERTED | BINARY | 1'b0 to 1'b1 | 1'b0 | 이 구성 요소의 IGNORE0 핀에서 선택적 반전을 사용할지 여부를 지정합니다. |
IS_IGNORE1_INVERTED | BINARY | 1'b0 to 1'b1 | 1'b0 | 이 구성 요소의 IGNORE1 핀에서 선택적 반전을 사용할지 여부를 지정합니다. |
IS_I0_INVERTED | BINARY | 1'b0 to 1'b1 | 1'b0 | 이 구성 요소의 I0 핀에서 선택적 반전을 사용할지 여부를 지정합니다. |
IS_I1_INVERTED | BINARY | 1'b0 to 1'b1 | 1'b0 | 이 구성 요소의 I1 핀에서 선택적 반전을 사용할지 여부를 지정합니다. |
IS_S0_INVERTED | BINARY | 1'b0 to 1'b1 | 1'b0 | 이 구성 요소의 S0 핀에서 선택적 반전을 사용할지 여부를 지정합니다. |
IS_S1_INVERTED | BINARY | 1'b0 to 1'b1 | 1'b0 | 이 구성 요소의 S1 핀에서 선택적 반전을 사용할지 여부를 지정합니다. |
VHDL Instantiation Template
Library UNISIM;
use UNISIM.vcomponents.all;
-- BUFGCTRL: General Clock Control Buffer
-- Versal Prime series
-- Xilinx HDL Language Template, version 2022.2
BUFGCTRL_inst : BUFGCTRL
generic map (
INIT_OUT => 0, -- Initial value of BUFGCTRL output, 0-1
PRESELECT_I0 => FALSE, -- BUFGCTRL output uses I0 input, FALSE, TRUE
PRESELECT_I1 => FALSE, -- BUFGCTRL output uses I1 input, FALSE, TRUE
-- Programmable Inversion Attributes: Specifies built-in programmable inversion on specific pins
IS_CE0_INVERTED => '0', -- Optional inversion for CE0
IS_CE1_INVERTED => '0', -- Optional inversion for CE1
IS_I0_INVERTED => '0', -- Optional inversion for I0
IS_I1_INVERTED => '0', -- Optional inversion for I1
IS_IGNORE0_INVERTED => '0', -- Optional inversion for IGNORE0
IS_IGNORE1_INVERTED => '0', -- Optional inversion for IGNORE1
IS_S0_INVERTED => '0', -- Optional inversion for S0
IS_S1_INVERTED => '0', -- Optional inversion for S1
SIM_DEVICE => "VERSAL_PRIME" -- VERSAL_PRIME, VERSAL_PRIME_ES1
)
port map (
O => O, -- 1-bit output: Clock output
CE0 => CE0, -- 1-bit input: Clock enable input for I0
CE1 => CE1, -- 1-bit input: Clock enable input for I1
I0 => I0, -- 1-bit input: Primary clock
I1 => I1, -- 1-bit input: Secondary clock
IGNORE0 => IGNORE0, -- 1-bit input: Clock ignore input for I0
IGNORE1 => IGNORE1, -- 1-bit input: Clock ignore input for I1
S0 => S0, -- 1-bit input: Clock select for I0
S1 => S1 -- 1-bit input: Clock select for I1
);
-- End of BUFGCTRL_inst instantiation
Verilog Instantiation Template
// BUFGCTRL: General Clock Control Buffer
// Versal Prime series
// Xilinx HDL Language Template, version 2022.2
BUFGCTRL #(
.INIT_OUT(0), // Initial value of BUFGCTRL output, 0-1
.PRESELECT_I0("FALSE"), // BUFGCTRL output uses I0 input, FALSE, TRUE
.PRESELECT_I1("FALSE"), // BUFGCTRL output uses I1 input, FALSE, TRUE
// Programmable Inversion Attributes: Specifies built-in programmable inversion on specific pins
.IS_CE0_INVERTED(1'b0), // Optional inversion for CE0
.IS_CE1_INVERTED(1'b0), // Optional inversion for CE1
.IS_I0_INVERTED(1'b0), // Optional inversion for I0
.IS_I1_INVERTED(1'b0), // Optional inversion for I1
.IS_IGNORE0_INVERTED(1'b0), // Optional inversion for IGNORE0
.IS_IGNORE1_INVERTED(1'b0), // Optional inversion for IGNORE1
.IS_S0_INVERTED(1'b0), // Optional inversion for S0
.IS_S1_INVERTED(1'b0), // Optional inversion for S1
.SIM_DEVICE("VERSAL_PRIME") // VERSAL_PRIME, VERSAL_PRIME_ES1
)
BUFGCTRL_inst (
.O(O), // 1-bit output: Clock output
.CE0(CE0), // 1-bit input: Clock enable input for I0
.CE1(CE1), // 1-bit input: Clock enable input for I1
.I0(I0), // 1-bit input: Primary clock
.I1(I1), // 1-bit input: Secondary clock
.IGNORE0(IGNORE0), // 1-bit input: Clock ignore input for I0
.IGNORE1(IGNORE1), // 1-bit input: Clock ignore input for I1
.S0(S0), // 1-bit input: Clock select for I0
.S1(S1) // 1-bit input: Clock select for I1
);
// End of BUFGCTRL_inst instantiation
<BUFGMUX>
Primitive: General Clock Mux Buffer
- PRIMITIVE_GROUP: CLOCK
- PRIMITIVE_SUBGROUP: MUX
소개
이 설계 요소는 BUFGCTRL을 기반으로 하는 일반 클록 버퍼로, I0과 I1의 두 입력 클록 중에서 선택할 수 있습니다. 선택 입력(S)이 ‘0’이면 I0의 신호가 출력(O)으로 선택됩니다. 선택 입력(S)이 ‘1’이면 I1의 신호가 출력용으로 선택됩니다. BUFGMUX BUFGMUX_1은 선택 입력의 변경에 따라 출력이 클록 간에 전환될 때 출력이 가정하는 상태로 구별됩니다. BUFGMUX는 출력 상태 0을 가정하고 BUFGMUX_1은 출력 상태 1을 가정합니다.
Logic Table
Inputs | Outputs | ||
I0 | I1 | S | O |
I0 | X | 0 | I0 |
X | I1 | 1 | I1 |
X | X | ↑ | 0 |
X | X | ↓ | 0 |
Port Descriptions
Port | Direction | Width | Function |
I0 | Input | 1 | 클록 버퍼 입력. 이 입력은 S 입력이 0일 때 출력 O에 반영됩니다. |
I1 | Input | 1 | 클록 버퍼 입력. 이 입력은 S 입력이 1일 때 출력 O에 반영됩니다. |
O | Output | 1 | 클록 버퍼 출력. |
S | Input | 1 | 클록 버퍼 선택 입력. Low일 때 I0 입력을 선택하고 High일 때 I1 입력을 선택합니다. |
Available Attributes
Attribute | Type | Allowed Values | Default | Description |
CLK_SEL_TYPE | STRING | "SYNC", "ASYNC" | "SYNC" | 동기(glitch-free) 또는 비동기 클록 전환을 지정합니다. |
VHDL Instantiation Template
Library UNISIM;
use UNISIM.vcomponents.all;
-- BUFGMUX: General Clock Mux Buffer
-- Versal Prime series
-- Xilinx HDL Language Template, version 2022.2
BUFGMUX_inst : BUFGMUX
generic map (
CLK_SEL_TYPE => "SYNC" -- ASYNC, SYNC
)
port map (
O => O, -- 1-bit output: Clock output
I0 => I0, -- 1-bit input: Clock input (S=0)
I1 => I1, -- 1-bit input: Clock input (S=1)
S => S -- 1-bit input: Clock select
);
-- End of BUFGMUX_inst instantiation
Verilog Instantiation Template
// BUFGMUX: General Clock Mux Buffer
// Versal Prime series
// Xilinx HDL Language Template, version 2022.2
BUFGMUX #(
.CLK_SEL_TYPE("SYNC") // ASYNC, SYNC
)
BUFGMUX_inst (
.O(O), // 1-bit output: Clock output
.I0(I0), // 1-bit input: Clock input (S=0)
.I1(I1), // 1-bit input: Clock input (S=1)
.S(S) // 1-bit input: Clock select
);
// End of BUFGMUX_inst instantiation