핀을 먹이는 시계 받기

author-image

기준

이 설계 예는 핀을 공급하는 모든 클럭 목록을 반환하는 SDC 파일에서 사용할 수 있는 사용자 지정 절차를 보여줍니다. 이 절차는 설계에서 다른 클럭 이름을 모르고 생성된 클럭을 만들어야 하는 경우에 도움이 될 수 있습니다. 동적 SDC 제약조건 설계 예제를 사용하여 설계 재사용 단순화 예제는 이 페이지에 설명된 사용자 지정 절차를 사용하는 방법에 대한 자세한 내용과 예를 제공합니다.

절차의 전체 코드는 절차의 작동 방식에 대한 전체 설명에 따라 페이지 하단에 있습니다. SDC 파일에서 get_clocks_driving_pins 사용자 지정 절차를 사용하려면 프로시저가 정의되었는지 확인하고 다른 SDC 명령과 같이 호출하십시오. 사용 전에 프로시저가 정의되었는지 확인하는 두 가지 쉬운 방법이 있습니다.

  • 프로시저 코드를 별도의 SDC 파일에 저장하고 프로젝트에 SDC 파일을 포함합니다.
  • get_clocks_driving_pins 사용자 지정 프로시저가 사용되기 전에 모든 SDC 파일 상단에 프로시저 코드를 복사하여 붙여넣습니다.

별도의 SDC 파일

프로시저 코드를 별도의 SDC 파일에 저장하면 코드가 나머지 제약 조건과 분리되어 다른 프로젝트에서 더 쉽게 재사용할 수 있습니다. 별도의 SDC 파일을 사용하는 경우, 프로젝트의 파일 목록에 프로시저가 있는 SDC 파일을 추가해야 하며, 프로시저를 사용하는 모든 SDC 파일 위에 나타나야 합니다. 다른 SDC 파일 위에 나열하면 Quartus® II 소프트웨어가 SDC 파일을 읽을 때마다 사용하기 전에 절차를 정의합니다.

복사 및 붙여넣기

프로시저 코드를 동일한 SDC 파일에 복사하여 붙여넣으면 프로젝트에서 SDC 파일이 줄어듭니다. 다른 디자이너가 재사용할 모듈용 SDC 파일을 만드는 경우 모든 제약 조건과 지원 코드를 단일 SDC 파일에 포함하는 것이 가장 간단할 수 있습니다. 사용 전에 프로시저를 처음 사용하기 전에 SDC 파일에 프로시저 코드를 포함해야 합니다. 일반적으로 이 요구 사항을 충족하기 위해 파일 맨 위에 놓습니다.

스크립트 작업

핀을 공급하는 설계에서 모든 클럭 목록을 얻는 데는 다음 세 가지 주요 단계가 필요합니다.

  1. 모든 클럭을 확보하고 대상 노드에서 대상 노드의 클럭까지 매핑을 만듭니다.
  2. 지정된 핀에 대한 fanin 경로에 있는 클럭이 있는 노드 목록을 확인하십시오.
  3. 노드 목록에서 지정된 핀에 가장 가까운 노드를 찾아 해당 노드의 클럭을 반환합니다.

1단계. 모든 클럭을 확보하고 매핑 만들기

다음 Tcl 코드는 설계의 모든 클럭을 가져오고 노드에서 노드의 클럭까지 매핑(Tcl 배열 포함)을 만듭니다.

catch { 배열 언셋 nodes_with_clocks }
배열 세트 nodes_with_clocks [목록]

# 이터레이트 디자인
foreach_in_collection clock_id [all_clocks] {

    세트 clock_name [get_clock_info -name $clock_id]

    # 각 클럭이 노드에 적용됩니다. 대상 노드 모음
    foreach_in_collection target_id [get_clock_info -targets $clock_id] {

        # 시계 이름을 대상 노드 세트
        target_name [get_node_info -name $target_id]
        lappend nodes_with_clocks($target_name) $clock_name}
}

가상 클럭에는 타겟이 없으므로 가상 클럭으로 매핑이 이루어지지 않습니다. 아래 나열된 전체 절차 코드에서 대상 노드 유형(레지스터, 핀, 셀 또는 포트)에 대한 정보가 나중에 사용하기 위해 저장됩니다.

2단계. Fanin Path에서 클럭이 있는 노드 가져오기

두 번째 단계는 지정된 핀에 대한 fanin 경로에 클럭이 있는 노드의 하위 집합을 찾는 것입니다. 클럭이 있는 각 노드(1단계에서 찾을 수 있음)에 대해 팬인을 노드를 통해 지정된 핀으로 받으십시오. fanin이 있는 경우 노드가 핀에 대한 fanin 경로에 있습니다. fanin이 없으면 노드가 핀에 대한 fanin 경로에 없습니다.

다음 Tcl 코드는 1단계에서 클럭이 있는 모든 노드를 반복하고 get_fanins 명령을 사용하여 각 노드가 지정된 핀의 fanin 경로에 있는지 여부를 결정합니다. 노드가 지정된 핀의 fanin 경로에 있으면 노드가 pin_drivers 목록에 저장됩니다.



1단계 포리치 node_with_clocks [배열 이름 nodes_with_clocks]에서 만든 매핑의 모든 노드에서 pin_drivers #반복 설정

    {# 현재 노드 세트를 통해 지정된 핀에 팬인을 fanin_col
    [get_fanins -clock -through $node_with_clock $pin_name]

    # 팬노드 노드가 하나 이상 있는 경우, 현재 노드가 지정된 핀에 대한
    #fanin 경로에 있습니다.  그래서 저장합니다.
    {0 < [get_collection_size $fanin_col] }
        {lappend pin_drivers $node_with_clock}
}

아래에 나열된 전체 프로시저 코드는 노드 유형에 대한 추가 정보를 사용하여 get_fanins 명령의 -through 값에 대한 유형별 컬렉션을 지정합니다.

3단계. 지정된 핀에 가장 가까운 노드 찾기

이제 pin_drivers 변수에는 지정된 핀에 대한 fanin 경로에 클럭이 있는 모든 노드 목록이 있습니다. 이 단계에서는 지정된 핀에 가장 가까운 노드를 찾습니다. pin_drivers 목록에 노드가 두 개 이상 있는 동안 코드는 목록의 처음 두 노드를 취하고 한 노드가 다른 노드로 가는 fanin 경로에 있는지 확인합니다. fanin 경로에 있는 경우 첫 번째 노드는 두 번째 노드보다 핀에서 더 멀리 떨어져 있어야 목록에서 제거할 수 있습니다.

{1 < [llength $pin_drivers] } {

    #pin_drivers 목록 집합의 처음 두 노드를 node_a
    [lindex $pin_drivers 0]
    세트 node_b [lindex $pin _drivers 1]

    # node_b node_a 세트의 fanin 경로에 있는지
    확인합니다fanin_col [get_fanins -clock -through $node_b $node_a] # 적어도

    하나의 패닌 노드가 있는 경우,  node_b 지정된 핀에서 node_a 더 멀리 떨어져 있어야
    합니다.
    # fanin 노드가 없는 경우, node_b node_a 보다 # 지정된 핀에 더 가까워야
    합니다.
    {0 < [get_collection_size] } { #

        node_a 핀에 더 가깝습니다.
        #pin_drivers 목록
        세트 pin_drivers [lreplace $pin_drivers 1 1]

    }에서 node_b 제거합니다. 다른 {

        # node_b 핀에 더 가깝습니다.
        # node_a pin_drivers 목록
        세트 pin_drivers [lreplace $pin_drivers 0] } } # pin_drivers
    남은

노드는 지정된 핀 node_driving_pin 세트를 구동하는 노드입니다
[lindex $pin_drivers 0]

# 1단계에서 매핑에서 노드의 시계를 찾아서
$nodes_clocks($node_driving_pins)로 반환합니다.

아래에 나열된 전체 프로시저 코드는 노드 유형에 대한 추가 정보를 사용하여 get_fanins 명령의 -through 값에 대한 유형별 컬렉션을 지정합니다.

전체 프로시저 코드

get_clocks_driving_pin 사용자 지정 절차에 대한 전체 코드는 아래에 나열되어 있습니다. 여기에는 위에서 자세히 설명되지 않은 추가 오류 검사 및 지원 기능이 포함됩니다.

proc get_clocks_feeding_pin { pin_name }

    {# 1단계 전에 오류 검사를 수행하여
    프로시저에 전달된 pin_name 한 핀과 한 핀만 일치하는지 확인합니다.
    # 핀 하나와 핀 하나만 일치하지 않으면 오류를 반환합니다.
    pin_col {0 == [get_pins compatibility_mode $pin
    get_collection_size $pin_col] }
        {반환 -코드 오류 "핀이 $pin_이름과 일치하지 않음"
    } elseif {1 < [get_collection_size $pin_col] } {
        return-code error "$pin_name 일치 [get_collection_size $pin_col]\
            핀은 하나만 일치해야 합니다"
    }
    
    # 프로시저 캐치에 사용된 초기화 변수
    { 배열 설정 해제 nodes_with_clocks } catch
    {array unset node_types }
    배열 세트 nodes_with_clocks [목록]
    배열 세트 node_types [목록]
    세트 pin_drivers [목록]
    
    # 단계 1. 디자인의 모든 클럭을 확보하고

    [all_clocks]
    {세트 clock_name

        [get_clock_info-name $clock_id] 세트 clock_target_col [get_clock_info
        -targets $clock_id] # 각 클럭이 노드에 적용되어 있는 설계 foreach_in_collection clock_id 각 클럭에서 대상 노드의 시계에 대한 # 대상 노드의
        
        클럭까지 매핑을 생성합니다. 대상 노드 모음
        foreach_in_collection target_id [get_clock_info -targets $clock_id] {

            # 시계 이름을 대상 노드 세트 target_name
            [get_node_info -name $target_id]
            lappend nodes_with_clocks(get_node_info $target_name) $clock_name # 나중에 사용할 대상

            노드 유형 저장 target_type
            [get_node_info -type $target_id] 세트
            node_types($target_name) $target_type
        }
    }

    2단계.

    1단계 포리치 node_with_clocks
    [배열 이름 nodes_with_clocks] { # 대상 노드의 유형을 사용하여 get_fanins

        명령의 -through 값에 대한 유형별 # 컬렉션을 생성하기 위해 1단계 포리치에서 만든 매핑의 모든 노드에서 지정된 핀
        #Iterate에 대한 # fanin 경로에 클럭이 있는 노드 목록을 확인하십시오.
        스위치 -exact -- $node_types($node_with_clocks) {
            "핀" {  through_col [get_pins $node_with_clocks] }
            "포트" {세트 through_col [get_ports $node_with_clocks] }
            "cell" {세트 through_col [get_cells $node_with_clocks] }
            "reg"  {세트 through_col [get_registers $node_with_clocks] } 기본 { 반환
            -코드 오류 "$node_type($node_with_clocks)은
                스크립트에 의한 패닌 유형으로 취급되지 않습니다"
        } }

        # 현재 노드
        세트 fanin_col [get_fanins -clock -through $through_col $pin_name] # 적어도

        하나의 fanin 노드가 있는 경우, 현재 노드가 지정된 핀에 대한 #fanin 경로에 있는 경우, 해당
        노드를 저장합니다.
        { 0 < [get_collection_size $fanin_col] } {
            lappend pin_drivers $node_with_clocks }
    }

    } 3단계 전에 오류 검사를 수행하여 설계에 클럭이 있는 노드 중 하나 이상의
    노드가 지정된 핀의 팬인 경로에 있는지
    확인합니다.
    {0 == [llength $pin_drivers] } {
        반품 -코드 오류 "$pin_name"을 구동하는 클럭이 있는 노드를 찾을 수
    없습니다}
    
    # 단계 3. 2단계에서 만든 노드 목록에서 지정된 핀에 가장 가까운 노드
    #을 찾아 해당 노드의 클럭을 반환합니다.

    {1 < [llength $pin_drivers] } {

        #
        [lindex $pin_drivers 0] 세트 node_a pin_drivers 목록 세트의 처음 두 노드를 node_b
        [lindex $pin_drivers 1]
        
        # 대상 노드 유형을 사용하여 get_fanins
        명령에서 -through 값에 대한 유형별 # 컬렉션을 생성합니다.
        스위치 -exact -- $node_types($node_b)
            { "핀"  {세트 through_col [get_pins $node_b] }
            "포트" { 세트 through_col [get_ports $node_b] }
            "셀" { 세트 through_col [get_cells $node_b] }
            "re  {세트 through_col [get_registers $node_b] } 기본 {
            반환 -코드 오류 "$node_type($node_b)은
                스크립트에 의한 패닌 유형으로 처리되지 않습니다"
        } } # node_b node_a

        패닌 경로에 있는지 확인합니다.        
        설정 fanin_col [get_fanins -clock -through $through_col $node_a]

        # 적어도 하나의 패닌 노드가 있는 경우, node_b 지정된 핀에서 node_a 보다 더 멀리 떨어져 있어야
        합니다.
        # fanin 노드가 없는 경우, node_b node_a 보다 # 지정된 핀에 더 가까워야
        합니다.
        {0 < [get_collection_size $fanin_col] } { #

            node_a 핀에 더 가깝습니다.
            # pin_drivers 목록 세트 pin_drivers
            [lreplace $pin_drivers 1 1]

        }에서 node_b 제거합니다 } 기타 {

            # node_b 핀에 더 가깝습니다
            # pin_drivers 목록 세트 pin_drivers node_a 제거
            [l]range $pin_drivers 1 end]
        } } # pin_drivers 남은
    
    노드는 지정된 핀 세트를 구동하는
    노드입니다node_driving_pin [lindex $pin_drivers 0]

    # 1단계에서 매핑에서 노드의 클럭을 조회합니다.
    $nodes_with_clocks($node_driving_pin)를
반환합니다}

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