_Ivan_ 0 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба Всем привет. Впервые собираю большой проект на ПЛИС, который будет использоваться для злых условий применения и поэтому хотелось сделать все нормально. RTL модель что я написал будет использоваться на альтере и на ксайлинксе, но для начала я хочу сделать все нормально на ксайлинксе в силу некоторых причин... Вопросы таковы: 1) Прочитал документ Synthesis and simulation design guide - ug626. Правильно ли я понимаю, что для определения правильности работы моего HDL описания устройства нужно провести 3 теста - функциональное моделирование(что есть правильность поведения моей модели без учета временных характеристик схемы, на которой она сделана - т.е. обыкновенный тестбенч), static timing analysis, но уже после place and route и определения ограничений проекта на частоты, входные и выходные задержки, false_paths и так далее, а также timing analysis, где мне нужно убедиться, что синтезатор мне синтезировал схему, которая подходит мне по времянкам и поведению и ничего не рушит. Т.е. я беру тестбенч из первого теста для всего проекта и завожу его на результат place and route в каком-нибудь isim or modelsim? Открыв вкладку процессов для исходника, я что то не нашел, как сделать этот тест? 2) В моем дизайне есть интерфесы i2c, spi как мастера. Точно знаю что нужно обконстрейнить их выходы и входы на задержки по клоку. Но генерируемый наружу клок он идет не напрямую с pll, а делается регистрами и еще не выходит через специальные пины кристалла для выхода клока. Это нормально или плохо? Нужно ли как-то сказать разводчику, чтобы он считал эти выходные клоки как клоки? 3) Clock domain crossing Мне нужно передать слово из одного клокового домена с более медленным клоком в другое. Написал синхронизатор module dac_synchronizer( input clk_core, input clk_dac, input reset_n_core, input reset_n_dac, input [15:0] data_in, input data_in_valid, output [15:0] data_out, output data_out_valid ); reg [15:0] data_reg0; reg [15:0] data_reg1; reg [15:0] data_reg2; reg data_valid_reg0; reg data_valid_reg1; reg data_valid_reg2; reg fdbk_reg0; reg fdbk_reg1; always@(posedge clk_core) begin if(reset_n_core) begin if(data_in_valid) begin data_reg0 <= data_in; data_valid_reg0 <= 1'b1; end else if(fdbk_reg1) begin data_valid_reg0 <= 1'b0; end end else begin data_valid_reg0 <= 1'b0; end end always@(posedge clk_core) begin if(reset_n_core) begin fdbk_reg0 <= data_valid_reg2; fdbk_reg1 <= fdbk_reg0; end else begin fdbk_reg0 <= 1'b0; fdbk_reg1 <= 1'b0; end end always@(posedge clk_dac) begin data_reg1 <= data_reg0; data_reg2 <= data_reg1; end always@(posedge clk_dac) begin if(reset_n_dac) begin data_valid_reg1 <= data_valid_reg0; data_valid_reg2 <= data_valid_reg1; end else begin data_valid_reg1 <= 1'b0; data_valid_reg2 <= 1'b0; end end assign data_out = data_reg2; assign data_out_valid = data_valid_reg2; endmodule Нормально, или еще что то добавить? Чтобы не было ошибок в static timing analysis я должен использовать define_false_path Там в хелпе написано, что нужно указать грубо говоря точку А и точку Б действия этого ограничения. Причем эти точки могут быть как и клоками, так и регистрами. Что туда указывать тогда? Пока что все. Надеюсь на ваши советы, ибо спросить больше не у кого. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tvcam 0 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба По третьему пункту не понятно: data_reg1 <= data_reg0; один регистр на одной частоте второй на другой, если вы гарантируете что data_in_valid активна внутри clk_dac, т.е. когда активен сигнал data_in_valid не пройдёт изменения такта от clk_dac - тогда да работает. Лучше обе частоты получить из pll или clk_dac получить из clk_core или через фифо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба Всем привет. Спасибо! чтобы убедиться в работоспособности описания достаточно промоделировать описание Вашей RTL схемы (без учета задержек в ПЛИС). По поводу констрейнов у des00 в подписях есть статьи и там очень хорошо описаны задание констрейнов, правда для альтеры, но думаю если поймете, то для ксайлинса сделать будет не сложно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба Всем привет. Впервые собираю большой проект на ПЛИС, Нормально, или еще что то добавить? Пока что все. Надеюсь на ваши советы, ибо спросить больше не у кого. Спасибо! Код написан как-то слишком витиевато... Никогда так не делаю... Так потом будет трудно сопровождать проект... Надо строить описание проще и понятнее... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Ivan_ 0 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба По третьему пункту не понятно: data_reg1 <= data_reg0; один регистр на одной частоте второй на другой, если вы гарантируете что data_in_valid активна внутри clk_dac, т.е. когда активен сигнал data_in_valid не пройдёт изменения такта от clk_dac - тогда да работает. Лучше обе частоты получить из pll или clk_dac получить из clk_core или через фифо. Так обе частоты у меня получаются через pll... Такое я гарантировать не смогу... Я читал книгу 100 power tips for fpga designers и там было вот это: чтобы убедиться в работоспособности описания достаточно промоделировать описание Вашей RTL схемы (без учета задержек в ПЛИС). По поводу констрейнов у des00 в подписях есть статьи и там очень хорошо описаны задание констрейнов, правда для альтеры, но думаю если поймете, то для ксайлинса сделать будет не сложно. Работоспособность части кусков проверена даже в железе. Но ведь может такое быть, что синтезатор насинтезирует так, что все будет очень плохо... Статьи посмотрю! Код написан как-то слишком витиевато... Никогда так не делаю... Так потом будет трудно сопровождать проект... Надо строить описание проще и понятнее... А можно вас попросить выложить какой-нибудь кусочек кода на верилог, дабы сравнить стили. Вообще свой стиль я взял из книги Чу Понга по верилогу. Обычно пишу в одном блоке always все. Как это можно изменить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба Работоспособность части кусков проверена даже в железе. Но ведь может такое быть, что синтезатор насинтезирует так, что все будет очень плохо... Если функциональная модель работает, при этом после разводки все констрейны выдерживаются, то можно утверждать что проект будет рабочим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба Если функциональная модель работает, при этом после разводки все констрейны выдерживаются, то можно утверждать что проект будет рабочим. Очень не сложно написать модель асинхронного FIFO, которая будет корректно моделироваться, проходить STA и при этом в железе работать далеко не всегда корректно ((( Это я к тому, что такие критерии ещё не гарантия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба Очень не сложно написать модель асинхронного FIFO, которая будет корректно моделироваться, проходить STA и при этом в железе работать далеко не всегда корректно ((( Это я к тому, что такие критерии ещё не гарантия. Ну если какая-нибудь злая асинхронщина - то может быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться