Xilinx UCF (User Constraint File) 파일의 이해...


 

 UCF File의 이해...

(1999.5.1)

 

Xilinx Foundation Project Manager에서 새로운 프로젝트를 생성하면 왼편의 Hierarchical Viewer창에 <project name>.ucf가 자동적으로 등록이 되는걸 알 수 있습니다...  이 파일의 용도는 Schematic이나 HDL로 작성된 사용자의 프로젝트에 원하는 옴션을 첨가할 때 쓰인다고 이해를 하시면 됩니다...  즉, Pin 번호 지정이라든지, Critical Path의 지정, 혹은 Timing specification을 선언한다든지 해서 프로젝트의 성능을 향상시키기위해서 사용이 되어집니다...  그러나 몸에 좋은약도 남용하면 오히려 해로운 법...!  오히려 수많은 옵션의 지정은 System Performance를 떨어뜨리고, Compile 시간의 지연을 초래할수도 있으므로 적당히 사용하시길 바랍니다...  제가 원해드리고 싶은 활용법은 1.UCF file은 무시하고 (아무런 설정도 하지 않고) 평소대로 작업을 한다...  2.시스템 검증시 문제가 된다고 판단되는 부분에만 (당연히 잘동작하는 부분에다가는 굳이 이런걸 쓸필요가 없겠죠...) 아래에서 설명할 예제를 참고하여 옵션을 설정한다...  이정도로 요약할수 있겠네요...  처음에는 무슨말인지 잘이해가 안가실수도 있습니다만, 몇 번 해보면 금방 아실수 있어요...

아래에 설명된 내용은 프로젝트 생성시 기본적으로 들어가는 UCF의 내용을 한글로 변역을 한겁니다...  물론 한국어와 영어의 어감이 다르기 때문에 번역을 하면 오히려 뜻이 이상해지는 부분도 없지 않으리라 생각이 듭니다만, 저처럼 영어 알레르기가 있으신 분들을 위해서 작성을 했습니다...

마지막으로 이글 맨아래에 본내용을 담은 아스키 텍스트 문서를 "TEMPLATE.UCF"라는 이름으로 연결시켜 놓았으니 이파일을 Download해서 <fndtn>\Active\CONFIG\TEMPLATE.UCF에 있는 원본대신에 대체해서 사용하면 앞으로 생성되는 새로운 프로젝트에는 한글화된 UCF 파일이 등록이 되므로 활용하시기가 수월하리라 생각이 듭니다...


 

BASIC UCF SYNTAX EXAMPLES V2.1.6

"#" 도형은 주석문자입니다.  이 예제 파일을 사용하려면, 필요한 규격을 찾아서, 행의 시작에 있는 주석 표기 용 문자(#)를 지우시길 바랍니다.  만일 필요하다면 당신의 디자인에 맞게 행의 내용을 수정하십시오.

 

TIMING SPECIFICATIONS

타이밍 규격은 전체 디자인(global)에 적용이 될 수 있거나 여러분의 디자인내의 특정 그룹(time groups)에 적용이 될 수가 있습니다.  타임 그룹은 두 가지 기본적인 방법으로 선언될 수 있습니다.

  • 방법 1 : 네트 이름을 이용하여, my_net라는 net가 logic_grp라는 group에 속해 있는 모든 logic에 연결이 되어 있다면 예를 들면
    NET my_net TNM_NET = logic_grp ;
  • 방법2 : 'TIMEGRP' 라는 key word를 사용하여 그룹화 하고 여러분 디자인의 로직의 이름을 사용하여 선언한다.  예를 들면
    TIMEGRP group_name = FFS ("U1/*");
    U1으로 불리는 계층구조 안에 있는 모든 flip-flop을 위한 'group_name'이라 불리는 그룹을 만든다.  Wildcards 가 사용 가능합니다.

Grouping은 여러분이 software에게 디자인의 어느 부분이 어떤 속도로 동작하는지를 알려 주기 때문에 매우 중요합니다.  단지 하나의 클럭을 가지는 디자인의 중요 부분을 위해서는 간단한 광역 제한 사항을 사용하면 됩니다.

여러분이 사용하는 grouping constraint의 형태는 여러분이 사용하고 있는 합성 툴에 따라 변할 수 있습니다.  Foundation Express는 방법2가 더욱 좋습니다.

 

Internal to the device clock speed specifications - Tsys

 

Single Clock

 

PERIOD TIME-SPEC

주기(period) 규격은 register, latch, 또는 기준 net(excluding pad destinations)에 의해 동기화 되는 synchronous RAM에서 시작하거나 끝나는 모든 타이밍 경로를 담당합니다.  또한 다른 요소(ex. flip flops, pads, etc...)들에 관련된 synchronous element의 setup 요구사항(requirement)도 담당합니다.
NOTE: 시간에 대한 기본 단위는 나노세컨드(nanoseconds)입니다.
NET clock PERIOD = 50ns ;

-OR-

 

FROM:TO TIME-SPECs

FROM:TO style timespecs은 time groups사이의 경로를 제한(constrain)하는 데 사용되어 집니다.  NOTE: RAMS, FFS, PADS, LATCHES와 같은 keywords(예약어)는 디자인에 있어서 각 형태의 모든 요소를 정의하는 데 사용하도록 미리 정의가 되어 있습니다.  사용방법은 먼저 원하는 TIME GROUP을 정의하고 TIMESPEC이름을 정의하여 사용하시면 됩니다.

TIMEGRP RFFS = RISING FFS ("*"); // creates a rising group called RFFS
TIMEGRP FFFS = FALLING FFS ("*"); // creates a falling group called FFFS
위의 두 문장은 RFFS와 FFFS라는 TIME GROUP을 정의한 것입니다.

TIMESPEC TSF2F = FROM : FFS : TO : FFS : 50 ns; // Flip-flips with the same edge
TIMESPEC TSR2F = FROM : RFFS : TO : FFFS : 25 ns; // rising edge to falling edge
TIMESPEC TSF2R = FROM : FFFS : TO : RFFS : 25 ns; // falling edge to rising edge
위의 문장들에서 TIMESPEC 다음에 나오는 것이 TIMESPEC 이름이 되는 데, 여기서 규칙은 TS는 항상 나오는 것이며 나머지는 사용자가 알아서 마음대로 하시면 됩니다.  예를 들면 TS_SP1, TS01, TS_FIRST입니다.  위의 문장에서 우리는 TSF2F는 FLIPFLOP TO FLIPFLOP에 대한 TIMESPEC임을 알 수 있습니다.

 

Multiple Clocks

'PERIOD'와 'FROM:TO' 형태의 time specification에 대한 조합이 필요합니다.
NET clock1 TNM_NET = clk1_grp ;
NET clock2 TNM_NET = clk2_grp ;

위의 두 문장을 해석하면 clock1 net를 clk1_grp라고 net에 timespec를 정의합니다.  Clock2 net는 clk2_grp라는 timespec을 정의합니다.

TIMESPEC TS_clk1 = PERIOD : clk1_grp : 50 ;
TIMESPEC TS_clk2 = PERIOD : clk2_grp : 30 ;
TIMESPEC TS_ck1_2_ck2 = FROM : clk1_grp : TO : clk2_grp : 50 ;
TIMESPEC TS_ck2_2_ck1 = FROM : clk2_grp : TO : clk1_grp : 30 ;

위의 문장을 해석하면 TS_clk1이라는 TIMESPEC은 clk1_grp라는 TIMEGROUP에 주기 50NS을 할당하고 있음을 알 수 있으며, 나머지도 CLK1 과 CLK2사이의 시간 관계를 정의하고 있습니다.

 

CLOCK TO OUT specifications - Tco

 

OFFSET TIME-SPEC

여러분의 clock-to-out timing specifications에 clock buffer/routing delay를 자동적으로 추가 할 수 있도록, OFFSET constraints를 사용하십시오.  예를 들어 maximum clock-to-out (Tco)가 25 ns 이면:

NET out_net_name OFFSET = OUT 25 AFTER clock_net_name ;

-OR-

 

FROM TO TIME-SPECs

TIMESPEC TSF2P = FROM : FFS : TO : PADS : 25 ns;
FROM: FFS : TO: PADS constraints는 flip flop 그 자체에서 지연분석(dalay analysis)을 시작하며 클럭 입력핀에서 시작하지 않습니다.  clock-to-out constraint을 만들기 위해, 권고하는 방법은 OFFSET constraint을 사용하는 것입니다.

 

Pad to Flip-Flop speed specifications - Tsu

 

OFFSET TIME-SPEC

여러분의 입력 setup timing specifiactions안에 clock delay에 대한 합산을 자동적으로 넣으려면, OFFSET constraints을 사용하십시오.  For an input where the maximum setup time is 25 ns:
NET in_net_name OFFSET = IN 25 BEFORE clock_net_name ;

-OR-

 

FROM TO TIME-SPECs

TIMESPEC TSP2F = FROM : PADS : TO : FFS : 25 ns;
FROM: PADS : TO: FFS constraints는 clock path에 대한 어떤 합산도 취하지 않는 것을 주의하십시오.  input setup time constraint을 만드는 권고 방법은 OFFSET constraint을 사용하는 것입니다.

 

Pad to Pad speed specifications - Tpd

 

FROM TO TIME-SPECs

TIMESPEC TSP2P = FROM : PADS : TO : PADS : 125 ns;

 

Other timing specifications

 

TIMING IGNORE

만일 여러분이 path(경로)의 timing을 무시할 수 있다면, Timing Ignore(TIG)을 사용하십시오.  주의 사항 : "*" 문자는 버스 이름에 사용될 수 있는, wild-card입니다.  "?"는 한 문자에 대해 wild-card로 사용할 수 있는 문자 입니다.

Ignore timing of net reset_n:
NET : reset_n : TIG ;

Ignore data_reg(7:0) net in instance mux_mem:
NET : mux_mem/data_reg* : TIG ;

Ignore data_reg(7:0) net in instance mux_mem as related to a TIMESPEC named TS01 only:
NET : mux_mem/data_reg* : TIG = TS01 ;

Ignore data1_sig and data2_sig nets:
NET : data?_sig : TIG ;

 

PATH EXCEPTIONS

여러분의 디자인이 출력이 다른 출력보다 더욱 늦을 수 있다면 여러분은 OUT_DATA(7:0)과 irq_n 출력에 대한 다음 예와 같이 TIMESPEC를 정의 할 수가 있을 것입니다.
TIMEGRP slow_outs = PADS(out_data* : irq_n) ;
TIMEGRP fast_outs = PADS : EXCEPT : slow_outs ;
TIMESPEC TS08 = FROM : FFS : TO : fast_outs : 22 ;
TIMESPEC TS09 = FROM : FFS : TO : slow_outs : 75 ;

여러분이 FF to FF paths에 여러 개의 cycle를 가지고 있다면, TIMEGRP 또는 TNM 문장 중 하나를 가지고 time group를 만들 수 있습니다.

주의사항: 많은 VHDL/Verilog synthesizers는 flip-flop Q output net name을 예상 할 수가 없다.  그러나, 대부분의 synthesizer는 flip-flop에 대한 instance name을 예상하여 할당할 수 있다.

TIMEGRP example:
TIMEGRP slowffs = FFS(inst_path/ff_q_output_net1* :
inst_path/ff_q_output_net2*);

TNM attached to instance example:
INST inst_path/ff_instance_name1_reg* TNM = slowffs ;
INST inst_path/ff_instance_name2_reg* TNM = slowffs ;

만일 FF clock-enable이 multi-cycle path의 모든 flip-flop에 사용이 되면, clock enable net에 TNM을 부착할 수 있습니다.  주의 사항 : forward trace 방식으로 net에 부착된 TNM은 net에 부착된 어떤 FF, LATCH, RAM 또는 PAD에 적용 될 수 있습니다.
NET ff_clock_enable_net TNM = slowffs ;

FROM:TO timespec에 있어서 "slowffs" timegroup를 사용하는 예제는 위에서 보여준 세가지 방법중 어느 하나를 가지고 만든다.
TIMESPEC TS10 = FROM : slowffs : TO : FFS : 100 ;

어떤 net에 관련된 delay 또는 skew를 제한한다.
NET any_net_name MAXSKEW = 7 ;
NET any_net_name MAXDELAY = 20 ns;

 

.ucf file안에서 제한사항의 우선순위는 다음과 같습니다.

  1. Timing Ignore (TIG) -----> highest
  2. FROM : THRU : TO specs
  3. FROM : TO specs
  4. PERIOD specs -----> lowest

추가적인 timespec 특징이나 자세한 정보를 알고 싶을시 On-line "Library Reference Guide" document를 보시길 바랍니다.

 

LOCATION and ATTRIBUTE SPECIFICATIONS

 

Pin and CLB location locking constraints

 

Assign an IO pin number

INST io_buf_instance_name LOC = P110 ;
NET io_net_name LOC = P111 ;

 

Assign a signal to a range of I/O pins

NET "signal_name" LOC=P32, P33, P34;

 

Place a logic element(called a BEL) in a specific CLB location.
BEL = FF, LUT, RAM, etc...

INST instance_path/BEL_inst_name LOC = CLB_R17C36 ;

 

Place CLB in rectangular area from CLB R1C1 to CLB R5C7

INST /U1/U2/reg<0> LOC=clb_r1c1:clb_r5c7;

 

Place hierarchical logic block in rectangular area from CLB R1C1 to CLB R5C7

INST /U1* LOC=clb_r1c1:clb_r5c7;

 

Prohibit IO pin P26 or CLBR5C3 from being used:

CONFIG PROHIBIT = P26 ;
CONFIG PROHIBIT = CLB_R5C3 ;

Config Prohibit is very important for forcing the software to not use critical configuration pins like INIT or DOUT on the FPGA.  The Mode pins and JTAG Pins require a special pad so they will not be available to this constraint

 

Assign an OBUF to be FAST or SLOW:

INST obuf_instance_name FAST ;
INST obuf_instance_name SLOW ;

 

FPGAs only: IOB input Flip-flop delay specification

Declare an IOB input FF delay (default = MAXDELAY).
NOTE: MEDDELAY/NODELAY can be attached to a CLB FF that is pushed into an IOB by the "map -pr i" option.
INST input_ff_instance_name MEDDELAY ;
INST input_ff_instance_name NODELAY ;

 

Assign Global Clock Buffers Lower Left Right Side

INST gbuf1 LOC=SSW


파일명: TEMPLATE.UCF (12,540 bytes)

  Send to a colleague | Print this document