diff --git a/designs/adc_dac_synchoronizer/debug.xdc b/designs/adc_dac_synchoronizer/debug.xdc index 600e406..a3cf907 100644 --- a/designs/adc_dac_synchoronizer/debug.xdc +++ b/designs/adc_dac_synchoronizer/debug.xdc @@ -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 {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*dac_out_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*}] # Применяем к самому проводу сигнала 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*]]] \ No newline at end of file diff --git a/designs/adc_dac_synchoronizer/sync_top.sv b/designs/adc_dac_synchoronizer/sync_top.sv index 6de29c5..13588ab 100644 --- a/designs/adc_dac_synchoronizer/sync_top.sv +++ b/designs/adc_dac_synchoronizer/sync_top.sv @@ -42,8 +42,8 @@ module sync_top else if (ADC_DATA_WIDTH < DAC_DATA_WIDTH) begin : g_truncate // ЦАП шире АЦП (например, 14 -> 12): забираем младшие биты assign internal_wire_signal = dac_signal[DAC_DATA_WIDTH-1:DAC_DATA_WIDTH-ADC_DATA_WIDTH]; - (* dont_touch = "true" *) wire dummy; - assign dummy = ^dac_signal; +// (* mark_debug = "true" *) wire dummy; +// assign dummy = ^dac_signal; end else begin : g_match // Разрядности равны diff --git a/designs/adc_dac_synchoronizer/tb_sync_top.sv b/designs/adc_dac_synchoronizer/tb_sync_top.sv index 63999d5..a722e7e 100644 --- a/designs/adc_dac_synchoronizer/tb_sync_top.sv +++ b/designs/adc_dac_synchoronizer/tb_sync_top.sv @@ -94,9 +94,9 @@ module tb_top; task automatic reset_dut_dac( input int rst_duration // сколько тактов держать сброс ); - @(posedge clk_dac); + @(negedge clk_dac); rst_dac <= 1; - repeat(rst_duration) @(posedge clk_dac); + repeat(rst_duration) @(negedge clk_dac); rst_dac <= 0; endtask @@ -104,9 +104,9 @@ module tb_top; task automatic reset_dut_adc( input int rst_duration // сколько тактов держать сброс ); - @(posedge clk_adc); + @(negedge clk_adc); rst_adc <= 1; - repeat(rst_duration) @(posedge clk_adc); + repeat(rst_duration) @(negedge clk_adc); rst_adc <= 0; endtask @@ -114,8 +114,9 @@ module tb_top; task automatic start_dut( input int start_duration // сколько тактов держать импульс ); + @(negedge clk_dac); // to make signal stable dac_start <= 1; - repeat(start_duration) @(posedge clk_dac); + repeat(start_duration) @(negedge clk_dac); dac_start <= 0; endtask @@ -220,15 +221,19 @@ module tb_top; $display("[TB] -run_test_case- Wait until pulse become high"); end 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 влияет на выходные данные сэмплера, то не будем проверять такие случаи. + @(posedge clk_adc); + #1.5; // Ожидание завершения переходных процессов // Будем считать что из-за OTR данные изменились (по условию OTR + MSB), проверка пропускается, т.к. сложно понять точное значение OTR в момент обработки данных от tdata 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); $finish; end - // Фактическое начало импульса. Поступление высокого уровня - pulse_update_val_time = $realtime; - pulse_delay_time_stats.push_back(pulse_update_val_time - pulse_start_time); + if (VERBOSE >= 4) begin $display("[TB] -run_test_case- Wait until pulse become low"); end @@ -524,7 +529,7 @@ module tb_top; r_w = $urandom_range(10, r_p); // Ширина не больше периода r_n = $urandom_range(1, 10); // Количество импульсов 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_otr = $urandom_range(0, 1); // Out Of Range стартовое значение r_otr_rand = $urandom_range(0, 1); // Сделать OTR случайным