동적 SDC 제약조건으로 설계 재사용 간소화

author-image

기준

여러 디자인에서 재사용할 수 있는 설계 블록 또는 HDL 구성 요소를 만들 때는 SDC 제약 조건을 만들어야 할 수도 있습니다. 구성 요소를 재사용하는 디자이너가 편집할 필요가 없는 제약 조건을 만드는 것이 유용합니다. 제약 조건은 일반적이어야 하므로 설계 계층 구조에서 블록이 인스턴스화되는 위치에 관계없이 작동하며 동적으로 작동하므로 설계 블록의 연결 방식에 관계없이 작동합니다. 설계 변경 사항을 반영하기 위해 제약 조건을 수동으로 편집해야 하는 경우 디자이너가 제약 조건을 업데이트하지 않고 설계를 변경하면 동기화되지 않습니다.

이 설계 예에서는 다음 두 가지 문제를 해결하는 동적 SDC 제약 조건을 만드는 기술을 다룹니다.

  • 저수준 모듈에 직접 연결된 최상위 I/O의 이름 결정
  • 낮은 수준의 모듈에서 로직에서 생성된 클럭 생성

그림 1의 다이어그램은 이 예에 대한 매우 간단한 디자인을 보여줍니다. 여기에는 노란색으로 표시된 reusable_block라는 재사용 가능한 설계 블록의 두 인스턴스가 포함됩니다. 그림 2는 reusable_block 디자인의 내용을 보여줍니다. reusable_block 소스 동기 출력 버스의 이중 데이터 속도 클럭으로 작동합니다. 출력은 최상위 출력에 연결되어야 합니다. 출력이 소스 동기화 클럭으로 작동하기 때문에 reusable_block 대한 제약 조건에는 생성된 클럭이 포함되어야 합니다.

그림 1. 설계 예시용 샘플 회로.

그림 2. reusable_block 내용.

최상위 I/O 이름 결정

reusable_block 대한 제약 조건은 최상위 I/O 이름의 변경 사항을 수용해야 합니다. 따라서 컴파일 또는 타이밍 분석 중에 최상위 I/O 이름을 결정해야 합니다. get_fanouts Tcl 명령은 지정된 이름의 팬아웃인 포트 또는 레지스터를 나타내는 ID 모음을 반환합니다. get_fanouts Tcl 명령은 컴파일 또는 타이밍 분석 중에 존재하는 타이밍 넷리스트를 사용하므로 팬아웃 노드의 이름에 관계없이 연결을 동적으로 결정합니다. 다음 Tcl 코드는 낮은 수준의 레지스터의 직접 팬아웃인 최상위 출력을 얻기 위해 get_fanouts 사용하는 방법을 보여줍니다.

foreach_in_collection fanout_id [get_fanouts $low_level_register_name] {break } 세트
top_level_io_name [get_node_info -name $fanout_id]

다시 사용할 수 있는 설계 블록에 있는 와일드카드와 알려진 계층 구조 부분을 사용하여 해당 레지스터를 일치시킬 수 있기 때문에 하위 레벨 레지스터의 전체 계층 이름을 알 필요가 없습니다. 이 페이지의 마지막 코드 예는 낮은 수준의 레지스터 이름과 일치하는 방법의 예를 보여줍니다.

그림 1의 설계에서 저수준 모듈 출력 핀은 하나의 최상위 출력에 직접 연결됩니다. 다음 Tcl 코드는 낮은 수준의 팬을 하나의 위치로만 등록하고 팬아웃 위치가 출력 포트인지 확인하기 위해 오류 검사를 추가합니다. 이 Tcl 코드는 reusable_block 제한하는 SDC 파일의 일부여야 합니다.

#
[get_fanouts $low_level_register_name] fanout_collection 로우 레벨 레지스터 세트의

팬아웃을 확인하십시오 .
{1!= num_fanouts get_collection_size $fanout
$num_fanouts }
    {반품 -코드 오류 "$low_level_register_name fans out을 $num_fanouts \
        노드에 팬아웃해야 하지만 팬아웃을 하나만 해야
합니다."

# 팬아웃 노드
foreach_in_collection fanout_id $fanout_collection {break}
세트 fanout_name [get_node_info -name $fanout_id]

# {[catch { get_port_info -is_output_port $fanout_id} 경우 팬아웃 노드가 출력 포트인지
확인합니다. is_output] } {
    # 오류가 발생했습니다 - 포트
    반품 -코드 오류 "$low_level_register_name 팬을 포트가 아닌 $fanout_name \로 팬
아웃"} elseif {! $is_ 출력 } {
    # 오류는 없지만 포트는 출력 포트
    반환 -코드 오류 "$fanout_name은 출력 포트가 아닙니다"}
    {set top_level_io_name $fanout_name
} # top_level_io_name low_level_register_name 유일한

팬아웃이며
출력 포트는 #입니다.

생성된 클럭 생성

소스 동기 출력 클럭은 이중 데이터 속도 출력 레지스터를 공급하는 클럭에 따라 생성된 클럭으로 정의되어야 합니다. 디자인 블록은 모든 클럭 구성표로 모든 설계에서 인스턴스화될 수 있기 때문에 생성된 클럭은 디자인의 클럭에 대한 수동으로 입력된 정보 없이 생성되어야 합니다.

다음 SDC 명령은 계층 구조의 위치를 알 수 없는 경우 그림 1의 설계에 대한 소스 동기화 출력 클럭에 대해 생성된 클럭을 만드는 간단한 방법을 보여줍니다.

create_generated_clock -name reusable_generated -source [get_pins \
    *|reusable_block_clock_out|altddio_out_component|auto_generated|ddio_outa[0]|muxsel] \
    $top_level_io_name

설계 계층 구조의 어느 곳에서나 단일 reusable_block 인스턴스화에 적합한 간단한 접근 방식이지만 여러 인스턴스화 또는 멀티클러킹 상황을 처리하지는 않습니다. 클럭 구성표를 알 수 없는 경우, 생성된 클럭 제약 조건은 설계 블록을 공급하는 단일 클럭 신호에 여러 클럭이 정의된 상황을 처리할 수 있어야 합니다. 단일 클럭 신호의 여러 클럭은 종종 다양한 I/O 프로토콜 속도를 지원하는 설계 또는 중복을 위한 클럭 전환 기능을 지원하는 설계에 존재합니다. 위의 간단한 생성 클럭 예는 여러 소스 클럭을 구별하는 -master_clock 옵션이 포함되어 있지 않기 때문에 멀티클러킹 상황에서 실패합니다.

여러 인스턴스화를 처리하려면 루프를 사용하여 각 인스턴스화에 대해 고유한 생성 클럭을 생성합니다. 멀티클러킹 상황을 처리하려면 핀 설계 예제에 설명된 get_clocks_driving_pin 라는 사용자 지정 절차를 사용하십시오. 사용자 지정 절차를 사용하려면 핀 설계 예제 페이지에서 핀을 공급하는 클럭에서 복사해야 합니다. 프로젝트에 추가된 별도의 SDC 파일로 저장하거나 재사용 가능한 블록을 제한하는 다른 모든 제약 조건과 함께 하나의 SDC 파일을 복사하여 붙여 넣을 수 있습니다. 프로젝트에 추가된 SDC 파일로 저장하는 경우, get_clocks_driving_pin 사용자 지정 절차를 사용하는 SDC 파일 앞에 해당 파일이 나열되어 있는지 확인하십시오.

다음 Tcl 코드는 그림 1에 표시된 설계에서 낮은 수준의 레지스터에 의해 구동되는 최상위 출력에서 생성된 클럭 제약 조건을 만드는 방법을 보여줍니다. 생성된 클럭은 최상위 출력을 대상으로 사용하며, altddio_output muxsel 핀이 소스로 등록됩니다. 코드는 루프를 사용하여 설계에서 reusable_block 모든 인스턴스를 반복하고 중첩된 루프를 사용하여 get_clocks_driving_pin 사용자 지정 절차로 멀티클러킹 상황을 처리합니다. get_clocks_driving_pin 절차가 이미 정의되어 있다고 가정합니다.

# get_pins 각 muxsel 핀 foreach_in_collection pin_id
[get_pins -compatibility_mode \ *|reusable_block_clock_out|altddio_out_component|auto_generated|ddio_outa[0]에서 반복되는 reusable_block # foreach_in_collection 각 인스턴스화에 대해 하나의 muxsel
핀을
    반환합니다. ]|muxsel] { # pin_name reusable_block

    세트의 1개 #인스턴스화에 대한 muxsel 핀의 전체 설계 계층
    구조가 pin_name [get_node_info -name $pin_id]
    
    # 위에 표시된 코드를 오류 확인 없이 사용하여
    최상위 출력 foreach_in_collection port_id
    [get_fanouts $pin_name] { break } 세트 port_name
    [get_node_info -name $port_id] # altddio_output
    
    레지스터를 공급하는 여러 클럭이 있을 수 있습니다
    # muxsel 핀을 공급하는 각 클럭에 대해 생성된 클럭 1개가
    필요합니다. muxsel 핀을 공급하는 각 클럭은 마스터 클럭입니다.
    foreach master_clock [get_clocks_feeding_pin $pin_name] { post_message

        "$pin_name으로 공급되는 $port_이름에서
        생성된 클럭 만들기" # 적절한 마스터 클럭으로 생성된 클럭 만들기.
        # 소스는 현재 reusable_block 인스턴스화인 altddio_output 셀의 muxsel
        핀입니다.
        # 이름은 마스터 클럭과
        muxsel 핀의 #전체 계층 구조 이름의 조합입니다.
        # 대상은 muxsel 핀의 팬아웃인 최상위 포트입니다.
        create_generated_clock -add -master_clock $master_clock \
            -source [get_pins $pin_name] -name ${master_clock}-${pin_name} \
            [get_ports $port_name]
} }

이 코드가 프로젝트에 포함된 SDC 파일에서 모든 reusable_block 인스턴스화는 생성된 클럭으로 자동으로 제한됩니다. 생성된 클럭은 다음과 같은 상황에서도 항상 정확하고 최신 상태로 유지됩니다.

  • reusable_block 설계 계층 구조의 다른 지점에서 인스턴스화되거나 다른 지점으로 이동됩니다.
  • 최상위 I/Os의 이름이 바뀌었습니다.
  • 디자이너는 설계에서 여러 클럭 정의를 사용합니다.

이 페이지의 콘텐츠는 원본 영어 콘텐츠에 대한 사람 번역 및 컴퓨터 번역의 조합으로 완성되었습니다. 이 콘텐츠는 편의와 일반적인 정보 제공을 위해서만 제공되었으며, 완전하거나 정확한 것으로 간주되어선 안 됩니다. 이 페이지의 영어 버전과 번역 간 모순이 있는 경우, 영어 버전이 우선적으로 적용됩니다. 이 페이지의 영어 버전을 확인하십시오.