ตัวอย่าง Quartus® II Tcl: ทําให้พินทั้งหมดเป็นเสมือน

author-image

โดย

หากคุณใช้โฟลว์การออกแบบ Modular Logic Lock Region ในโครงการของคุณ คุณอาจเลือกทําพิน I/O ทั้งหมดในพิน I/O เสมือนของโมดูล เป็นวิธีการนําเข้าโมดูลในการออกแบบระดับสูงสุดได้อย่างง่ายดาย นอกจากนี้ หากคุณต้องการคอมไพล์คอร์ IP เพื่อดูว่ามีการใช้ทรัพยากรจํานวนเท่าใด แต่ใช้พินมากเกินไปสําหรับอุปกรณ์เป้าหมายของคุณ ทําให้พินเสมือนอาจอนุญาตให้คอร์พอดี

ขั้นตอนง่ายๆ ต่อไปนี้ทําให้พินทั้งหมดในพิน I/O เสมือนการออกแบบของคุณ ประการแรก มีการสังเคราะห์การออกแบบเพื่อตรวจสอบว่าโหนดใดเป็นพิน ถัดไป ชุดรหัสชื่อจะถูกตั้งค่าให้สอดคล้องกับพินในการออกแบบ จากนั้นจะมีการนําการกําหนดVIRTUAL_PINไปใช้กับพินทุกพิน สุดท้ายคําสั่ง export_assignments เขียนงานที่ได้รับมอบหมายใหม่ทั้งหมดไปยังไฟล์การตั้งค่า Quartus II (.qsf) ของโครงการ

ตัวอย่างใช้คําสั่ง get_names และ get_name_info ซึ่งมีให้มาตั้งแต่เวอร์ชัน 4.0 ของซอฟต์แวร์ Quartus II (เวอร์ชัน 2.0 ของ แพ็คเกจ ::quartus::p roject) ดูตัวอย่างสุดท้ายในหน้านี้สําหรับรหัสที่จะทํางานเริ่มต้นด้วยเวอร์ชัน 3.0 ของซอฟต์แวร์ Quartus II และมีความสามารถขั้นสูงมากขึ้น

load_package flow

proc make_all_pins_virtual {} {

    execute_module -tool map

    set name_ids [get_names -filter * -node_type pin]

    foreach_in_collection name_id $name_ids {
        ตั้งค่าpin_name [get_name_info -info full_path $name_id]
        post_message "การมอบหมายVIRTUAL_PINไปยัง $pin_name"
        set_instance_assignment -to $pin_name -name VIRTUAL_PIN ON } export_assignments
}

การปรับปรุงรหัสตัวอย่าง

มีหลายวิธีที่สามารถปรับปรุงโค้ดตัวอย่างได้

ลบการมอบหมายVIRTUAL_PINที่มีอยู่

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

remove_all_instance_assignments -name VIRTUAL_PIN

ยกเว้นพินบางตัวด้วยตนเอง เช่น นาฬิกา

สําหรับซอฟต์แวร์ Quartus II เพื่อดําเนินการปรับแต่งการกําหนดเวลาให้เหมาะสมกับการออกแบบ นาฬิกาต้องเชื่อมต่อกับพิน I/O ระดับสูงสุดในอุปกรณ์เป้าหมาย และนาฬิกาต้องมีการตั้งค่านาฬิกา ซึ่งเป็นเรื่องจริง แม้ว่าพินอื่นๆ ทั้งหมดในการออกแบบจะเป็นพิน I/O เสมือนก็ตาม ดังนั้นตัวอย่างพื้นฐานข้างต้นป้องกันไม่ให้ซอฟต์แวร์ Quartus II ทําการเพิ่มประสิทธิภาพเวลาในระหว่างการคอมไพล์เนื่องจากพินทั้งหมด รวมถึงนาฬิกาจะมีการมอบหมายVIRTUAL_PIN

คุณสามารถเพิ่มพารามิเตอร์ไปยังขั้นตอนที่ยอมรับรายการสัญญาณที่แยกจากการบ้านVIRTUAL_PIN รายการนี้มักจะเป็นชื่อของพินนาฬิกาในการออกแบบของคุณ ตัวอย่างต่อไปนี้ยอมรับรายชื่อที่จะไม่รวม นอกจากนี้ยังมีคําสั่งในการลบการบ้านVIRTUAL_PINที่มีอยู่ที่กล่าวถึงข้างต้น

แพคเกจขั้นตอนload_packageต้องใช้

cmdline proc make_all_pins_virtual { args } {

    set options {\ {
        "exclude.arg" "" "รายการสัญญาณที่แยก" } \
    ชุดอาร์เรย์ที่เลือก [::cmdline::getoptions quartus(0 $options)

    remove_all_instance_assignments -name VIRTUAL_PIN execute_module
    -ชุดแผนผังเครื่องมือ
    name_ids [get_names -filter * -node_type pin]

    foreach_in_collection name_id $name_ids {
        ตั้งค่าpin_name [get_name_info -info full_path $name_id]

        หาก { -1 == [lsearch -exact $opts(ไม่รวม) $pin_name] } {
            post_message "การมอบหมายVIRTUAL_PINไปยัง $pin_name"
            set_instance_assignment -to $pin_name -name VIRTUAL_PIN ON }
        อื่น { post_message
            "ข้ามการมอบหมายVIRTUAL_PINไปยัง $pin_name" } }
        export_assignments
}

คุณสามารถเรียกขั้นตอนด้วยคําสั่งนี้ ตัวอย่างนี้อนุมานว่าคุณมีนาฬิกาสองนาฬิกาในการออกแบบที่ใช้ชื่อว่า clk_a และ clk_b

make_all_pins_virtual -ไม่รวม { clk_a clk_b }

ระบุ & จัดการนาฬิกาโดยอัตโนมัติ

ตัวอย่างก่อนหน้าที่จะไม่รวมสัญญาณบางตัวจะมีข้อเสียที่จะต้องป้อนด้วยมือ เป็นไปได้ที่จะตรวจสอบสัญญาณนาฬิกาด้วยคําสั่งในแพ็คเกจ ::quartus:advanced_timing แพคเกจนี้พร้อมใช้งานสําหรับการโหลดเฉพาะ quartus_tan ปฏิบัติการ ดังนั้นคุณต้องใช้ quartus_tan เรียกใช้สคริปต์ด้วยตัวอย่างต่อไปนี้ คําสั่งในตัวอย่างนี้ทั้งหมดรองรับตั้งแต่เวอร์ชัน 3.0 ของซอฟต์แวร์ Quartus II

การระบุนาฬิกาโดยอัตโนมัติมีข้อได้เปรียบที่ช่วยให้คุณสามารถสมัครงานUSE_CLK_FOR_VIRTUAL_PINโดยอัตโนมัติได้ คุณสามารถใช้การบ้านUSE_CLK_FOR_VIRTUAL_PINร่วมกับการมอบหมายVIRTUAL_PINเพื่อเชื่อมโยงการตั้งค่านาฬิกากับนาฬิกาในการออกแบบของคุณ ซึ่งจะช่วยให้ Quartus II Fitter มีข้อมูลที่ถูกต้องเกี่ยวกับข้อกําหนดเวลาเมื่อคุณคอมไพล์การออกแบบด้วยพิน I/O เสมือน สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการกําหนดนี้ โปรดดูหัวข้อ ตัวเลือกตรรกะนาฬิกาเสมือน ใน วิธีใช้ Quartus II

ขั้นตอนตัวอย่างต่อไปนี้ทําให้พิน I/O ทั้งหมดในพิน I/O เสมือนการออกแบบของคุณ นอกจากนี้ยังทําการบ้านตั้งนาฬิกาเสมือนตามความเหมาะสมอีกด้วย

รหัสตัวอย่างแรกสังเคราะห์การออกแบบของคุณ จากนั้น Netlist กําหนดเวลาที่มีอยู่จะพยายามลบรายการจับเวลาที่มีอยู่ก่อนสร้างเน็ตลิสต์ใหม่ คําสั่ง get_timing_nodes สร้างชุดโหนดสองชุดจาก Netlist กําหนดเวลา: pin_idsและclk_ids คอลเลกชันทั้งสองมีแต่เพียงผู้เดียว ไม่มีโหนดในคอลเลกชัน clk_ids อยู่ในคอลเลกชัน pin_ids แม้ว่านาฬิกาจะอยู่บนพิน I/O ก็ตาม

ลูป foreach_in_collection แรกจะได้รับชื่อของพินแต่ละพินในการออกแบบ (ไม่รวมพินนาฬิกา) และทําการบ้านVIRTUAL_PIN

ลูป foreach_in_collection ที่สองจะได้รับชื่อของนาฬิกาแต่ละนาฬิกาในการออกแบบ คําสั่ง get_instance_assignment จะดึงการตั้งค่านาฬิกาที่เกี่ยวข้องหากมีอยู่ หากไม่มีการตั้งค่านาฬิกา (สตริงไม่ว่างเปล่า) สคริปต์จะทําการมอบหมายUSE_CLOCK_FOR_VIRTUAL_PINให้กับชื่อนาฬิกาด้วยค่าของชื่อการตั้งค่านาฬิกา

make_all_pins_virtualการกําหนดเวลาload_packageโฟลว์
load_package load_package advanced_timing

proc { } { { remove_all_instance_assignments -name VIRTUAL_PIN remove_all_instance_assignments
    -name USE_CLK_FOR_VIRTUAL_PIN

    -execute_moduleรายละเอียดแผนที่เครื่องมือ { delete_timing_netlist } ชุด
    create_timing_netlist
    -post_map
    
    ตั้งค่าpin_ids [get_timing_nodes -type pin]
    ตั้งค่าclk_ids [get_timing_nodes -type clk]
    
    # ทําให้การมอบหมายVIRTUAL_PINไปยังทุกพินใน design
    foreach_in_collection pin_id $pin_ids {

        ตั้งค่าpin_name [get_timing_node_info -info name $pin_id]
        post_message "การมอบหมายVIRTUAL_PINไปยัง $pin_name" set_instance_assignment
        -to $pin_name -name VIRTUAL_PIN ON
    } #

    สําหรับแต่ละนาฬิกาในการออกแบบ ตรวจสอบว่านาฬิกาได้รับ 
    การกําหนดค่า
    CLOCK_SETTINGSที่เกี่ยวข้องหรือไม่ foreach_in_collection clk_id $clk_ids {

        ตั้งค่าclk_name [get_timing_node_info -info name $clk_id]
        ตั้งค่าclk_stgs [get_instance_assignment -to $clk_name 
           \CLOCK_SETTINGS]

        # หากมีการตั้งค่านาฬิกาสําหรับนาฬิกานี้ ให้
        ทําการบ้าน #USE_CLK_FOR_VIRTUAL_PIN
        หาก { ![ สตริงเท่ากับ "" $clk_stgs] } {
            post_message "การมอบหมายUSE_CLK_FOR_VIRTUAL_PIN \
                ไปยัง $clk_name ที่มีค่า $clk_stgs"
            set_instance_assignment -to $clk_name \
                -name USE_CLK_FOR_VIRTUAL_PIN $clk_stgs } } export_assignments
}

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