คู่มือการประเมินประสิทธิภาพของ Xilinx DDR2 MIG 7
หมายเหตุสำคัญ: ไฟล์ PDF ของบันทึกคำตอบที่ดาวน์โหลดได้นี้มีไว้เพื่อเพิ่มความสามารถในการใช้งานและความสามารถในการอ่าน เป็นสิ่งสำคัญที่จะต้องทราบว่าบันทึกคำตอบคือ Web- เนื้อหาที่ได้รับการปรับปรุงบ่อยครั้งเมื่อมีข้อมูลใหม่ คุณได้รับการเตือนให้ไปที่ฝ่ายสนับสนุนด้านเทคนิคของ Xilinx Webเว็บไซต์และ review (คำตอบ Xilinx 63234) สำหรับเวอร์ชันล่าสุดของคำตอบนี้
การแนะนำ
เนื่องจากวิธีการสร้างหน่วยความจำ DDR2 และ DDR3 และคอนโทรลเลอร์ซีรีส์ MIG 7 ได้รับการออกแบบมา ประสิทธิภาพจึงไม่ตรงไปตรงมา
จำเป็นต้องมีความเข้าใจเกี่ยวกับพารามิเตอร์ Jedec Timing และสถาปัตยกรรมคอนโทรลเลอร์ต่างๆ และคุณจะต้องเรียกใช้การจำลองเพื่อให้ได้ค่าประมาณ
หลักการทั่วไปในการพิจารณาประสิทธิภาพจะเหมือนกัน แต่เอกสารนี้มีวิธีง่ายๆ ในการรับประสิทธิภาพโดยใช้ MIG เช่นampออกแบบโดยใช้แท่นทดสอบและตัวกระตุ้น fileที่แนบมาที่นี่
แบนด์วิดธ์ที่มีประสิทธิภาพ
บัสข้อมูล DRAM บรรลุแบนด์วิธเกือบสูงสุดเฉพาะระหว่างการอ่านและเขียนแบบต่อเนื่อง และโอเวอร์เฮดจะลดอัตราข้อมูลจริงลง
อดีตไม่กี่ampค่าโสหุ้ยคือ:
- เติมเงินเวลาเข้าถึงแถวในธนาคารเดียวกัน (ที่อยู่การเข้าถึงไม่ได้อยู่ในการตีหน้าแถวเดียวกัน)
- เวลากู้คืนการเขียนเพื่อเปลี่ยนจากการเข้าถึงการเขียนเป็นการอ่าน
- เวลาตอบสนองของรถบัสเพื่อเปลี่ยนจากการอ่านเป็นการเขียน
แบนด์วิธที่มีประสิทธิภาพ = แบนด์วิธสูงสุด * ประสิทธิภาพ
การออกแบบ MIG
อ้างถึง UG586 บทที่ 1 สำหรับรายละเอียดทีละขั้นตอนเกี่ยวกับ MIG IP และตัวอย่างampเลอ ดีไซน์ เจเนอเรชัน
ก่อนเรียกใช้การจำลองประสิทธิภาพ MIG 7 Series ให้ทำดังต่อไปนี้เพื่อให้แน่ใจว่าสภาพแวดล้อมการจำลองของคุณเหมาะสม เปิด MIG เช่นampออกแบบและแมปไลบรารีที่เหมาะสม เรียกใช้การจำลอง และตรวจสอบให้แน่ใจว่าคุณสามารถเห็นข้อความ "ผ่านการทดสอบ" ในทรานสคริปต์
เพื่อแสดงโฟลว์ ฉันได้สร้าง MIG IP สำหรับ xc7vx690tffg1761-2 และเรียกใช้ exampเลอดีไซน์
สองสิ่งที่ควรสังเกตคือบิตที่อยู่หน่วยความจำและการเลือกการจับคู่ที่อยู่หน่วยความจำ
เช่นampฉันได้เลือก MT41J128M8XX-125 ภายใต้ตัวเลือกแบบเลื่อนลงในส่วนของหน่วยความจำ
สำหรับส่วนหน่วยความจำที่เลือกจากรูปที่ 1 แถว = 14 คอลัมน์ = 10 และธนาคาร = 3 ดังนั้น app_addr_width = แถว + คอลัมน์ + ธนาคาร + อันดับ = 28
คุณสามารถเลือกได้ทั้งคอลัมน์ BANK_ROW_COLUMN หรือ ROW BANK
ฉันออกจากคอลัมน์ ROW BANK ซึ่งเป็นการแมปที่อยู่เริ่มต้นแล้ว
Example การออกแบบการจำลองด้วยม้านั่งทดสอบที่สังเคราะห์ได้
ภายใต้การตั้งค่าการจำลอง เลือก QuestaSim/ModelSim Simulator และเรียกดูตำแหน่งของไลบรารีที่คอมไพล์แล้ว
สำหรับรายละเอียดเกี่ยวกับการชี้ไปยังพาธการติดตั้งเครื่องมือของบุคคลที่สาม การเลือกตัวจำลองเป้าหมาย และการคอมไพล์และแมปไลบรารี คุณสามารถดู (UG900) คู่มือผู้ใช้ Vivado Design Suite การจำลองลอจิก
เรียกใช้การจำลองผ่าน GUI (คลิกแท็บเรียกใช้การจำลองในตัวจัดการโครงการ) และตรวจสอบให้แน่ใจว่าคุณเห็นข้อความ "ผ่านการทดสอบ" ในทรานสคริปต์
การปรับเปลี่ยน RTL การจำลองประสิทธิภาพ
- คลิกขวาที่แท็บแหล่งที่มา เลือก "เพิ่มหรือสร้างแหล่งที่มาของการจำลอง" และเรียกดู mig7_perfsim_traffic_generator.sv file และคลิกเสร็จสิ้นเพื่อเพิ่ม
- คลิกขวาที่แท็บแหล่งที่มา เลือก "เพิ่มหรือสร้างแหล่งที่มาของการจำลอง" เรียกดู perfsim_stimulus.txt แล้วคลิกเสร็จสิ้นเพื่อเพิ่ม
- แสดงความคิดเห็นเกี่ยวกับอดีตampการสร้างอินสแตนซ์ le_top ใน sim_tb_top.v file.
- เพิ่มบรรทัด RTL ด้านล่างไปที่ sim_tb_top,v
- พารามิเตอร์ท้องถิ่น APP_ADDR_WIDTH = 28;
- พารามิเตอร์ท้องถิ่น APP_DATA_WIDTH = 64;
- พารามิเตอร์ท้องถิ่น APP_MASK_WIDTH = APP_DATA_WIDTH / 8;
- พารามิเตอร์ท้องถิ่น MEM_ADDR_ORDER = “BANK_ROW_COLUMN”;
- ท้องถิ่นพารามิเตอร์ BANK_WIDTH = 3;
- พารามิเตอร์ท้องถิ่น RANK_WIDTH = 1;
- สาย [APP_ADDR_WIDTH-1:0] c0_ddr3_app_addr;
- สาย [2:0] c0_ddr3_app_cmd;
- สาย c0_ddr3_app_en;
- สาย [APP_DATA_WIDTH-1:0] c0_ddr3_app_wdf_data;
- สาย c0_ddr3_app_wdf_end;
- สาย [APP_MASK_WIDTH-1:0] c0_ddr3_app_wdf_mask;
- สาย c0_ddr3_app_wdf_wren;
- สาย [APP_DATA_WIDTH-1:0] c0_ddr3_app_rd_data;
- สาย c0_ddr3_app_rd_data_end;
- สาย c0_ddr3_app_rd_data_valid;
- สาย c0_ddr3_app_rdy;
- สาย c0_ddr3_app_wdf_rdy;
- สาย c0_data_compare_error;
- สาย ui_clk;
- สาย ui_clk_sync_rst;
- สาย app_sr_req = 0;
- สาย app_ref_req = 0;
- สาย app_zq_req = 0;
- สาย c0_app_wdf_mask = 0;
การสร้างอินสแตนซ์ของ FPGA Memory Controller
mig_7series_0_mig u_mig_7series_0_mig (
// พอร์ตเชื่อมต่อหน่วยความจำ
- .ddr3_addr (ddr3_addr_fpga)
- .ddr3_ba (ddr3_ba_fpga)
- .ddr3_cas_n (ddr3_cas_n_fpga)
- .ddr3_ck_n (ddr3_ck_n_fpga)
- .ddr3_ck_p (ddr3_ck_p_fpga)
- .ddr3_cke (ddr3_cke_fpga)
- .ddr3_ras_n (ddr3_ras_n_fpga)
- .ddr3_reset_n (ddr3_reset_n)
- .ddr3_we_n (ddr3_we_n_fpga)
- .ddr3_dq (ddr3_dq_fpga)
- .ddr3_dqs_n (ddr3_dqs_n_fpga)
- .ddr3_dqs_p (ddr3_dqs_p_fpga)
- .init_calib_complete (init_calib_complete)
- .ddr3_cs_n (ddr3_cs_n_fpga)
- .ddr3_dm (ddr3_dm_fpga)
- .ddr3_odt (ddr3_odt_fpga)
// พอร์ตอินเทอร์เฟซแอปพลิเคชัน
- .app_addr (c0_ddr3_app_addr)
- .app_cmd (c0_ddr3_app_cmd)
- .app_en (c0_ddr3_app_en)
- .app_wdf_data (c0_ddr3_app_wdf_data)
- .app_wdf_end (c0_ddr3_app_wdf_end)
- .app_wdf_wren (c0_ddr3_app_wdf_wren)
- .app_rd_data (c0_ddr3_app_rd_data)
- .app_rd_data_end (แอพ_rd_data_end),
- .app_rd_data_valid (c0_ddr3_app_rd_data_valid)
- .app_rdy (c0_ddr3_app_rdy)
- .app_wdf_rdy (c0_ddr3_app_wdf_rdy)
- .app_sr_req (แอป_sr_req),
- .app_ref_req (แอป_ref_req),
- .app_zq_req (แอป_zq_req),
- .app_sr_active (แอพ_sr_active),
- .app_ref_ack (แอป_ref_ack),
- .app_zq_ack (แอพ_zq_ack),
- .ui_clk (ui_clk)
- .ui_clk_sync_rst (ui_clk_sync_rst)
- .app_wdf_mask (c0_ddr3_app_wdf_mask)
// พอร์ตนาฬิการะบบ
- .sys_clk_i (ซิส_clk_i),
// พอร์ตนาฬิกาอ้างอิง
- .clk_ref_i (คลิก_ref_i),
- .sys_rst (ซิส_อาร์ส)
- );
การสร้างอินสแตนซ์ของตัวสร้างทราฟฟิกประสิทธิภาพ
เครื่องกำเนิดการจราจร mig7_perfsim#
(
.APP_DATA_WIDTH (APP_DATA_WIDTH)
.COL_WIDTH (COL_WIDTH)
.ROW_WIDTH (ROW_WIDTH)
.RANK_WIDTH (อันดับ_WIDTH),
.BANK_WIDTH (BANK_WIDTH)
.MEM_ADDR_ORDER (MEM_ADDR_ORDER)
.tCK (ทีซีเค ),
.ADDR_WIDTH (แอป ADDR_WIDTH)
)
u_traffic_gen
(
.clk (ui_clk )
.rst (ui_clk_sync_rst )
.init_calib_complete (init_calib_complete)
.cmp_error (c0_data_compare_error)
.app_wdf_rdy (c0_ddr3_app_wdf_rdy )
.app_rd_data_valid (c0_ddr3_app_rd_data_valid)
.app_rd_data (c0_ddr3_app_rd_data)
.app_rdy (c0_ddr3_app_rdy)
.app_cmd (c0_ddr3_app_cmd )
.app_addr (c0_ddr3_app_addr )
.app_en (c0_ddr3_app_en )
.app_wdf_mask (c0_ddr3_app_wdf_mask)
.app_wdf_data (c0_ddr3_app_wdf_data)
.app_wdf_end (c0_ddr3_app_wdf_end )
.แอพ_ดับเบิ้ลยูดีเอฟ_เรน (c0_ddr3_app_wdf_wren)
);
- 5. แก้ไข APP_ADDR_WIDTH, APP_DATA_WIDTH, RANK_WIDTH และ BANK_WIDTH ตามการเลือกส่วนหน่วยความจำของคุณ
สามารถหาค่าได้จาก _mig.v file. - ชื่ออินสแตนซ์ที่ไฮไลต์สีเหลือง mig_7series_0_mig อาจแตกต่างกันไปตามชื่อคอมโพเนนต์ของคุณระหว่างการสร้าง IP ตรวจสอบว่าคุณได้เลือกชื่ออื่นหรือไม่ และเปลี่ยนตามนั้น
- เมื่อสร้าง IP แล้วให้เปิด _mig.v file และตรวจสอบการเปลี่ยนแปลงใดๆ ในชื่อสัญญาณ LHS และแก้ไขให้ถูกต้อง
- app_sr_req, app_ref_req และ app_zq_req ควรเริ่มต้นเป็น 0
- ในฐานะอดีตample_top.v ถูกแสดงความคิดเห็นและใหม่ fileเพิ่ม s แล้ว คุณอาจเห็น “?” ข้าง
mig_7series_0_mig.v file ภายใต้แหล่งจำลอง
เพื่อทำแผนที่ให้ถูกต้อง fileให้คลิกขวาที่ mig_7series_0_mig.v เลือก “Add Sources” เรียกดู
/mig_7series_0_example.srcs/sources_1/ip/mig_7series_0/mig_7series_0/user_design/rtl
และเพิ่ม mig_7series_0_mig_sim.v file. - หากคุณเห็น “?” สำหรับพื้นฐาน files เพิ่ม RTL ทั้งหมด fileในโฟลเดอร์ clocking, controller, ip_top,phy และ UI
- เมื่อทำการเปลี่ยนแปลง RTL และสิ่งที่จำเป็นทั้งหมดแล้ว files ถูกเพิ่มไปยังแหล่งที่มาของการจำลอง ลำดับชั้นควรคล้ายกับรูปที่ 5
การ fileที่ถูกเน้นด้วยสีแดงจะถูกเพิ่มเข้ามาใหม่ และ “?” คาดหวังไว้บนโมดูลที่เกี่ยวข้องกับ ECC เนื่องจากการกำหนดค่าหน่วยความจำที่เลือกได้ปิดใช้งานตัวเลือก ECC
สิ่งกระตุ้น File คำอธิบาย
แต่ละรูปแบบการกระตุ้นคือ 48 บิต และรูปแบบได้อธิบายไว้ในรูปที่ 6-1 ถึง 6-4
การเข้ารหัสที่อยู่ (ที่อยู่ [35:0])
ที่อยู่ถูกเข้ารหัสในสิ่งกระตุ้นตามรูปที่ 7-1 ถึงรูปที่ 7-6 ช่องที่อยู่ทั้งหมดต้องป้อนในรูปแบบเลขฐานสิบหก ช่องที่อยู่ทั้งหมดเป็นความกว้างที่หารด้วยสี่เพื่อป้อนในรูปแบบเลขฐานสิบหก ม้านั่งทดสอบจะส่งเฉพาะบิตที่จำเป็นของฟิลด์ที่อยู่ไปยัง Memory Controller
เช่นample ในการกำหนดค่าแบงค์แปด เฉพาะแบงค์บิต [2:0] เท่านั้นที่ถูกส่งไปยัง Memory Controller และบิตที่เหลือจะถูกละเว้น บิตเพิ่มเติมสำหรับช่องที่อยู่มีไว้เพื่อให้คุณป้อนที่อยู่ในรูปแบบเลขฐานสิบหก
คุณต้องยืนยันว่าค่าที่ป้อนสอดคล้องกับความกว้างของการกำหนดค่าที่กำหนด
- ที่อยู่คอลัมน์ (คอลัมน์ [11:0]) – ที่อยู่คอลัมน์ในการกระตุ้นมีให้สูงสุด 12 บิต แต่คุณต้องระบุที่อยู่นี้ตามพารามิเตอร์ความกว้างของคอลัมน์ที่ตั้งค่าไว้ในการออกแบบของคุณ
- ที่อยู่แถว (แถว[15:0]) – ที่อยู่แถวในสิ่งกระตุ้นมีให้สูงสุด 16 บิต แต่คุณต้องระบุที่อยู่นี้ตามพารามิเตอร์ความกว้างของแถวที่ตั้งค่าไว้ในการออกแบบของคุณ
- ที่อยู่ธนาคาร (ธนาคาร[3:0]) – ที่อยู่ธนาคารในสิ่งกระตุ้นมีให้สูงสุดสี่บิต แต่คุณต้องระบุที่อยู่นี้ตามพารามิเตอร์ความกว้างของธนาคารที่กำหนดในการออกแบบของคุณ
- ที่อยู่อันดับ (อันดับ[3:0]) – ที่อยู่อันดับในสิ่งกระตุ้นมีให้สูงสุดสี่บิต แต่คุณต้องระบุที่อยู่นี้ตามพารามิเตอร์ความกว้างอันดับที่กำหนดในการออกแบบของคุณ
ที่อยู่ถูกรวบรวมตามพารามิเตอร์ MEM_ADDR_ORDER ระดับบนสุด และส่งไปยังอินเทอร์เฟซผู้ใช้
ทำซ้ำคำสั่ง (ทำซ้ำคำสั่ง [7:0])
จำนวนการทำซ้ำคำสั่งคือจำนวนครั้งที่คำสั่งนั้นถูกทำซ้ำที่ User Interface ที่อยู่สำหรับการทำซ้ำแต่ละครั้งจะเพิ่มขึ้น 8 จำนวนการทำซ้ำสูงสุดคือ 128
แท่นทดสอบไม่ได้ตรวจสอบขอบเขตของคอลัมน์ และจะล้อมรอบหากถึงขีดจำกัดสูงสุดของคอลัมน์ระหว่างการเพิ่ม
คำสั่ง 128 เต็มหน้า สำหรับที่อยู่คอลัมน์ใดๆ ที่ไม่ใช่ 0 การนับซ้ำของ 128 จะสิ้นสุดลงด้วยการข้ามขอบเขตของคอลัมน์และตัดรอบไปยังจุดเริ่มต้นของที่อยู่คอลัมน์
การใช้รถโดยสารประจำทาง
การใช้งานบัสจะคำนวณที่ User Interface โดยคำนึงถึงจำนวนการอ่านและเขียนทั้งหมด และใช้สมการต่อไปนี้:
- BL8 ใช้เวลาสี่รอบนาฬิกาหน่วยความจำ
- end_of_stimulus คือเวลาที่คำสั่งทั้งหมดเสร็จสิ้น
- calib_done คือเวลาที่การสอบเทียบเสร็จสิ้น
Exampเลอแพทเทิร์น
เหล่านี้อดีตampไฟล์อิงจาก MEM_ADDR_ORDER ที่ตั้งค่าเป็น BANK_ROW_COLUMN
รูปแบบการอ่านครั้งเดียว
00_0_2_000F_00A_1 – รูปแบบนี้เป็นการอ่านเพียงครั้งเดียวจากคอลัมน์ที่ 10 แถวที่ 15 และช่องที่สองรูปแบบการเขียนเดียว
00_0_1_0040_010_0 – รูปแบบนี้เป็นการเขียนเพียงครั้งเดียวไปยังคอลัมน์ที่ 32 แถวที่ 128 และธนาคารแรกเขียนและอ่านเดียวไปยังที่อยู่เดียวกัน
00_0_2_000F_00A_0 – รูปแบบนี้เป็นการเขียนเพียงครั้งเดียวไปยังคอลัมน์ที่ 10 แถวที่ 15 และช่องที่สอง
00_0_2_000F_00A_1 – รูปแบบนี้เป็นการอ่านครั้งเดียวจากคอลัมน์ที่ 10 แถวที่ 15 และช่องที่สอง
เขียนและอ่านหลายรายการด้วยที่อยู่เดียวกัน
0A_0_0_0010_000_0 – สิ่งนี้สอดคล้องกับการเขียน 10 ครั้งโดยมีที่อยู่เริ่มต้นจาก 0 ถึง 80 ซึ่งสามารถดูได้ในคอลัมน์
0A_0_0_0010_000_1 – สิ่งนี้สอดคล้องกับ 10 การอ่านที่มีที่อยู่เริ่มต้นจาก 0 ถึง 80 ซึ่งสามารถดูได้ในคอลัมน์
ตัดหน้าระหว่างการเขียน
0A_0_2_000F_3F8_0 – สิ่งนี้สอดคล้องกับการเขียน 10 ครั้งโดยมีที่อยู่คอลัมน์ที่จุดเริ่มต้นของหน้าหลังจากเขียนหนึ่งครั้ง
การจำลองตัวสร้างทราฟฟิกประสิทธิภาพ
ณ จุดนี้คุณทำกับ MIG exampการจำลองการออกแบบ นี่หมายความว่าการตั้งค่าการจำลองของคุณพร้อมแล้ว คุณได้ทำการแก้ไข RTL การจำลองประสิทธิภาพ ลำดับชั้นการจำลองใหม่ถูกต้อง และคุณเข้าใจรูปแบบการกระตุ้นแล้ว เรียกใช้การจำลองอีกครั้งด้วยการเขียนและอ่าน 16 ครั้งใน perfsim_stimulus.txt
ดำเนินการทั้งหมด รอจนกระทั่งสัญญาณ init_calib_complete ถูกยืนยัน และคุณจะสามารถดูจำนวนการเขียนและการอ่านที่เสนอได้ การจำลองจะหยุดลง
เมื่อคุณได้รับพร้อมท์ให้ออกจากการจำลอง ให้เลือก ไม่ และไปที่หน้าต่างบันทึกซึ่งคุณจะสามารถดูสถิติประสิทธิภาพได้
หากคุณเลือก “เลิกจำลอง” สถิติผลงานจะถูกเขียนไปที่ file ชื่อ mig_band_width_output.txt อยู่ใน sim_1/behave โฟลเดอร์
Exampเส้นทางไดเร็กทอรี le:-
/mig_7series_0_example_perf_sim\mig_7series_0_example.sim/sim_1/พฤติกรรม
คุณอาจสงสัยว่าทำไมเปอร์เซ็นต์tagการใช้งานอีบัสอยู่ที่ 29. เรียกใช้การจำลองอีกครั้งด้วยการตั้งค่า IP เดิม แต่เพียงแค่เปลี่ยนสิ่งกระตุ้น file ถึง 256 เขียนและ 256 อ่าน
ff_0_0_0000_000_0
ff_0_0_0000_000_1
ตอนนี้คุณจะเห็นเปอร์เซ็นต์tage เป็น 85 ซึ่งหมายความว่า DDR3 ให้การใช้งานบัสที่ดีกว่าสำหรับลำดับการเขียนและการอ่านที่ยาวนาน
วิธีทั่วไปในการปรับปรุงประสิทธิภาพ
ปัจจัยที่มีอิทธิพลต่อประสิทธิภาพสามารถแบ่งออกเป็นสองส่วน:
- เฉพาะหน่วยความจำ
- คอนโทรลเลอร์เฉพาะ
รูปที่ 9 ให้คุณมากกว่าview ของคำศัพท์ที่เป็นหน่วยความจำเฉพาะ
ซึ่งแตกต่างจาก SRAMs และ Block Memories ประสิทธิภาพของ DDR2 หรือ DDR3 ไม่ได้เป็นเพียงอัตราข้อมูลสูงสุดเท่านั้น
ขึ้นอยู่กับปัจจัยด้านเวลาหลายประการ ได้แก่ :
- tRCD: ความล่าช้าของคำสั่งแถว (หรือความล่าช้าของ ras ถึง cas)
- tCAS(ซีแอล): ความล่าช้าของแฟลชที่อยู่คอลัมน์
- ทีอาร์พี: แถวเติมเงินล่าช้า
- ทส: Row Active Time (เปิดใช้งานเพื่อเปลี่ยนล่วงหน้า)
- ทีอาร์ซี: รอบเวลาของแถว tRC = tRAS + tRP
- แทร็ก: ความล่าช้าในการเข้าถึง Radom tRAC = tRCD + tCAS
- tCWL: เวลาแฝงในการเขียน Cas
- ตั๊กกี้: เวลาสอบเทียบ ZQ
- ทีอาร์เอฟซี: รอบเวลาการรีเฟรชแถว
- ทวิตเตอร์: ความล่าช้าในการเขียนถึงการอ่าน ธุรกรรมการเขียนครั้งล่าสุดไปยังเวลาคำสั่งอ่าน
- ทว.ว.: เขียนเวลาการกู้คืน ธุรกรรมการเขียนครั้งล่าสุดเป็นเวลาเติมเงิน
เวลาของพารามิเตอร์ที่แสดงทั้งหมดขึ้นอยู่กับประเภทของหน่วยความจำที่ใช้และระดับความเร็วของชิ้นส่วนหน่วยความจำ
รายละเอียดเพิ่มเติมเกี่ยวกับคำจำกัดความและข้อมูลจำเพาะด้านเวลาสามารถพบได้ใน DDR2 DDR3 JEDEC หรือในแผ่นข้อมูลอุปกรณ์หน่วยความจำใดๆ
ประสิทธิภาพส่วนใหญ่ขึ้นอยู่กับวิธีการเข้าถึงหน่วยความจำ รูปแบบที่อยู่ที่แตกต่างกันให้ผลลัพธ์ด้านประสิทธิภาพที่แตกต่างกัน
โอเวอร์เฮดไทม์มิ่งหน่วยความจำ
- เวลาเปิดใช้งานและเวลาเติมเงินเมื่อเปลี่ยนเป็นธนาคาร/แถวใหม่หรือเปลี่ยนแถวในธนาคารเดียวกัน- ดังนั้นหากคุณลดการเปลี่ยนแถว สิ่งนี้สามารถลบ tRCD และ tRP
- ส่งคำสั่งเขียนหรืออ่านต่อเนื่อง - รักษาเวลา tCCD
- ลดการเขียนเพื่ออ่านและการอ่านเพื่อเขียนการเปลี่ยนคำสั่ง – เวลาในการกู้คืนการเขียนเพื่อเปลี่ยนเป็นการอ่าน เวลาในการตอบสนองของบัสเพื่อเปลี่ยนจากการอ่านเป็นการเขียน
- กำหนดช่วงเวลารีเฟรชที่เหมาะสม
- DDR3 SDRAM ต้องการรอบการรีเฟรชในช่วงเวลาเฉลี่ยของ tREFI
- สามารถออกคำสั่งรีเฟรชเพิ่มเติมล่วงหน้าได้สูงสุด 8 รายการ (“ดึงเข้า”) สิ่งนี้ไม่ได้ลดจำนวนการรีเฟรช แต่ช่วงเวลาสูงสุดระหว่างสองคำสั่งรีเฟรชที่อยู่รอบๆ ถูกจำกัดไว้ที่ 9 × tREFI
- ใช้ทุกธนาคาร - ควรใช้กลไกการกำหนดแอดเดรสที่เหมาะสม
- แถว-ฝั่ง-เสา: สำหรับธุรกรรมที่เกิดขึ้นบนพื้นที่ที่อยู่ตามลำดับ คอร์จะเปิดแถวเดียวกันโดยอัตโนมัติในแถวถัดไปของอุปกรณ์ DRAM เพื่อทำธุรกรรมต่อเมื่อถึงจุดสิ้นสุดของแถวที่มีอยู่ เหมาะอย่างยิ่งกับแอปพลิเคชันที่ต้องการการระเบิดแพ็กเก็ตข้อมูลขนาดใหญ่ไปยังตำแหน่งที่อยู่ตามลำดับ
- ธนาคาร-แถว-คอลัมน์: เมื่อข้ามขอบเขตของแถว แถวปัจจุบันจะปิดและแถวอื่นจะเปิดขึ้นภายในธนาคารเดียวกัน MSB คือที่อยู่ธนาคาร ซึ่งสามารถใช้เปลี่ยนจากธนาคารต่างๆ เหมาะสำหรับการทำธุรกรรมที่สั้นกว่าและสุ่มมากขึ้นไปยังบล็อกหน่วยความจำหนึ่งช่วงระยะเวลาหนึ่ง จากนั้นข้ามไปยังบล็อกอื่น (ธนาคาร)
- ความยาวของการแตก
- BL 8 รองรับ DDR3 ในซีรีส์ 7 BC4 มีประสิทธิภาพต่ำมากคือน้อยกว่า 50% เนื่องจากเวลาดำเนินการของ BC4 เท่ากับ BL8 ข้อมูลถูกปกปิดไว้ภายในคอมโพเนนต์
- ในกรณีที่คุณไม่ต้องการเขียนแบบต่อเนื่องทั้งหมด สามารถพิจารณามาสก์ข้อมูลหรือเขียนหลังอ่านก็ได้
- ตั้งช่วง ZQ ที่เหมาะสม (DDR3 เท่านั้น)
ตัวควบคุมจะส่งคำสั่งการปรับเทียบทั้ง ZQ Short (ZQCS) และ ZQ Long (ZQCL)- เป็นไปตามมาตรฐาน DDR3 Jedec
- การสอบเทียบ ZQ จะกล่าวถึงในหัวข้อ 5.5 ของมาตรฐาน JEDEC Spec JESD79-3 DDR3 SDRAM
- การสอบเทียบ ZQ ปรับเทียบ On Die Termination (ODT) ในช่วงเวลาปกติเพื่อพิจารณาความผันแปรของ VT
- ลอจิกมีอยู่ใน bank_common.v/vhd
- พารามิเตอร์ Tzqcs กำหนดอัตราที่คำสั่ง ZQ Calibration ถูกส่งไปยังหน่วยความจำ
- t เป็นไปได้ที่จะปิดการใช้งานตัวนับและส่งด้วยตนเองโดยใช้ app_zq_req ซึ่งคล้ายกับการส่งการรีเฟรชด้วยตนเอง
อ้างถึง (คำตอบ Xilinx 47924) สำหรับรายละเอียด
ค่าโสหุ้ยของคอนโทรลเลอร์
- อ่านเป็นระยะ - อ้างถึง (คำตอบ Xilinx 43344) สำหรับรายละเอียดเพิ่มเติม
- อย่าเปลี่ยนช่วงเวลาของการอ่าน
- ข้ามการอ่านเป็นระยะระหว่างการเขียนและออกจำนวนการอ่านที่พลาดก่อนที่จะอ่านจริง
- การจัดลำดับใหม่ - อ้างอิง (คำตอบ Xilinx 34392) สำหรับรายละเอียดเพิ่มเติม
สำหรับการออกแบบส่วนต่อประสานผู้ใช้และ AXI ขอแนะนำให้เปิดใช้งานสิ่งนี้- การจัดลำดับใหม่เป็นตรรกะที่มองไปข้างหน้าหลายคำสั่งและเปลี่ยนลำดับคำสั่งของผู้ใช้เพื่อทำให้คำสั่งที่ไม่ใช่หน่วยความจำไม่ใช้แบนด์วิธที่ถูกต้อง ประสิทธิภาพยังเกี่ยวข้องกับรูปแบบการจราจรจริง
- ตามรูปแบบที่อยู่ การจัดลำดับใหม่จะช่วยข้ามการชาร์จล่วงหน้าและเปิดใช้งานคำสั่ง และทำให้ tRCD และ tRP ไม่ใช้ความกว้างของแถบข้อมูล
- พยายามเพิ่มจำนวนเครื่องธนาคาร
- ลอจิกของคอนโทรลเลอร์ส่วนใหญ่อยู่ในเครื่องธนาคารและสอดคล้องกับธนาคาร DRAM
- เครื่องธนาคารที่กำหนดจะจัดการธนาคาร DRAM เดียวในเวลาใดก็ตาม
- การกำหนดเครื่องธนาคารเป็นแบบไดนามิก จึงไม่จำเป็นต้องมีเครื่องธนาคารสำหรับธนาคารจริงแต่ละแห่ง
- สามารถกำหนดค่าเครื่องธนาคารได้ แต่เป็นการแลกเปลี่ยนระหว่างพื้นที่และประสิทธิภาพ
- จำนวนเครื่องธนาคารที่อนุญาตมีตั้งแต่ 2-8 เครื่อง
- ตามค่าเริ่มต้น เครื่องธนาคาร 4 เครื่องได้รับการกำหนดค่าผ่านพารามิเตอร์ RTL
- หากต้องการเปลี่ยน Bank Machines ให้พิจารณาพารามิเตอร์ nBANK_MACHS = 8 ที่อยู่ใน memc_ui_top เช่นample สำหรับ 8 เครื่องธนาคาร – nBANK_MACHS = 8
ตอนนี้คุณทราบถึงปัจจัยที่มีอิทธิพลต่อประสิทธิภาพแล้ว
พิจารณาแอปพลิเคชันอัปสตรีมที่ให้ข้อมูล 512 ไบต์ต่อแพ็กเก็ต และคุณต้องบันทึกลงในตำแหน่งหน่วยความจำอื่น เนื่องจาก 512 data bytes เท่ากับ 64 DDR3 data burst ให้เรียกใช้ example ออกแบบด้วยการกระตุ้น file มีการเขียน 512 ครั้ง การอ่าน 512 ครั้ง และการสลับแถวสำหรับการเขียนหรืออ่านทุกๆ 64 ครั้ง:
- 3f_0_0_0000_000_0
- 3f_0_0_0001_000_0
- 3f_0_0_0002_000_0
- 3f_0_0_0003_000_0
- 3f_0_0_0004_000_0
- 3f_0_0_0005_000_0
- 3f_0_0_0006_000_0
- 3f_0_0_0007_000_0
- 3f_0_0_0000_000_1
- 3f_0_0_0001_000_1
- 3f_0_0_0002_000_1
- 3f_0_0_0003_000_1
- 3f_0_0_0004_000_1
- 3f_0_0_0005_000_1
- 3f_0_0_0006_000_1
- 3f_0_0_0007_000_1
ในตอนท้ายของการจำลอง คุณจะเห็นว่าการใช้บัสอยู่ที่ 77 เปอร์เซ็นต์
รูปที่ 11: สถิติประสิทธิภาพสำหรับการเขียน 512 ครั้งและการอ่าน 512 ครั้ง – การสลับแถวสำหรับการเขียนหรือการอ่าน 64 ครั้ง
ตอนนี้คุณสามารถใช้ความรู้ที่ได้เรียนรู้ในส่วนก่อนหน้านี้เพื่อปรับปรุงประสิทธิภาพ กับ view เพื่อใช้ธนาคารทั้งหมดแทนการเปลี่ยนแถว ให้แก้ไขรูปแบบที่อยู่เพื่อเปลี่ยนธนาคารดังภาพด้านล่าง
ซึ่งเทียบเท่ากับการตั้งค่า ROW_BANK_Column ในการตั้งค่าการแมปที่อยู่หน่วยความจำใน MIG GUI
- 3f_0_0_0000_000_0
- 3f_0_1_0000_000_0
- 3f_0_2_0000_000_0
- 3f_0_3_0000_000_0
- 3f_0_4_0000_000_0
- 3f_0_5_0000_000_0
- 3f_0_6_0000_000_0
- 3f_0_7_0000_000_0
- 3f_0_0_0000_000_1
- 3f_0_1_0000_000_1
- 3f_0_2_0000_000_1
- 3f_0_3_0000_000_1
- 3f_0_4_0000_000_1
- 3f_0_5_0000_000_1
- 3f_0_6_0000_000_1
- 3f_0_7_0000_000_1
ในตอนท้ายของการจำลอง คุณจะเห็นว่าการใช้บัส 77 เปอร์เซ็นต์ก่อนหน้านี้ตอนนี้อยู่ที่ 87!
หากคุณยังต้องการประสิทธิภาพที่สูงขึ้น คุณสามารถใช้แพ็กเก็ตขนาดใหญ่ที่ 1024 หรือ 2048 ไบต์ หรือลองรีเฟรชด้วยตนเอง
บันทึก: Xilinx ไม่สนับสนุนการบายพาสคอนโทรลเลอร์รีเฟรช เนื่องจากเราไม่แน่ใจว่าคุณจะสามารถตอบสนองเวลารีเฟรชอัตโนมัติของ Jedec ได้หรือไม่ ซึ่งส่งผลต่อความน่าเชื่อถือของข้อมูล
จากฝั่งคอนโทรลเลอร์ คุณสามารถเปลี่ยน nBAnk_MACH และดูการปรับปรุงประสิทธิภาพได้
อย่างไรก็ตาม อาจส่งผลต่อระยะเวลาการออกแบบของคุณ โปรดดูที่ (คำตอบ Xilinx 36505) สำหรับรายละเอียดเกี่ยวกับ nBAnk_MACH
เปิด core_name_mig_sim.v file และเปลี่ยนพารามิเตอร์ nBANK_MACHS จาก 4 เป็น 8 และเรียกใช้การจำลองอีกครั้ง เพื่อให้ค่าพารามิเตอร์มีผลในฮาร์ดแวร์ คุณต้องอัพเดต core_name_mig.v file.
ฉันใช้รูปแบบเดียวกันกับที่เราได้รับการใช้งานบัส 87% (รูปที่ -12)
เมื่อตั้งค่า nBANK_MACHS เป็น 8 ประสิทธิภาพจะอยู่ที่ 90%
โปรดทราบว่าตัวควบคุม ½ และ ¼ ส่งผลเสียต่อประสิทธิภาพเนื่องจากเวลาแฝง
เช่นampอย่างไรก็ตาม เนื่องจากเราสามารถส่งคำสั่งได้ทุกๆ 4 รอบ CK เท่านั้น จึงมีการเติมเพิ่มเติมในบางครั้งเมื่อปฏิบัติตามข้อกำหนดเวลา DRAM ขั้นต่ำ ซึ่งสามารถลดประสิทธิภาพจากทฤษฎีได้
ลองใช้ตัวควบคุมต่างๆ เพื่อค้นหาตัวควบคุมที่เหมาะกับความต้องการด้านประสิทธิภาพของคุณ
อ้างอิง
- Zynq-7000 AP SoC และ 7 Series FPGAs MIS v2.3 [UG586]
- ศูนย์โซลูชัน Xilinx MIG http://www.xilinx.com/support/answers/34243.html
ประวัติการแก้ไข
13/03/2015 – เปิดตัวครั้งแรก
ดาวน์โหลด PDF: คู่มือการประเมินประสิทธิภาพของ Xilinx DDR2 MIG 7