ตัวอย่าง Quartus® II Tcl: หมายเลขเวอร์ชันอัตโนมัติ

author-image

โดย

การมีหมายเลขเวอร์ชันหรือตราประทับเวลาฝังอยู่ในการออกแบบFPGAของคุณจะเป็นประโยชน์มาก หมายเลขเวอร์ชันหรือการประทับเวลาช่วยขจัดความสับสนว่าเวอร์ชันของการออกแบบของคุณถูกตั้งโปรแกรมไว้ในFPGAในปัจจุบัน เพื่อให้ตัวเลขดังกล่าวเป็นประโยชน์ ต้องอัปเดตโดยอัตโนมัติในขั้นตอนการคอมไพล์การออกแบบ และต้องจัดเก็บหมายเลขในฮาร์ดแวร์การออกแบบ เช่น ในหน่วยความจําหรือการลงทะเบียนธนาคาร

ตัวอย่าง Tcl นี้อธิบายถึงวิธีต่างๆ ในการสร้างหมายเลขเวอร์ชันหรือการประทับเวลา รวมถึงวิธีการจัดเก็บในการออกแบบที่แตกต่างกัน จากนั้นระบบจะแสดงเฟรมเวิร์กสคริปต์ที่คุณสามารถใช้สร้างสคริปต์ Tcl ที่สร้างและจัดเก็บหมายเลขเวอร์ชันโดยอัตโนมัติทุกครั้งที่คุณคอมไพล์การออกแบบ ท้ายที่สุดก็แสดงให้เห็นตัวอย่างของสคริปต์ที่สมบูรณ์

รับหมายเลข

รายการต่อไปนี้แสดงวิธีที่คุณสามารถสร้างหมายเลขเวอร์ชัน:

จัดเก็บหมายเลข

นอกจากการรับหมายเลขแล้ว คุณต้องเขียนในไฟล์การออกแบบ ต่อไปนี้เป็นตัวอย่างวิธีการจัดเก็บหมายเลข:

เฟรมเวิร์กสคริปต์

คุณสามารถรวมวิธีการรับและบันทึกหมายเลขเพื่อให้เหมาะกับขั้นตอนการออกแบบของคุณ จากตัวอย่างด้านบน ให้เลือกวิธีรับหมายเลขและวิธีการจัดเก็บหมายเลข คัดลอกขั้นตอนที่เหมาะสมไปยังไฟล์ Tcl และเพิ่มคําสั่งเพื่อเรียกขั้นตอน เฟรมเวิร์กสคริปต์ต่อไปนี้แสดงวิธีการเขียนสคริปต์ของคุณ ในท้ายที่สุด ให้เพิ่มการบ้าน (อธิบายไว้ด้านล่าง) ไปยังไฟล์การตั้งค่า Quartus II ของคุณ ( qsf ) เพื่อให้สคริปต์ทํางานโดยอัตโนมัติ

# แทรกขั้นตอนเพื่อรับหมายเลขที่นี่ 
# แทรกขั้นตอนเพื่อจัดเก็บหมายเลขที่นี่ 
# บรรทัดนี้รองรับระบบอัตโนมัติของสคริปต์ ซึ่งอธิบายไว้ในภายหลัง 
{ การปรับปรุงโครงการโฟลว์ } $quartus(args) { 
   break } # Call Procedure 
เพื่อรับหมายเลขที่นี่ 
# ทําขั้นตอนการแปลงรูปแบบตัวเลขใดๆ ที่จําเป็น 
# โทร เพื่อจัดเก็บหมายเลขที่นี่

ระบบอัตโนมัติของสคริปต์

เพิ่มบรรทัดต่อไปนี้ไปยัง QSF ของโครงการของคุณเพื่อให้สคริปต์ทํางานโดยอัตโนมัติก่อนการคอมไพล์ทุกครั้ง แทนที่ชื่อ <script > ด้วยชื่อของไฟล์ Tcl ของคุณ

set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:<script ชื่อ>

ดูข้อมูลเพิ่มเติมเกี่ยวกับการกําหนดและวิธีการอื่นๆ ในการเรียกใช้สคริปต์โดยอัตโนมัติได้ที่การดําเนินการสคริปต์อัตโนมัติ

ตัว อย่าง เช่น

ตัวอย่างสคริปต์ต่อไปนี้ใช้ขั้นตอนจากตัวอย่างสองตัวอย่างต่อไปนี้:

# รับหมายเลขการปรับปรุง SVN สําหรับget_subversion_revisionไฟล์ที่ระบุ { file_name } เสร็จสิ้น
ทั่วโลก #

    จํานวนวินาทีสูงสุดที่รอให้คําสั่ง svn info # ตั้งค่าtimeout_seconds
    30

    # Svn info พร้อมชื่อไฟล์ที่ถูกเรียกใช้ตั้งค่า
    cmd "svn info ${file_name}"

    #พยายามรับข้อมูล
    เวอร์ชัน # หากไม่สามารถเรียกใช้คําสั่งได้
    ให้ส่งคืนข้อผิดพลาด # ตั้งค่าเหตุการณ์ไฟล์เพื่อประมวลผลเอาต์พุต
    คําสั่ง หาก { [put {open "|$cmd"} input] } {
        ข้อผิดพลาด return-code $input
    } อื่น {
        fileevent $inputอ่านได้ [list get_revision_info $input ]

        # ตั้งค่าการหมดเวลาเพื่อไม่ให้กระบวนการหยุดทํางานหาก
        คลัง
        # หยุดทํางาน ตั้งค่าการหมดเวลา [หลังจาก [ expr { $timeout_seconds * 1000 } ]  [ชุดรายการเสร็จสิ้น -1] ]

        # ห้ามดําเนินการต่อจนกว่าจะพบหมายเลขการแก้ไข
        หมายเลข หรือเวลาดําเนินการ ยกเลิกการหมดเวลาต่อไป
        vwait เสร็จสิ้น
        แล้วหลังจากยกเลิก
$timeout}

} # ขั้นตอนตัวช่วยเหลือสําหรับget_revision_infoขั้นตอนข้างต้น
{ inp } { เสร็จสิ้น

    ทั่วโลกrevision_number

    หาก { [eof $inp] } {
        {close $inp} ตั้งค่า {close $inp}
        เสร็จสิ้น 1 } อย่างอื่น { $done }
        รับบรรทัด$inp
    } อีก {
        รับบรรทัด$inp
        # ใช้การแสดงออกปกติเพื่อจับคู่บรรทัดด้วย
        หมายเลข
        ฉบับแก้ไข หาก { [regexp {^Revision:\s+(\d+)\s*$}$line match revision_number] } {
            set done 1
        } } } #

สร้างธนาคารลงทะเบียนในไฟล์ verilog ที่มีgenerate_verilog proc ค่า hex ที่ระบุ
{ hex_value } { set num_digits

    [ความยาวสตริง$hex bit_width_value]
    ตั้งค่าbit_width [expr { 4 * $num_digits } ]
    ตั้งค่าhigh_index [expr { $bit_width - 1 } ]
    ตั้งค่าreset_value [string repeat "0" $num_digits]

    หาก { [เข้าถึง { ตั้งค่า
        fh [เปิด "version_reg.v" ]
        ใส่$fh "โมดูล version_reg (นาฬิกา รีเซ็ต data_out)"
        ใส่ $fh "    สัญญาณนาฬิกาอินพุต"
        ใส่ $fh "    รีเซ็ตการป้อนข้อมูล"
        ใส่ $fh "    output \[$high_index:0\] data_out;"
        ใส่ $fh "    reg \[$high_index:0\] data_out;"
        ใส่ $fh "    เสมอ @ (posedge Clock หรือ negedge reset) จะเริ่ม
        $fh " if        (!reset)"
        ใส่ $fh "            data_out <= ${bit_width}'h$reset_value};
        ใส่ $fh "        else"
        ใส่ $fh "            data_out <= ${bit_width}'h$hex_value};
        puts $fh "    end"
        ทําให้$fhปิด "endmodule"
        $fh }
    res ] } {
        ข้อผิดพลาดของรหัสส่งคืน $res
    } อื่น { return
        1 } } #

บรรทัดนี้รองรับจุดเริ่มต้นของการเขียนสคริปต์อัตโนมัติ
{ การปรับปรุงโครงการโฟลว์ } $quartus(args) { break }

set file_name ${project}.qpf set done
0 set revision_number
"" #

ขั้นตอนการโทรเพื่อรับหมายเลขการแก้ไขไฟล์และจัดการกับข้อผิดพลาดใดๆ
หาก { { get_subversion_revision $file_name }
   } { post_message -type critical_warning "คําสั่งจดบันทึกการไม่ทํางานเพื่อขอรับหมายเลขการปรับปรุง $msg" 
} อื่น { หาก { 
   -1 == $done }  { post_message 
      -type critical_warning "หมายเลขการปรับปรุงการหมดเวลา" 
   } } อื่นๆ {[string equal "" $revision_number] } { 
      post_message -type critical_warning "ไม่พบหมายเลขการปรับปรุงในเอาต์พุตข้อมูล svn $file_name" 
   } อย่างอื่น { 
      #  Call procedure เพื่อจัดเก็บหมายเลข 
       หาก { {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

เนื้อหาในหน้านี้เป็นการผสมผสานระหว่างการแปลเนื้อหาต้นฉบับภาษาอังกฤษโดยมนุษย์และคอมพิวเตอร์ เนื้อหานี้จัดทำขึ้นเพื่อความสะดวกของคุณและเพื่อเป็นข้อมูลทั่วไปเท่านั้นและไม่ควรอ้างอิงว่าสมบูรณ์หรือถูกต้อง หากมีความขัดแย้งใด ๆ ระหว่างเวอร์ชันภาษาอังกฤษของหน้านี้กับคำแปล เวอร์ชันภาษาอังกฤษจะมีผลเหนือกว่าและควบคุม ดูเวอร์ชันภาษาอังกฤษของหน้านี้