Всем привет.
Впервые собираю большой проект на ПЛИС, который будет использоваться для злых условий применения и поэтому хотелось сделать все нормально.
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
Мне нужно передать слово из одного клокового домена с более медленным клоком в другое. Написал синхронизатор
CODE
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
Там в хелпе написано, что нужно указать грубо говоря точку А и точку Б действия этого ограничения. Причем эти точки могут быть как и клоками, так и регистрами. Что туда указывать тогда?
Пока что все. Надеюсь на ваши советы, ибо спросить больше не у кого.
Спасибо!
Причина редактирования: Используйте codebox для оформления больших сегментов кода (с) модератор