fix: post-implementation timing sim TB passed
This commit is contained in:
@ -6,7 +6,7 @@ set_clock_groups -asynchronous -group [get_clocks geneartor_clk] -group [get_clo
|
|||||||
# set_false_path -through [get_nets -hierarchical {*dac_signal* *internal_wire_singnal* *adc_singnal*}]
|
# set_false_path -through [get_nets -hierarchical {*dac_signal* *internal_wire_singnal* *adc_singnal*}]
|
||||||
# set_false_path -through [get_nets {dac_done dac_done_stretched dac_request adc_done adc_request}]
|
# set_false_path -through [get_nets {dac_done dac_done_stretched dac_request adc_done adc_request}]
|
||||||
|
|
||||||
# set_property DONT_TOUCH true [get_cells -hierarchical -filter {NAME =~ *generator_inst*pulse_height_reg*}]
|
set_property DONT_TOUCH true [get_cells -hierarchical -filter {NAME =~ *generator_inst*pulse_height_reg*}]
|
||||||
# set_property DONT_TOUCH true [get_cells -hierarchical -filter {NAME =~ *generator_inst*dac_out_reg*}]
|
set_property DONT_TOUCH true [get_cells -hierarchical -filter {NAME =~ *generator_inst*dac_out_reg*}]
|
||||||
# Применяем к самому проводу сигнала CE, чтобы Vivado не дробила его
|
# Применяем к самому проводу сигнала CE, чтобы Vivado не дробила его
|
||||||
# set_property DONT_TOUCH true [get_nets -of_objects [get_pins -hierarchical -filter {PIN_NAME =~ *CE} -of_objects [get_cells *pulse_height_reg*]]]
|
# set_property DONT_TOUCH true [get_nets -of_objects [get_pins -hierarchical -filter {PIN_NAME =~ *CE} -of_objects [get_cells *pulse_height_reg*]]]
|
||||||
@ -42,8 +42,8 @@ module sync_top
|
|||||||
else if (ADC_DATA_WIDTH < DAC_DATA_WIDTH) begin : g_truncate
|
else if (ADC_DATA_WIDTH < DAC_DATA_WIDTH) begin : g_truncate
|
||||||
// ЦАП шире АЦП (например, 14 -> 12): забираем младшие биты
|
// ЦАП шире АЦП (например, 14 -> 12): забираем младшие биты
|
||||||
assign internal_wire_signal = dac_signal[DAC_DATA_WIDTH-1:DAC_DATA_WIDTH-ADC_DATA_WIDTH];
|
assign internal_wire_signal = dac_signal[DAC_DATA_WIDTH-1:DAC_DATA_WIDTH-ADC_DATA_WIDTH];
|
||||||
(* dont_touch = "true" *) wire dummy;
|
// (* mark_debug = "true" *) wire dummy;
|
||||||
assign dummy = ^dac_signal;
|
// assign dummy = ^dac_signal;
|
||||||
end
|
end
|
||||||
else begin : g_match
|
else begin : g_match
|
||||||
// Разрядности равны
|
// Разрядности равны
|
||||||
|
|||||||
@ -94,9 +94,9 @@ module tb_top;
|
|||||||
task automatic reset_dut_dac(
|
task automatic reset_dut_dac(
|
||||||
input int rst_duration // сколько тактов держать сброс
|
input int rst_duration // сколько тактов держать сброс
|
||||||
);
|
);
|
||||||
@(posedge clk_dac);
|
@(negedge clk_dac);
|
||||||
rst_dac <= 1;
|
rst_dac <= 1;
|
||||||
repeat(rst_duration) @(posedge clk_dac);
|
repeat(rst_duration) @(negedge clk_dac);
|
||||||
rst_dac <= 0;
|
rst_dac <= 0;
|
||||||
endtask
|
endtask
|
||||||
|
|
||||||
@ -104,9 +104,9 @@ module tb_top;
|
|||||||
task automatic reset_dut_adc(
|
task automatic reset_dut_adc(
|
||||||
input int rst_duration // сколько тактов держать сброс
|
input int rst_duration // сколько тактов держать сброс
|
||||||
);
|
);
|
||||||
@(posedge clk_adc);
|
@(negedge clk_adc);
|
||||||
rst_adc <= 1;
|
rst_adc <= 1;
|
||||||
repeat(rst_duration) @(posedge clk_adc);
|
repeat(rst_duration) @(negedge clk_adc);
|
||||||
rst_adc <= 0;
|
rst_adc <= 0;
|
||||||
endtask
|
endtask
|
||||||
|
|
||||||
@ -114,8 +114,9 @@ module tb_top;
|
|||||||
task automatic start_dut(
|
task automatic start_dut(
|
||||||
input int start_duration // сколько тактов держать импульс
|
input int start_duration // сколько тактов держать импульс
|
||||||
);
|
);
|
||||||
|
@(negedge clk_dac); // to make signal stable
|
||||||
dac_start <= 1;
|
dac_start <= 1;
|
||||||
repeat(start_duration) @(posedge clk_dac);
|
repeat(start_duration) @(negedge clk_dac);
|
||||||
dac_start <= 0;
|
dac_start <= 0;
|
||||||
endtask
|
endtask
|
||||||
|
|
||||||
@ -220,15 +221,19 @@ module tb_top;
|
|||||||
$display("[TB] -run_test_case- Wait until pulse become high");
|
$display("[TB] -run_test_case- Wait until pulse become high");
|
||||||
end
|
end
|
||||||
wait(m_axis_tdata != ZERO_LEVEL);
|
wait(m_axis_tdata != ZERO_LEVEL);
|
||||||
|
// Фактическое начало импульса. Поступление высокого уровня
|
||||||
|
pulse_update_val_time = $realtime;
|
||||||
|
pulse_delay_time_stats.push_back(pulse_update_val_time - pulse_start_time);
|
||||||
|
|
||||||
// Проверим что высота импульса совпала с заданной. Т.к. OTR != 0 влияет на выходные данные сэмплера, то не будем проверять такие случаи.
|
// Проверим что высота импульса совпала с заданной. Т.к. OTR != 0 влияет на выходные данные сэмплера, то не будем проверять такие случаи.
|
||||||
|
@(posedge clk_adc);
|
||||||
|
#1.5; // Ожидание завершения переходных процессов
|
||||||
// Будем считать что из-за OTR данные изменились (по условию OTR + MSB), проверка пропускается, т.к. сложно понять точное значение OTR в момент обработки данных от tdata
|
// Будем считать что из-за OTR данные изменились (по условию OTR + MSB), проверка пропускается, т.к. сложно понять точное значение OTR в момент обработки данных от tdata
|
||||||
if (m_axis_tdata != (pulse_height >> 2) && (randomize_out_of_range || out_of_range_val)) begin
|
if (m_axis_tdata != (pulse_height >> 2) && (randomize_out_of_range || out_of_range_val)) begin
|
||||||
$display("[ERROR] -run_test_case- Wrong pulse height: %d. Must be: %d", m_axis_tdata, pulse_height >> 2);
|
$display("[ERROR] -run_test_case- Wrong pulse height: %d. Must be: %d", m_axis_tdata, pulse_height >> 2);
|
||||||
$finish;
|
$finish;
|
||||||
end
|
end
|
||||||
// Фактическое начало импульса. Поступление высокого уровня
|
|
||||||
pulse_update_val_time = $realtime;
|
|
||||||
pulse_delay_time_stats.push_back(pulse_update_val_time - pulse_start_time);
|
|
||||||
if (VERBOSE >= 4) begin
|
if (VERBOSE >= 4) begin
|
||||||
$display("[TB] -run_test_case- Wait until pulse become low");
|
$display("[TB] -run_test_case- Wait until pulse become low");
|
||||||
end
|
end
|
||||||
@ -524,7 +529,7 @@ module tb_top;
|
|||||||
r_w = $urandom_range(10, r_p); // Ширина не больше периода
|
r_w = $urandom_range(10, r_p); // Ширина не больше периода
|
||||||
r_n = $urandom_range(1, 10); // Количество импульсов
|
r_n = $urandom_range(1, 10); // Количество импульсов
|
||||||
r_h = $urandom_range(0, 2**(`MIN(ADC_DATA_WIDTH, DAC_DATA_WIDTH))-1); // Высота импульса
|
r_h = $urandom_range(0, 2**(`MIN(ADC_DATA_WIDTH, DAC_DATA_WIDTH))-1); // Высота импульса
|
||||||
r_sn = $urandom_range(1, 40); // Число сэмплов
|
r_sn = $urandom_range(2, 40); // Число сэмплов
|
||||||
r_skip = $urandom_range(0, 1); // Случайный сброс (0 - сброс, 1 - пропуск)
|
r_skip = $urandom_range(0, 1); // Случайный сброс (0 - сброс, 1 - пропуск)
|
||||||
r_otr = $urandom_range(0, 1); // Out Of Range стартовое значение
|
r_otr = $urandom_range(0, 1); // Out Of Range стартовое значение
|
||||||
r_otr_rand = $urandom_range(0, 1); // Сделать OTR случайным
|
r_otr_rand = $urandom_range(0, 1); // Сделать OTR случайным
|
||||||
|
|||||||
Reference in New Issue
Block a user