Итак, я недавно разработал проект, в котором реализован сгенерированный MCB. Я никогда раньше не отлаживал IP-ядра, поэтому вы должны простить меня, если решение моей проблемы очевидно. Я работал над этой проблемой в течение дня или двух и, похоже, не могу ее решить.
Во-первых, я несколько раз прочитал документацию UG388, UG406, UG416 и провел небольшое исследование без удачи.
Как я понимаю параметры, MCB настраивается в конфигурации-1, что я получаю:
localparam C3_PORT_ENABLE = 6'b111111;
localparam C3_PORT_CONFIG = "B32_B32_R32_R32_R32_R32";
localparam C3_P0_PORT_MODE = "BI_MODE";
localparam C3_P1_PORT_MODE = "BI_MODE";
localparam C3_P2_PORT_MODE = "RD_MODE";
localparam C3_P3_PORT_MODE = "RD_MODE";
localparam C3_P4_PORT_MODE = "RD_MODE";
localparam C3_P5_PORT_MODE = "RD_MODE";
И настроен для взаимодействия с памятью DDR2. Я не уверен, какая другая информация будет важна для этой проблемы, но я могу опубликовать больше, если вам это нужно.
Вот некоторые дополнительные параметры, которые, я думаю, будут полезны:
localparam C3_NUM_DQ_PINS = 16;
localparam C3_MEM_ADDR_WIDTH = 13;
localparam C3_MEM_BANKADDR_WIDTH = 3;
localparam C3_MEM_ADDR_ORDER = "ROW_BANK_COLUMN";
localparam C3_P0_MASK_SIZE = 4;
localparam C3_P0_DATA_PORT_SIZE = 32;
Кроме того, я должен отметить, что в проекте используется только один порт (p0).
Что касается поведения, сгенерированный MCB поставляется с Example_design, который включает в себя TB, и я побежал, чем к моему успеху без ошибок.
Теперь я пытаюсь настроить свой собственный tb, который выполняет простую запись и чтение.
Я могу записать 32 бита и прочитать то же самое 32 бита, но проблема в том, что блок памяти читает в последовательности 4 - 16 битных значений каждый раз. Это означает, что половина записываемых им данных - «XXXX» и не может понять, как заполнить это пространство значимыми данными. Вот мой вывод (последние несколько строк показывают проблему, первая часть - это просто материал для инициализации, который может быть полезен):
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 438401.0 ps WARNING: 200 us is required before CKE goes active.
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 460801.0 ps INFO: Precharge All
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 486401.0 ps INFO: Load Mode 2
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 486401.0 ps INFO: Load Mode 2 High Temperature Self Refresh rate = 1X (0C-85C)
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 499201.0 ps INFO: Load Mode 3
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 512001.0 ps INFO: Load Mode 1
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 512001.0 ps INFO: Load Mode 1 DLL Enable = Enabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 512001.0 ps INFO: Load Mode 1 Output Drive Strength = Full
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 512001.0 ps INFO: Load Mode 1 ODT Rtt = 50 Ohm
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 512001.0 ps INFO: Load Mode 1 Additive Latency = 0
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 512001.0 ps INFO: Load Mode 1 OCD Program = OCD Exit
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 512001.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 512001.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 512001.0 ps INFO: Load Mode 1 Output Enable = Enabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 524801.0 ps INFO: Load Mode 0
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 524801.0 ps INFO: Load Mode 0 Burst Length = 4
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 524801.0 ps INFO: Load Mode 0 Burst Order = Sequential
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 524801.0 ps INFO: Load Mode 0 CAS Latency = 5
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 524801.0 ps INFO: Load Mode 0 Test Mode = Normal
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 524801.0 ps INFO: Load Mode 0 DLL Reset = Reset DLL
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 524801.0 ps INFO: Load Mode 0 Write Recovery = 5
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 524801.0 ps INFO: Load Mode 0 Power Down Mode = Fast Exit
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 537601.0 ps INFO: Precharge All
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 563201.0 ps INFO: Refresh
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 691201.0 ps INFO: Refresh
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 819201.0 ps INFO: Load Mode 0
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 819201.0 ps INFO: Load Mode 0 Burst Length = 4
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 819201.0 ps INFO: Load Mode 0 Burst Order = Sequential
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 819201.0 ps INFO: Load Mode 0 CAS Latency = 5
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 819201.0 ps INFO: Load Mode 0 Test Mode = Normal
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 819201.0 ps INFO: Load Mode 0 DLL Reset = Normal
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 819201.0 ps INFO: Load Mode 0 Write Recovery = 5
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 819201.0 ps INFO: Load Mode 0 Power Down Mode = Fast Exit
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 832001.0 ps INFO: Load Mode 1
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 832001.0 ps INFO: Load Mode 1 DLL Enable = Enabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 832001.0 ps INFO: Load Mode 1 Output Drive Strength = Full
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 832001.0 ps INFO: Load Mode 1 ODT Rtt = 50 Ohm
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 832001.0 ps INFO: Load Mode 1 Additive Latency = 0
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 832001.0 ps INFO: Load Mode 1 OCD Program = OCD Default
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 832001.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 832001.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 832001.0 ps INFO: Load Mode 1 Output Enable = Enabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 844801.0 ps INFO: Load Mode 1
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 844801.0 ps INFO: Load Mode 1 DLL Enable = Enabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 844801.0 ps INFO: Load Mode 1 Output Drive Strength = Full
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 844801.0 ps INFO: Load Mode 1 ODT Rtt = 50 Ohm
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 844801.0 ps INFO: Load Mode 1 Additive Latency = 0
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 844801.0 ps INFO: Load Mode 1 OCD Program = OCD Exit
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 844801.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 844801.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 844801.0 ps INFO: Load Mode 1 Output Enable = Enabled
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 844801.0 ps INFO: Initialization Sequence is complete
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 864001.0 ps INFO: Precharge All
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 1382401.0 ps INFO: Activate bank 0 row 0000
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .cmd_task: at time 1395201.0 ps INFO: Write bank 0 col 080, auto precharge 0
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .main: at time 1401601.0 ps INFO: Sync On Die Termination = 1
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .data_task: at time 1409601.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000080 data = 5678
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .data_task: at time 1411201.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000081 data = 1234
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .data_task: at time 1412801.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000082 data = xxxx
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .data_task: at time 1414401.0 ps INFO: WRITE @ DQS= bank = 0 row = 0000 col = 00000083 data = xxxx
ReadWrite_MIG_tb.\MEM_INST3.u_mem_c3 .main: at time 1422401.0 ps INFO: Sync On Die Termination = 0
В то время, когда p0_cmd помещается в FIFO cmd, p0_wr_count равен 3 (я заполнил его несколькими дополнительными в случае, если это было проблемой). Тэг example_design также выполняет 4 последовательных записи, но они не "XXXX".
Я сравнивал свою форму волны с tb и с UG388, и мне действительно кажется, что я ее правильно копирую, но не уверен, что вызывает такое поведение. Как я могу заполнить «XXXX» данными или остановить его от записи дополнительных значений?
Любая помощь будет принята с благодарностью!