Quartus® II Tcl 예: 자동 버전 번호

author-image

기준

FPGA 디자인에 버전 번호 또는 타임스탬프를 삽입하는 것이 유용합니다. 버전 번호 또는 타임스탬프는 현재 FPGA 프로그래밍된 디자인 버전에 대한 혼란을 없애줍니다. 이러한 숫자가 유용하려면 설계 컴파일 흐름에서 자동으로 업데이트되어야 합니다. 또한 메모리 또는 레지스터 뱅크와 같은 설계 하드웨어에 번호를 저장해야 합니다.

이 Tcl 예는 버전 번호 또는 타임스탬프를 생성하는 다양한 방법과 디자인에 저장하는 다양한 방법을 설명합니다. 그런 다음 디자인을 컴파일할 때마다 버전 번호를 자동으로 생성하고 저장하는 Tcl 스크립트를 만드는 데 사용할 수 있는 스크립트 프레임워크를 보여줍니다. 마지막으로, 전체 스크립트의 예를 보여줍니다.

번호 받기

다음 목록은 버전 번호를 생성하는 방법을 보여줍니다.

번호 저장

번호를 얻는 것 외에도 설계 파일에 작성해야 합니다. 다음은 번호를 저장하는 방법의 예입니다.

스크립트 프레임워크

설계 흐름에 맞게 숫자를 얻고 저장하는 방법을 결합할 수 있습니다. 위의 예에서 번호를 저장하는 방법과 번호를 저장하는 방법을 선택합니다. 적절한 절차를 Tcl 파일에 복사하고 명령을 추가하여 프로시저를 호출합니다. 다음 스크립트 프레임워크는 스크립트 작성 방법을 보여줍니다. 마지막으로 Quartus II 설정 파일(아래 설명)에 할당을 추가하십시오(아래 설명). qsf) 스크립트가 자동으로 실행되도록 허용합니다.

# 여기에 번호를 저장하는 절차를 삽입하기 위한 삽입 
절차 # 이 
줄은 스크립트 자동화를 수용합니다. 나중에 설명한 스크립트 자동화를 수용합니다 
{ 흐름 프로젝트 개정 } $quartus (args) { 
   break } # 전화 
절차에서 번호를 얻으려면 여기 번호 
형식 변환 필요 # 전화 절차를 수행하십시오. 여기에 번호를 저장하는 데 필요한 번호 형식 변환을 
수행합니다.

스크립트 자동화

모든 컴파일 전에 스크립트가 자동으로 실행되도록 프로젝트의 QSF에 다음 줄을 추가하십시오. < 스크립트 이름 > Tcl 파일의 이름으로 교체합니다.

set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:<script name>

할당 및 스크립트를 자동으로 실행하는 다른 방법에 대한 자세한 내용은 자동 스크립트 실행을 참조하십시오.

예제

다음 스크립트 예에서는 다음 두 가지 예의 절차를 사용합니다.

# 지정된 파일 proc에 대한 SVN 개정 번호
get_subversion_revision { file_name } { 전역 완료 #

    svn 정보 # 명령이 설정 timeout_seconds 30을 완료할 때까지 기다리는 최대 초 수
    #
    svn 정보 명령 세트
    cmd "svn info ${file_name}"

    # 버전 정보를 가져오려고 시도합니다.
    # 명령을 실행할 수 없는 경우 오류를 반환합니다.
    # 그렇지 않으면 명령 출력을 처리하기 위해 파일 이벤트를 설정합니다.
    {[catch {open "|$cmd"} 입력] } {
        반품 -코드 오류 $input
    }
        {fileevent $input 읽을 수 있는 [목록 get_revision_info $input]

        #
        #저장소가 다운된 경우 프로세스가 중단되지 않도록 시간 초과를 설정합니다.
        설정 시간 제한 [후 [ expr { $timeout_초 * 1000 }  [목록 세트 완료 -1]

        ] # 개정 번호가 발견될 때까지 계속하지 마십시오.
        # 또는 작업 시간이 초과되었습니다. 어쨌든 시간 초과를 취소합니다.
        vwait는
        위의 절차 절차 프럭 get_revision_info { inp } {전역 수행 revision_number 대한 $timeout } # 도우미 절차를 취소한 후

    완료되었습니다 .

    {[eof $inp] }
        {catch {close $inp}
        세트 완료 1 }
    elseif {$done } {$inp 선을 가져옵니다 { 다른 {$inp
        선을 가져옵니다 #
        #개정 번호와 라인을 일치하도록 일반 표현식을
        사용합니다.
        {[regexp {^Revision:\s+(\d+)\s*$} $line 일치 revision_number] }
            {세트 완료 1}
        } # 지정된

육각 값
proc generate_verilog {hex_value } {

    num_digits [문자열 길이 $hex 설정 bit_width
    [expr { 4 * $num_digits} ]
    세트 high_index [expr { $bit_width - 1 } ] reset_value
    [문자열 반복 "0" $num_digits]

    {[catch {
        set fh [열기 "version_reg.v" w]
        $fh "모듈 version_reg(클럭, 재설정, data_out)"을 넣습니다.
        $fh    "입력 클럭"을 넣습니다.
        $fh    "입력 재설정"을 넣습니다.
        $fh    "출력 \[$high_index:0\] data_out;"
        $fh    "reg \[$high_index:0\] data_out;"
        "항상    @(posedge clock 또는 negedge Reset)가 시작됩니다"라는
        $fh $fh        넣습니다. "(!reset)"
        $fh            "data_out <= ${bit_width}'h${reset_value};"을 넣습니다.
        $fh        "기타"는            "data_out <= ${bit_width}'h${hex_value}"을 $fh 넣습니다.
        $fh    "end"가
        $fh "endmodule"
        닫기 $fh
    } res] } {
        반품 -코드 오류 $res
    }
        {return 1
    } } 이

줄은 스크립트 자동화
포리치 { 흐름 프로젝트 개정 } $quartus $res {(args) { break }

세트 file_name ${project}.qpf
세트 완료 0 세트 revision_number
"" # 통화

절차로 파일 개정 번호를 얻고
{[catch { get_subversion_revision $file_name } msg] } {
   post_message -type critical_warning "수정 번호를 얻기 위해 명령을 실행할 수 없습니다. $msg" } 
   {-1 == $done } 
      {post_message -type critical_warning "개정 번호를 얻는 시간 
   초과"} } {[문자열은 ""$revision_번호와 동일" } 
      {post_message -type critical_warning "svn 정보 $file_name 출력에서 개정 번호를 찾을 수 없습니다." 
   }  {[catch { 
       generate_verilog $revision_number } res] } { 
         post_message -type critical_warning \ "Verilog 파일을 생성할 수 없습니다. $res" 
      } 다른 
         {post_message "버전 번호를\버전 0x${revision_number}로 성공적으로 업데이트했습니다} 
      } 
}

스크립트 update_version.tcl의이름을 지정하는 경우 QSF에 다음 줄을 추가해야 합니다.

set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:update_version.tcl

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