Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Временной анализ корки DDR3
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
ovs_pavel
Вечер добрый. Коллеги, не подскажите как выполнить временной анализ DDR3 корки для ПЛИС XC7K325T-2FFG900C.
Расскажу что делаю по этапам.

1. Сгенерил корку DDR3, в качестве пользовательского интерфейса взял User Interface (UI). Корку включил в тестовый проект (необходимо разобраться с пользовательскими сигналами, ну и заодно посмотреть, как работает память).
2. Подключил сгенерированный коркой .ucf-файл к проекту. Все скомпилил, вроде ошибок нет.
3. Сделал test bench, в котором сформировал сигнал сброса и дифференциальный тактовый сигнал 200 МГц.
4. Ну и все это запустил на временной анализ, но... тишина, калибровка памяти не начинается.

Пробовал (из UG586) запустить временной анализ корки из папки "example_design". Там все красиво получается, сразу после сброса начинается калибровка памяти и т.д. Но во первых они выполняют поведенческий анализ корки (behavirial), ну и во вторых не все у них там прозрачно.

Я не могу понять почему у меня не запускается процесс калибровки памяти, ведь достаточно наличия двух сигналов - тактовой и сброса.
dmitry-tomsk
Цитата(ovs_pavel @ May 22 2013, 21:13) *
Вечер добрый. Коллеги, не подскажите как выполнить временной анализ DDR3 корки для ПЛИС XC7K325T-2FFG900C.
Расскажу что делаю по этапам.

1. Сгенерил корку DDR3, в качестве пользовательского интерфейса взял User Interface (UI). Корку включил в тестовый проект (необходимо разобраться с пользовательскими сигналами, ну и заодно посмотреть, как работает память).
2. Подключил сгенерированный коркой .ucf-файл к проекту. Все скомпилил, вроде ошибок нет.
3. Сделал test bench, в котором сформировал сигнал сброса и дифференциальный тактовый сигнал 200 МГц.
4. Ну и все это запустил на временной анализ, но... тишина, калибровка памяти не начинается.

Пробовал (из UG586) запустить временной анализ корки из папки "example_design". Там все красиво получается, сразу после сброса начинается калибровка памяти и т.д. Но во первых они выполняют поведенческий анализ корки (behavirial), ну и во вторых не все у них там прозрачно.

Я не могу понять почему у меня не запускается процесс калибровки памяти, ведь достаточно наличия двух сигналов - тактовой и сброса.

А чем моделируете и из под чего? Возможно, модель памяти подключена с ошибками.
ovs_pavel
Цитата(dmitry-tomsk @ May 23 2013, 07:50) *
А чем моделируете и из под чего? Возможно, модель памяти подключена с ошибками.


Поставил лицензионный ISE14.2 (шел в довесок к отладочной плате для Kintex7). Моделирую из под ISIM (вроде как с 12.3 сижу на ISIMe и потребности в ModelSime или QuestaSime не возникало). Вообщем ISIM устраивал. Из под него и моделирую.
ovs_pavel
А как Вы думаете, может ли причина быть в следующем:

У памяти, после того как прошел сигнал сброса, необходимо выждать интервал времени для стабилизации питания (и для DDR3 я смотрю это 500 мксек). Возможно просто идет выжидание этого интервала, т.е. есть какой то счетчик в контроллере DDR3, который отмеряет этот интервал. По крайней мере в своих собственных контроллерах DDR, я этот счетчик ставлю.

Цитата(dmitry-tomsk @ May 23 2013, 07:50) *
А чем моделируете и из под чего? Возможно, модель памяти подключена с ошибками.


А можно поподробнее насчет модели памяти. Нашел такую вот переписку (на англ. сайте):

Quest: I create a DDR3 controller for Virtex 7 through MIG. I want to do simulation in Modelsim. I just have a genral question is:
when we simulation DDR3 controller core in Modelsim, do we need a behavior model in testbench to simulate the DDR3 phy? Or we can don't care about the connections of DDR3 controller to DDR3 phy, simulate the DDR3 controller alone?

Repl: Yes you need a DDR3 model which can be obtained from you memory vendor's website. Or if you are using Micron, MIG can generate it for you with signing the license agreement.

Т.е. получается без подключения верилоговской модели памяти ничего не запуститься? Я на времянке смотрю как раз пины, которые должны подключаться к памяти. На них же хоть какое то "шевеление" должно быть?

Цитата(dmitry-tomsk @ May 23 2013, 07:50) *
А чем моделируете и из под чего? Возможно, модель памяти подключена с ошибками.


А можно поподробнее насчет модели памяти. Нашел такую вот переписку (на англ. сайте):

Quest: I create a DDR3 controller for Virtex 7 through MIG. I want to do simulation in Modelsim. I just have a genral question is:
when we simulation DDR3 controller core in Modelsim, do we need a behavior model in testbench to simulate the DDR3 phy? Or we can don't care about the connections of DDR3 controller to DDR3 phy, simulate the DDR3 controller alone?

Repl: Yes you need a DDR3 model which can be obtained from you memory vendor's website. Or if you are using Micron, MIG can generate it for you with signing the license agreement.

Т.е. получается без подключения верилоговской модели памяти ничего не запуститься? Я на времянке смотрю как раз пины, которые должны подключаться к памяти. На них же хоть какое то "шевеление" должно быть?
ovs_pavel
Цитата(dmitry-tomsk @ May 23 2013, 07:50) *
А чем моделируете и из под чего? Возможно, модель памяти подключена с ошибками.


А можно поподробнее насчет модели памяти. Нашел такую вот переписку (на англ. сайте):

Quest: I create a DDR3 controller for Virtex 7 through MIG. I want to do simulation in Modelsim. I just have a genral question is:
when we simulation DDR3 controller core in Modelsim, do we need a behavior model in testbench to simulate the DDR3 phy? Or we can don't care about the connections of DDR3 controller to DDR3 phy, simulate the DDR3 controller alone?

Repl: Yes you need a DDR3 model which can be obtained from you memory vendor's website. Or if you are using Micron, MIG can generate it for you with signing the license agreement.

Т.е. получается без подключения верилоговской модели памяти ничего не запуститься? Я на времянке смотрю как раз пины, которые должны подключаться к памяти. На них же хоть какое то "шевеление" должно быть?
dmitry-tomsk
Цитата(ovs_pavel @ May 23 2013, 11:50) *
А можно поподробнее насчет модели памяти. Нашел такую вот переписку (на англ. сайте):

Quest: I create a DDR3 controller for Virtex 7 through MIG. I want to do simulation in Modelsim. I just have a genral question is:
when we simulation DDR3 controller core in Modelsim, do we need a behavior model in testbench to simulate the DDR3 phy? Or we can don't care about the connections of DDR3 controller to DDR3 phy, simulate the DDR3 controller alone?

Repl: Yes you need a DDR3 model which can be obtained from you memory vendor's website. Or if you are using Micron, MIG can generate it for you with signing the license agreement.

Т.е. получается без подключения верилоговской модели памяти ничего не запуститься? Я на времянке смотрю как раз пины, которые должны подключаться к памяти. На них же хоть какое то "шевеление" должно быть?

Не запустится. Кроме того, будьте внимательны, не всегда эта модель подключается корректно, в planahead+modelsim у меня работала без проблем, а в ise+modelsim упорно не видел заголовочный файл, запускалось моделирование с параметрами по умолчанию и сигнала калибровки не было. Смотрите также параметр SIMULATION в модели MIG, без него долго придётся ждать окончания калибровки.
ovs_pavel
Цитата(dmitry-tomsk @ May 23 2013, 14:27) *
Не запустится. Кроме того, будьте внимательны, не всегда эта модель подключается корректно, в planahead+modelsim у меня работала без проблем, а в ise+modelsim упорно не видел заголовочный файл, запускалось моделирование с параметрами по умолчанию и сигнала калибровки не было. Смотрите также параметр SIMULATION в модели MIG, без него долго придётся ждать окончания калибровки.




Сейчас как раз "копаю" исходник корки. Дошел до следующих параметров.
parameter SIM_INIT_OPTION = "SKIP_PU_DLY", // "NONE", "SKIP_PU_DLY", "SKIP_INIT"
parameter SIM_CAL_OPTION = "NONE", // "NONE", "FAST_CAL", "SKIP_CAL"

С ними попробую "поиграться".

Конечно вопрос почему не запуститься остается. Т.к. должна запуститься по определению (хотя бы один раз должны быть выданы сигналы CAS, RAS и т.д. для начала калибровки). Или в модели памяти прописаны некие начальные состояния входов DQ и DQS при которых вообще корка не начинает работать?
ovs_pavel
А не подскажите как в тестовый файл (TestBench) включить модель интерфейса DDR3 (саму модель я нашел - ddr3_model.v). Или кинуть ссылку на доку, где это описано.

Обычно, при создании проекта, просто включаешь в топ-проект описание оболочки подпроекта (соответственно создав заранее файл), ну по типу

sub_prg u_sub_prg (
.a (a_port),
.b (b_port),
.c (c_port)
);

А здесь не совсем понятно. С одной стороны, я должен к пинам подключить пины модели, а с другой я должен одновременно и "видеть" эти пины при моделировании. Вообщем пока не понятно.
TRILLER
Не понимаю, в чём затруднение, если честно. При создании корки MIG появится папка example_design. Там в папке sim есть пример тестбенча. Делаете так, как сделано там и дело с концом..
ovs_pavel
Цитата(TRILLER @ May 24 2013, 12:48) *
Не понимаю, в чём затруднение, если честно. При создании корки MIG появится папка example_design. Там в папке sim есть пример тестбенча. Делаете так, как сделано там и дело с концом..


Я что то до конца не понимаю. Не пинайте, объясните что делаю не так (все время делал как опишу ниже; может уже пора переходить к временному анализу как то по другому, но пока не пойму как).

Вот мой тестбенч, созданных как New Source Type -> Verilog Test Ficture:


//-------------------------------------------------------------------------------------
`timescale 1ps/100fs

parameter CLKIN_PERIOD = 5000;

module test;

// Inputs
reg sys_clk_p;
reg sys_clk_n;
reg [27:0] app_addr;
reg [2:0] app_cmd;
reg app_en;
reg [63:0] app_wdf_data;
reg app_wdf_end;
reg [7:0] app_wdf_mask;
reg app_wdf_wren;
reg [2:0] mux_app_rd_data;
reg app_sr_req;
reg app_ref_req;
reg app_zq_req;
reg sys_rst;

// Outputs
wire [13:0] ddr3_addr;
wire [2:0] ddr3_ba;
wire ddr3_ras_n;
wire ddr3_cas_n;
wire ddr3_we_n;
wire ddr3_reset_n;
wire ddr3_ck_p;
wire ddr3_ck_n;
wire ddr3_cke;
wire ddr3_cs_n;
wire [7:0] ddr3_dm;
wire ddr3_odt;
wire [63:0] app_rd_data;
wire app_rd_data_end;
wire app_rd_data_valid;
wire app_rdy;
wire app_wdf_rdy;
wire app_sr_active;
wire app_ref_ack;
wire app_zq_ack;
wire ui_clk;
wire ui_clk_sync_rst;
wire init_calib_complete;

wire test_pll_clk3;

// Bidirs
wire [63:0] ddr3_dq;
wire [7:0] ddr3_dqs_n;
wire [7:0] ddr3_dqs_p;

reg [63:0] rg_ddr3_dq; // Организация двунаправленности.
reg [7:0] rg_ddr3_dqs_n;
reg [7:0] rg_ddr3_dqs_p;

// Instantiate the Unit Under Test (UUT)
ddr3_test uut (
.ddr3_dq(ddr3_dq),
.ddr3_dqs_n(ddr3_dqs_n),
.ddr3_dqs_p(ddr3_dqs_p),
.ddr3_addr(ddr3_addr),
.ddr3_ba(ddr3_ba),
.ddr3_ras_n(ddr3_ras_n),
.ddr3_cas_n(ddr3_cas_n),
.ddr3_we_n(ddr3_we_n),
.ddr3_reset_n(ddr3_reset_n),
.ddr3_ck_p(ddr3_ck_p),
.ddr3_ck_n(ddr3_ck_n),
.ddr3_cke(ddr3_cke),
.ddr3_cs_n(ddr3_cs_n),
.ddr3_dm(ddr3_dm),
.ddr3_odt(ddr3_odt),
.sys_clk_p(sys_clk_p),
.sys_clk_n(sys_clk_n),
.app_addr(app_addr),
.app_cmd(app_cmd),
.app_en(app_en),
.app_wdf_data(app_wdf_data),
.app_wdf_end(app_wdf_end),
.app_wdf_mask(app_wdf_mask),
.app_wdf_wren(app_wdf_wren),
.mux_app_rd_data(mux_app_rd_data),
.app_rd_data(app_rd_data),
.app_rd_data_end(app_rd_data_end),
.app_rd_data_valid(app_rd_data_valid),
.app_rdy(app_rdy),
.app_wdf_rdy(app_wdf_rdy),
.app_sr_req(app_sr_req),
.app_sr_active(app_sr_active),
.app_ref_req(app_ref_req),
.app_ref_ack(app_ref_ack),
.app_zq_req(app_zq_req),
.app_zq_ack(app_zq_ack),
.ui_clk(ui_clk),
.ui_clk_sync_rst(ui_clk_sync_rst),
.init_calib_complete(init_calib_complete),
.sys_rst(sys_rst),

.test_pll_clk3 (test_pll_clk3)
);


initial
begin
sys_rst = 1'b0;

#200000
sys_rst = 1'b1;
end


initial
begin
sys_clk_p <= 1'b0;
sys_clk_n <= 1'b1;
end

always
begin
#(CLKIN_PERIOD/2.0)
sys_clk_p = ~sys_clk_p;
sys_clk_n = ~sys_clk_n;
end


initial
begin
rg_ddr3_dq = 64'hZZZZZZZZZZZZZZZZ;
rg_ddr3_dqs_n = 8'hZZ;
rg_ddr3_dqs_p = 8'hZZ;

app_addr = 0;
app_cmd = 0;
app_en = 0;
app_wdf_data = 0;
app_wdf_end = 0;
app_wdf_mask = 0;
app_wdf_wren = 0;
mux_app_rd_data = 0;
app_sr_req = 0;
app_ref_req = 0;
app_zq_req = 0;
end

assign ddr3_dq = rg_ddr3_dq;
assign ddr3_dqs_n = rg_ddr3_dqs_n;
assign ddr3_dqs_p = rg_ddr3_dqs_p;


endmodule
//-------------------------------------------------------------------------------------

Для начала я подал тактовую и сигнал сброса, и в корке DDR3 изменил параметр:

SIM_INIT_OPTION = "SKIP_PU_DLY", // "NONE", "SKIP_PU_DLY", "SKIP_INIT"

чтобы пропустить время ожидания установки питания. И вроде после сигнала сброса должна начаться инициализация памяти.

У меня же после сброса меняется сигнал ui_clk_sync_rst (из 1 в 0) и сигнал app_wdf_rdy (из 0 в 1), т.е. ФИФО приема данных для записи в SDRAM готово принять данные.

И все. Тишина.

В файле который сгенерился автоматически (в папке example design - sim_tb_top.v) нет ни одного из сигналов пользовательского интерфейса (app_*_*). И пока я его описание не понимаю (видимо опыта не хватает). Поэтому и спрашиваю у знающих как делать.








Кажется потихоньку начал "въезжать". Видимо тестовый тестбенч не формирует пользовательские сигналы и их вообще не прописывает, т.к. не использует. Т.е. мне надо их добавить в файле sim_tb_top.v, после описания сигналов SDRAM памяти. И после всего этого:

//------------------------------------
initial
begin : Logging
fork
begin : calibration_done
wait (init_calib_complete);
$display("Calibration Done");
#50000000;
if (!tg_compare_error) begin
$display("TEST PASSED");
end
else begin
$display("TEST FAILED: DATA ERROR");
end
disable calib_not_done;
$finish;
end

begin : calib_not_done
if (SIM_BYPASS_INIT_CAL == "SIM_INIT_CAL_FULL")
#2500000000;
else
#1000000000;
if (!init_calib_complete) begin
$display("TEST FAILED: INITIALIZATION DID NOT COMPLETE");
end
disable calibration_done;
$finish;
end
join
end
//-----------------------------------------------------

описывать свои воздействия.
ovs_pavel
Коллеги, а как в testbench добавлять более одного верилоговского файла? Я сделал тестовый файл по аналогии с "sim_tb_top.v" (из папки example design/sim), т.е. добавил в testbench модель DDR памяти (ddr3_model.v) и модули для организации двунаправленных буферов (WireDelay.v). После попытки запуска на временной анализ, выдает такие ошибки:

ERROR:HDLCompiler:86 - "ddr3_model.v" Line 84: nested module not allowed in this dialect. Use system verilog mode
ERROR:HDLCompiler:86 - "WireDelay.v" Line 91: nested module not allowed in this dialect. Use system verilog mode

Т.е. ISIM не подхватил эти файлы.
ovs_pavel
Файлы добавить удалось. Необходимо было указать что они используются только для временного анализа. Но при попытке запустить ModelSim выдает следующие ошибки:

* udo file already exist (test.udo). It will not be re-generated.
* creating main do file (test.fdo) for Behavioral Simulation...
> executing 'C:/modeltech64_10.1c/win64/vsim.exe -version' to get the mti_se version...
> mti_se version is 10.1c
* determining pre-compiled simulation library path information...
> using mapping file set by MODELSIM env (c:\modeltech64_10.1c\modelsim.ini)...
> extracting library mapping information from 'c:\modeltech64_10.1c\modelsim.ini'...
> Compilation info: secureip
********************************************************
+ Source Library : C:/Xilinx14.2/14.2/ISE_DS/ISE/secureip/mti
+ Compilation Time : Mon May 27 10:56:07 2013
+ Platform : nt
ERROR: Platform mismatch!
The simulation libraries were compiled for the 'nt' platform but the current
platform is 'nt64'. Please recompile the libraries for the current platform.
+ Simulator : mti_se
+ Simulator Version : 10.1c
+ Xilinx Version : 14.2
+ Number of Errors : 0
+ Number of Warnings: 0
********************************************************

Хотя библиотеки для ModelSim я компилил как для 64-х разрядной платформы. Вообщем пока непонятно ((.
ovs_pavel
С этим тоже разобрались. При компиляции библиотек для ModelSim'a ошибся в пути к файлу compxlib.exe (указал путь - nt).

%XILINX%\bin\nt64\compxlib -s mti_se -arch fpga -lib u -lib c -lib s -lib m -l all -dir C:\modeltech64_10.1c\Xilinx\ -p C:\modeltech64_10.1c\win64\ -log compxlib.log -w
svedach
Немного не по теме. Пытаюсь запустить контроллер ddr3 с user interface. Но насколько разобрался с помощью chipscope ранее записанные данные читаются неправильно. Похоже на проблему с адресацией, наблюдается как бы наложение порций данных. Адрес инкрементирую на 8, как в тестовом примере. Смущает то, что ширина шины данных 512 бит, т.е. 64 байта. Пробовал инкрементировать на 64, такая же ерунда. Калибровка памяти проходит нормально.
Заранее спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.