การมีหมายเลขเวอร์ชันหรือตราประทับเวลาฝังอยู่ในการออกแบบ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 ชื่อ>
ดูข้อมูลเพิ่มเติมเกี่ยวกับการกําหนดและวิธีการอื่นๆ ในการเรียกใช้สคริปต์โดยอัตโนมัติได้ที่การดําเนินการสคริปต์อัตโนมัติ
ตัว อย่าง เช่น
ตัวอย่างสคริปต์ต่อไปนี้ใช้ขั้นตอนจากตัวอย่างสองตัวอย่างต่อไปนี้:
- รับหมายเลข: อ่านหมายเลขการปรับปรุงซอฟต์แวร์ควบคุมเวอร์ชัน
- จัดเก็บหมายเลข: ไฟล์ Verilog พร้อมด้วยการลงทะเบียนที่ธนาคาร
# รับหมายเลขการปรับปรุง 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