링크모음 링크세상
링크세상 링크모음 링크 애니 웹툰 링크 드라마 영화 링크 세상의모든링크

스마트 Tcl 방식으로 Vivado IP 생성

최근 직장에서 검토 중인 동료 Vivado 프로젝트를 확인했습니다. 모든 프로젝트 파일을 SVN에 넣는 대신 소스 파일, 제약 조건, IP 파일 및 프로젝트를 다시 생성한 Tcl 스크립트만 넣습니다. 전반적으로 꽤 잘 작동했습니다. 그러나 Vivado는 소스 제어 하에 있는 IP 파일 중 하나가 현재 사용되는 것과 다른 버전의 Vivado를 사용하여 생성되었다고 보고했습니다. 이상하게도 버전 번호는 일치했지만 경고가 사라지기 전에 IP를 다시 생성해야 했습니다.

나는 나중에 이 프로젝트를 사용하는 팀이 하드웨어에만 존재하는 버그를 찾으려고 2주를 보냈다는 것을 알게 되었습니다. 원인은 Vivado IP가 오래된 것입니다. 나는 이것이 고립된 사례라고 말할 수 있었으면 좋겠지만 다른 프로젝트에서 이것을 직접 경험했습니다. 어떻게 든 IP 파일이 소스 제어에서 손상되었거나 제대로 업데이트되지 않아 버그를 찾기가 어렵습니다. 그래서 투철한 엔지니어처럼 저는 일관된 IP 설정을 허용하는 더 나은 솔루션을 찾기로 결정했습니다.

두 가지 접근 방식

Vivado는 우수한 결과를 산출하고 둘 다 Tcl에 의존하는 두 가지 방법을 지원합니다. 첫 번째 접근 방식을 사용하면 Tcl을 사용하여 처음부터 Vivado IP를 생성할 수 있습니다. 이는 소스 제어에 저장할 .xci 파일이 없고 대신 Tcl 스크립트임을 의미합니다. 몇 가지 장점이 있습니다:

  • 소스 제어에서 버전 간 변경 사항을 확인하는 것은 간단합니다.
  • IP는 현재 버전의 Vivado를 사용하여 생성됩니다.
  • IP가 이미 존재하는 경우 Tcl 스크립트는 IP 생성을 건너뜁니다.

두 번째 방법을 사용하려면 .xci 파일을 소스 제어 하에 저장해야 합니다. Tcl 스크립트는 IP가 잠겨 있는지, IP의 새 버전이 사용 가능한지 확인합니다. IP가 잠겨 있고 새 버전을 사용할 수 있는 경우 Tcl 스크립트는 .xci 파일을 업데이트합니다. IP가 결정되면 최신 정보 , 스크립트는 IP 출력 제품을 생성합니다. 이점들 에게 이 접근 방식은 다음과 같습니다.

  • 필요하지 않으면 IP가 재생성되지 않습니다.
  • 스크립팅은 IP를 처음부터 생성하는 것보다 약간 더 쉽습니다.
  • IP 업데이트는 처음부터 IP를 생성하는 것보다 약간 빠릅니다.

이 접근 방식의 가장 큰 단점은 .xci 파일의 변경 사항을 쉽게 볼 수 없다는 것입니다. IP 변경이 발생할 가능성이 없는 성숙한 프로젝트라면 문제가 되지 않습니다. 그러나 많은 프로젝트가 유동적이어서 엔지니어가 IP를 업데이트해야 하는 경우도 있습니다. 이런 경우 Tcl 스크립트를 사용하여 처음부터 IP를 구축하는 것이 유리합니다.

GUI에서 Vivado IP Tcl 명령 가져오기

Vivado IP 카탈로그 열기

대부분의 경우와 마찬가지로 IP를 생성하는 데는 쉬운 방법과 어려운 방법이 있습니다. 나는 강력한 인센티브가 없다면 쉬운 방법을 선호합니다. 쉬운 방법은 Vivado GUI를 사용하여 IP를 생성한 다음 저널 파일(.jou)에 생성된 Tcl 명령을 캡처하는 것입니다. 이 예에서는 고정 소수점 대 부동 소수점 IP 블록을 생성합니다. Project Manager 아래 Flow Navigator에서 IP 카탈로그를 선택합니다.

IP 카탈로그 창에서 Cores를 선택한 다음 Vivado Repository>Math Functions>Floating Point>Floating-point를 선택합니다.

IP 사용자 정의 창이 나타나고 “구성요소 이름” 상자에서 구성요소 이름을 지정할 수 있습니다. 여기서는 구성요소 이름 sfix_19_16_to_float32를 지정했습니다. “작업 선택” 탭에서 “Fixed-to-float”를 선택합니다. “입력 정밀도” 탭을 선택하고 원하는 입력 정밀도를 선택하세요. 나는 19비트의 정수 너비와 16비트의 분수 너비를 가진 사용자 정의 입력 정밀도를 선택했습니다. 나머지 각 탭을 확인하여 IP가 올바른 설정으로 생성되었는지 확인하세요. “확인”을 클릭하세요. 마지막으로 출력 제품 생성 창에서 “생성”을 선택합니다.

이제 Vivado IP를 생성했으므로 해당 Tcl 명령을 캡처할 차례입니다. 파일>프로젝트>저널 파일 열기로 이동하여 저널 파일을 엽니다. 저널 파일에는 여러 개의 Tcl 명령이 표시되지만 우리는 세 가지에 관심이 있습니다. 명령은 다음으로 시작합니다. create_ip, set_property그리고 생성_대상. 올바르게 수행되면 이 세 가지 명령이 순차적으로 실행됩니다. 그만큼 create_ip 명령에는 다음과 같은 인수가 있습니다. -모듈_이름 . 그만큼 사용자 정의 이름 구성 요소에 지정한 이름과 일치해야 합니다.

저널 파일 열기
저널 파일에 Vivado IP Tcl 명령 캡처

접근법 1: 비프로젝트 모드 스크립트에 Vivado IP Tcl 명령 추가

더 진행하기 전에 가정된 디렉토리 구조를 설정해야 합니다. 일반적인 디렉토리 구조는 아래와 같습니다. 소스 제어 도구에는 상위 폴더 Root가 포함되어 있습니다. 또한 Constraints, RTL, Sim 및 TclScripts라는 하위 폴더도 포함되어 있습니다. IP 폴더는 ~ 아니다 소스 제어에 저장되지만 Tcl 스크립트에 의해 생성됩니다. IP 하위 폴더에는 .xci 파일과 .xci 파일의 모든 출력 제품이 저장됩니다.

Root
    - Constraints
    - RTL 
    - Sim
    - TclScripts
    - IP

이제 세 가지 Vivado IP Tcl 명령을 Tcl 스크립트에 넣을 차례입니다. 이 글의 목적상, 나는 당신이 Vivado를 사용하고 있다고 가정합니다. 비프로젝트 방법. 그렇지 않은 경우 튜토리얼을 확인하세요. 여기. 비프로젝트 모드 Tcl 스크립트에는 다음과 같은 명령이 있습니다. read_ip. 일반적으로 이 명령은 소스 및 제약 조건 파일을 읽은 후에 제공됩니다. .xci 파일을 읽는 대신 read_ip 명령을 통해 간단한 if 문을 사용하여 IP 폴더가 존재하는지 여부를 확인하겠습니다(Tcl if 문에 대한 튜토리얼 및 클릭에 대한 대괄호는 무엇입니까?) 여기 그리고 여기). 그 이유는 디자인이 소스 컨트롤에서 처음 체크아웃될 때 IP 폴더와 .xci 파일이 없기 때문에 처음으로 생성하려고 하기 때문입니다. 그러나 일단 생성되면 스크립트가 실행될 때마다 폴더와 .xci 파일을 다시 생성하는 과정을 거치고 싶지 않습니다.

# Check IP
if { [file isdirectory ../"IP"] } {
    # if the IP files exist, we already generated the IP, so we can just
    # read the ip definition (.xci)
    read_ip ../IP/sfix_19_16_to_float32.xci
} else {
    # IP folder does not exist. Create IP folder
    file mkdir ../IP
    
    # create_ip requires that a project is open in memory. Create project 
    # but don't do anything with it
    create_project -in_memory 
    
    # paste commands from Journal file to recreate IP
    create_ip -name floating_point -vendor xilinx.com -library ip \
        -version 7.1 -module_name sfix_19_16_to_float32 \
        -dir ../IP

    set_property -dict 
    [get_ips sfix_19_16_to_float32] generate_target all [get_ips] # Synthesize all the IP synth_ip [get_ips] }

    이 튜토리얼에서는 이스케이프 연산자를 사용하여 여러 줄에 걸쳐 명령을 래핑했습니다. \캐리지 리턴에. 이는 단지 가독성을 위한 것이며 반드시 필요한 것은 아닙니다. 참고: IP를 사용할 때 IP가 저장되는 위치를 변경해야 합니다. create_ip 명령. 나는 -dir 새로 생성된 IP 폴더를 가리키는 인수입니다.

    접근 방식 2: xci 파일 저장 및 업데이트 확인

    두 번째 접근 방식에서는 앞서 생성한 IP 고정-유동 변환 IP를 사용합니다. 아래 디렉토리 구조를 가정합니다. 이 경우 소스 제어 대상이 아닌 유일한 폴더는 BuildFiles입니다.

    Root
        - Constraints
        - RTL 
        - Sim
        - TclScripts
        - IP        
            - sfix_19_16_to_float32.xci
        - BuildFiles
            - sfix_19_16_to_float32
                - sfix_19_16_to_float32.xci

    상황을 더 깔끔하게 만들기 위해 소스 제어 하의 디렉터리 내부에 출력 파일/빌드 파일을 저장하지 않습니다. 이러한 이유로 TclScripts 내부에는 BuildFiles 디렉터리를 생성하고 IP에 저장된 각 .xci 파일을 BuildFiles 내의 자체 하위 폴더에 복사하는 스크립트를 저장합니다. .xci 파일은 자체 하위 폴더에 복사됩니다. 단일 폴더에 모든 .xci 파일이 포함되어 있으면 IP 출력 제품 생성에 문제가 발생하기 때문입니다. Vivado는 .xci 파일과 동일한 위치에 IP 출력 파일을 저장하며 기존 IP 출력 제품을 덮어쓸 수 있습니다.

    .xci 파일을 처음으로 읽을 때 5단계가 있습니다.

    1. 다음을 사용하여 IP를 읽습니다. read_ip 명령
    2. IP가 잠겨 있는지 확인하고 결과를 Tcl 변수에 저장하십시오.
    3. IP에 업그레이드가 포함되어 있는지 확인하고 결과를 Tcl 변수에 저장하십시오.
    4. IP가 잠겨 있고 업그레이드가 가능한 경우 IP를 업그레이드하십시오.
    5. IP 출력 제품 생성

    아래 스크립트는 적절한 Vivado IP Tcl 명령을 보여줍니다.

    #Step 1: Read in IP
    read_ip ../IP/sfix_19_16_to_float32/sfix_19_16_to_float32.xci 
    
    #Step 2: Check if IP is locked
    set locked [get_property IS_LOCKED [get_ips sfix_19_16_to_float32]]
    
    #Step 3: Check if upgrade is available
    set upgrade [get_property UPGRADE_VERSIONS [get_ips sfix_19_16_to_float32]]
    
    #Step 4: Upgrade IP if required
    if {$locked && $upgrade != ""} {
    upgrade_ip [get_ips sfix_19_16_to_float32]}
    
    #Step 5: Produce IP output products
    generate_target all [get_ips sfix_19_16_to_float32]

    자세한 내용은 Vivado 가이드를 확인하세요. UG939.

    결론

    Vivado IP를 어떻게 생성하고 저장합니까? 댓글 섹션을 통해 알려주세요. 모든 의견을 읽고 감사드립니다. 보너스로 BuildFiles를 생성하는 Tcl 스크립트가 포함되었습니다. 예배 규칙서 그런 다음 IP 폴더의 .xci 파일을 자체 하위 폴더 내의 새로 생성된 BuildFiles 디렉터리로 복사합니다. 아래 버튼을 클릭하고 가입하시면 됩니다.




    Leave A Reply

    Your email address will not be published.