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

1

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