เนื่องจากปัญหาในซอฟต์แวร์ Intel® Quartus® Prime เวอร์ชั่น 16.0 ขึ้นไป คุณอาจพบว่าคุณลักษณะของ 'no_rw_check' ถูกละเลยหากคุณประกาศเอาต์พุตของ RAM เป็นสัญญาณกลางแทนพอร์ตเอาต์พุต ปัญหานี้ไม่เกิดขึ้นในซอฟต์แวร์ Intel Quartus Prime เวอร์ชั่น 15.1 และก่อนหน้า
หากคุณย้ายการออกแบบไปใช้ซอฟต์แวร์ Intel Quartus Prime เวอร์ชั่น 16.0 ขึ้นไป ให้ตรวจสอบรายงานภายใต้การวิเคราะห์และการสังเคราะห์ -> LPM_Parameter Settings -> RAM ตรวจสอบให้แน่ใจว่าพารามิเตอร์ READ_DURING_WRITE_MODE_MIXED_PORTS มีค่า DON'T CARE หากมีการใช้คุณลักษณะ 'no_rw_check'
ตัวอย่างด้านล่างแสดงโค้ด "no_rw_check" ของคุณลักษณะที่ตรวจพบไม่พบในซอฟต์แวร์ Intel Quartus Prime เวอร์ชั่น 16.0 เป็นต้นไป:
LIBRARY ieee;
ใช้ ieee.std_logic_1164.ALL;
RAM ของเอ็นติตี
พอร์ต (
นาฬิกา: IN STD_LOGIC;
ข้อมูล: IN STD_LOGIC_VECTOR (2 DOWNTO 0);
write_address: INTEGER RANGE 0 ถึง 31;
read_address: ในช่วง INTEGER 0 ถึง 31;
เรา: ในSTD_LOGIC
Q: OUT STD_LOGIC_VECTOR (2 DOWNTO 0)
);
END RAM;
สถาปัตยกรรม rtl of ram IS
TYPE MEM เป็น ARRAY(0 ถึง 31) ของSTD_LOGIC_VECTOR(2 ดาวน์โต 0);
ram_blockสัญญาณ: MEM;
ลักษณะ RAM ของคุณลักษณะเฉพาะ : string;
คุณลักษณะเฉพาะของram_block : สัญญาณคือ "no_rw_check";
read_address_regสัญญาณ: ช่วง INTEGER 0 ถึง 31;
SIGNAL q_reg : STD_LOGIC_VECTOR (2 DOWNTO 0);
เริ่ม ต้น
PROCESS (นาฬิกา)
เริ่ม ต้น
IF (เหตุการณ์นาฬิกาและนาฬิกา = '1') แล้ว
IF (เรา = '1') แล้ว
ram_block(write_address) <= ข้อมูล
สิ้นสุดถ้า;
read_address_reg <= read_address;
สิ้นสุดถ้า;
ไม่พบคุณลักษณะ 'no_rw_check' โค้ดที่สนิปในซอฟต์แวร์ Intel Quartus Prime เวอร์ชั่น 16.0 เป็นต้นไป
------------------------------------------------------------------------------------
IF (เหตุการณ์นาฬิกาและนาฬิกา = '1') แล้ว
q_reg <= ram_block(read_address_reg);
สิ้นสุดถ้า;
q <= q_reg;
------------------------------------------------------------------------------------
กระบวนการสิ้นสุด;
END RTL;
หากต้องการแก้ไขปัญหานี้ ให้เปิดตรรกะเพิ่ม Pass-through ไปยัง Inferred RAM ใน
การมอบหมาย -> การตั้งค่า ->การตั้งค่าคอมไพเลอร์ ->การตั้งค่าขั้นสูง (การสังเคราะห์)
หรือ
ประกาศสัญญาณเอาต์พุตของ RAM เป็นพอร์ตเอาต์พุตโดยไม่ใช้สัญญาณกลางโดยเปลี่ยนรหัสสนิปข้างต้นด้วยรหัสด้านล่าง:
------------------------------------------------------------------------------------
IF (เหตุการณ์นาฬิกาและนาฬิกา = '1') แล้ว
q <= ram_block(read_address_reg);
สิ้นสุดถ้า;
------------------------------------------------------------------------------------
ปัญหานี้มีกําหนดเวลาให้แก้ไขในซอฟต์แวร์ Intel Quartus Prime Pro Edition ในอนาคต