ID บทความ: 000076343 ประเภทข้อมูล: การแก้ไขปัญหา การตรวจสอบครั้งล่าสุด: 05/10/2015

ทําไมบล็อก Native Fixed Point DSP ของฉันแสดงความหน่วงแฝงที่ไม่คาดคิดในการจําลอง

สิ่งแวดล้อม

  • Intel® Quartus® II Subscription Edition
  • DSP
  • การจำลองแบบ
  • BUILT IN - ARTICLE INTRO SECOND COMPONENT
    คำอธิบาย

    สําหรับการผสมผสานพารามิเตอร์ ตัวจําลอง และสไตล์การเขียนโค้ด RTL ความหน่วงแฝงของบล็อกนี้ในการจําลองจะแยกความแตกต่างจากความหน่วงแฝงที่คาดไว้โดย - หนึ่งนาฬิกา ฮาร์ดแวร์ที่แท้จริงแสดงความหน่วงที่คาดหวัง

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

    ความละเอียด

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

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

    หากต้องการบรรลุเป้าหมายนี้ ให้ปรับเปลี่ยนเทสเบนช์ของคุณเป็น:

    1. ตรวจสอบให้แน่ใจว่า อินพุตการสร้างสัญญาณนาฬิกาไปยังบล็อก DSP Native เป็นสัญญาณเดียวกันกับอินพุตสัญญาณนาฬิกาไปยังบล็อก DSP แบบเนทีฟ
    2. หากไม่พบ #1 ให้ หน่วงเวลา ของข้อมูลอินพุตเมื่อเทียบกับนาฬิกา

    ตัวอย่างเช่น พิจารณารหัส RTL ดั้งเดิมต่อไปนี้:

    RTL ดั้งเดิม:

    clk_gen: กระบวนการ
    เริ่ม ต้น
    clk_orig <= \'0\'
    รอ 5 ns;
    clk_orig <= \'1\'
    รอ 5 ns;
    กระบวนการสิ้นสุด;

    ...

    หาก (rising_edge(clk_orig))
    ax <= ax 1;
    ay <= ay - 1;
    สิ้นสุดถ้า

    mac_test_bad_style: mult_acc
    แผนผังพอร์ต (
    ...
    ax => std_logic_vector(ax), -- [in]
    ay => std_logic_vector(ay), -- [in]
    clk => ("00" & clk_orig), -- [in]
    resulta => resulta2, -- [out]
    ...
    );

    resulta2 จะแสดงความหน่วงแฝงของนาฬิกาหนึ่งนาฬิกาน้อยกว่าที่คาดไว้ โปรดทราบว่าการมาบรรจบกันของ "00 & clk" ในการมอบหมายพอร์ต clk ของตัวคูณจะเพิ่มความล่าช้าของส่วนที่แตกต่างของการจําลองจาก "clk_orig" ซึ่งจะสร้างข้อมูลอินพุต

    วิธีแก้ไขปัญหาที่เป็นไปได้ได้แก่:

    ตัวอย่างที่ 1 คําแนะนํา: ใช้นาฬิกาแบบ 3 บิตตลอด

    คุณสามารถสร้างสัญญาณนาฬิกาแบบ 3 บิตของตัวคูณได้โดยตรง และใช้บิตแบบ Active เพื่อสัญญาณนาฬิกาข้อมูลอินพุต:

    clk_gen: กระบวนการ
    เริ่ม ต้น
    clk3bit <= \'000\';
    รอ 5 ns;
    clk3bit <= \'001\';
    รอ 5 ns;
    กระบวนการสิ้นสุด;

    ...

    ถ้า (rising_edge(clk3bit(0)) แล้ว
    ax <= ax 1;
    ay <= ay - 1;
    สิ้นสุดถ้า

    mac_test_bad_style: mult_acc
    แผนผังพอร์ต (
    ...
    ax => std_logic_vector(ax), -- [in]
    ay => std_logic_vector(ay), -- [in]
    clk => (clk_3bit), -- [in]
    resulta => resulta2, -- [out]
    ...
    );

    ตัวอย่างที่ 2 คําแนะนําทางเลือก: เพิ่มความล่าช้าที่เกี่ยวข้องให้กับข้อมูลอินพุต

    คําสั่ง \'clk => ("00" &clk_orig)\' เป็นเหตุให้พอร์ต \'clk" มีความล่าช้าของส่วนที่แตกต่างของการจําลองเพิ่มเติมจาก \'clk_orig\' ที่\'s ขับเคลื่อนข้อมูล เพื่อเอาชนะสิ่งนี้คุณสามารถใช้กระบวนการ clk_gen ดั้งเดิมและเพิ่มความล่าช้าของส่วนที่แตกต่างของการจําลองให้กับข้อมูลด้วยรายงานการมอบหมาย

    clk_gen: ประมวลผล (เหมือนกับต้นฉบับ)

    ax_del <= ax;
    ay_del<=ay;

    mac_test_bad_style: mult_acc
    แผนผังพอร์ต (
    ...
    ax => std_logic_vector(ax_del), -- [in]
    ay => std_logic_vector(ay_del), -- [in]
    clk => ("00" & clk_orig), -- [in]
    resulta => resulta2, -- [out]
    ...
    );

    ผลิตภัณฑ์ที่เกี่ยวข้อง

    บทความนี้จะนำไปใช้กับ 1 ผลิตภัณฑ์

    Intel® Arria® 10 GX FPGA

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