สําหรับการผสมผสานพารามิเตอร์ ตัวจําลอง และสไตล์การเขียนโค้ด RTL ความหน่วงแฝงของบล็อกนี้ในการจําลองจะแยกความแตกต่างจากความหน่วงแฝงที่คาดไว้โดย - หนึ่งนาฬิกา ฮาร์ดแวร์ที่แท้จริงแสดงความหน่วงที่คาดหวัง
ตัวอย่างเช่น หากนาฬิกาที่ขับเคลื่อนบล็อก DSP เป็นเวอร์ชั่นที่ล่าช้าของนาฬิกาที่สร้างข้อมูลอินพุต จึงทําให้เกิดความล่าช้าในการจําลองสําหรับสัญญาณนาฬิกาอินพุตมากกว่าข้อมูลอินพุต
ในการแก้ไขปัญหานี้ คุณต้องตรวจสอบให้แน่ใจว่าสัญญาณนาฬิกาที่สร้างข้อมูลอินพุตไปยังบล็อก DSP และสัญญาณนาฬิกาอินพุตของบล็อก DSP สมดุลโดยความล่าช้าของข้อมูลอินพุต หรือตรวจสอบให้แน่ใจว่าข้อมูลอินพุตมาถึงในเวลาต่อมาอย่างสัมบูรณ์ หรือเวลาหน่วงเวลาส่วนที่แตกต่างของการจําลองที่ใหม่กว่า เมื่อเปรียบเทียบกับสัญญาณนาฬิกาขาเข้าของบล็อก DSP
โปรดทราบว่าสิ่งต่าง ๆ เช่นคําแถลงการมอบหมายที่มากขึ้นบนพาธนาฬิกาเทียบกับพาธข้อมูลจะทําให้เกิดความแตกต่างระหว่างส่วนที่แตกต่างของการจําลองระหว่างพาธเหล่านั้น
หากต้องการบรรลุเป้าหมายนี้ ให้ปรับเปลี่ยนเทสเบนช์ของคุณเป็น:
- ตรวจสอบให้แน่ใจว่า อินพุตการสร้างสัญญาณนาฬิกาไปยังบล็อก DSP Native เป็นสัญญาณเดียวกันกับอินพุตสัญญาณนาฬิกาไปยังบล็อก DSP แบบเนทีฟ
- หากไม่พบ #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]
...
);