From ccd9964ada8d7278668df677dff7aa8b2f94de9d Mon Sep 17 00:00:00 2001 From: Zer0Nu11 Date: Tue, 9 Jun 2026 15:28:24 +0300 Subject: [PATCH] fix generator sync and complete randomized TB --- rtl/generator/src/generator.sv | 5 ++- rtl/generator/tests/generator_tb.sv | 63 ++++++++++++++++++++--------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/rtl/generator/src/generator.sv b/rtl/generator/src/generator.sv index 52051a2..dfbf5c3 100644 --- a/rtl/generator/src/generator.sv +++ b/rtl/generator/src/generator.sv @@ -55,11 +55,12 @@ module generator if (cnt_pulse_num != pulse_num_reg) begin // wait for synchronization with sampler if (!synced) begin - done <= 1; - if (request) begin + if (request & done) begin synced <= 1; done <= 0; end + else + done <= 1; end else begin if (cnt_pulse_period != pulse_period_reg) begin diff --git a/rtl/generator/tests/generator_tb.sv b/rtl/generator/tests/generator_tb.sv index c2eaf85..d70ceec 100644 --- a/rtl/generator/tests/generator_tb.sv +++ b/rtl/generator/tests/generator_tb.sv @@ -43,7 +43,7 @@ module generator_tb; .done(generator_done), .request(sampler_done) ); - initial $display("[TB] Скомпилирован генератор ZERO_LEVEL: TRUE"); + initial $display("[TB] Generator compiled. ZERO_LEVEL: TRUE"); end else if (ZERO_LEVEL == "logic") begin : gen_dut_logic generator #( @@ -62,12 +62,12 @@ module generator_tb; .done(generator_done), .request(sampler_done) ); - initial $display("[TB] Скомпилирован генератор ZERO_LEVEL: LOGIC"); + initial $display("[TB] Generator compiled. ZERO_LEVEL: LOGIC"); end else begin : gen_dut_error // защита от дурака initial begin - $display("[ERROR] Неизвестное значение ZERO_LEVEL: %s", ZERO_LEVEL); + $display("[ERROR] Unknown value ZERO_LEVEL: %s", ZERO_LEVEL); $finish; end end @@ -144,39 +144,55 @@ module generator_tb; int rand_delay; int rand_ack; bit rand_first; + int total_impulse_cycles = 0; - $display("[TB] -check_impulses- Проверка устойчивости к долгим управляющим импульсам"); + int pulse_w = 11; + int pulse_p = 31; + int pulse_n = 5; + int pulse_h = 1024; - // 1. Установка базовой конфигурации + $display("[TB] -check_impulses- Check system stability under random latencies"); + + // Установка конфигурации set_config( - .w(3), - .p(10), - .n(4), - .h(1024) + .w(pulse_w), + .p(pulse_p), + .n(pulse_n), + .h(pulse_h) ); reset_dut(5); repeat(2) @(posedge clk); - // 3. Генерируем случайную БОЛЬШУЮ длительность для импульса START - // В норме он 1 такт. Сделаем случайным от 5 до 25 тактов. + // Старт норме 1 такт. Сделаем случайным от 5 до 25 тактов. rand_start_duration = $urandom_range(5, 25); - $display("[TB] Сгенерирован долгий импульс START: %0d тактов", rand_start_duration); + $display("[TB] Long start: %0d clocks", rand_start_duration); - // 4. Параллельный запуск длинного старта и обработки синхронизации + // Фоновый процесс подсчета тактов импульса + fork + begin : counter_proc + forever begin + @(posedge dac_wrt); + if (dac_out == pulse_h) begin + total_impulse_cycles++; + end + end + end + join_none + + // Параллельный запуск длинного старта и обработки синхронизации fork // Поток 1: Удерживаем старт аномально долго begin start_dut(rand_start_duration); end - // Поток 2: Обслуживаем n=4 циклов синхронизации со случайными задержками begin - repeat(4) begin + repeat(pulse_n) begin // Рандомизируем параметры для каждого из 4-х рукопожатий rand_first = $urandom; // Случайно: Самплер первый (1) или Генератор первый (0) rand_delay = $urandom_range(1, 8); // Случайная задержка ожидания (1..8 тактов) - rand_ack = $urandom_range(10, 30); // Аномально долгий удерживаемый импульс sampler_done (10..30 тактов) + rand_ack = $urandom_range(5, 10); // Аномально долгий удерживаемый импульс sampler_done (10..30 тактов) synchronize( .sampler_first(rand_first), @@ -186,16 +202,23 @@ module generator_tb; end end join - + repeat(pulse_p) @(posedge clk); + disable counter_proc; // Ожидание завершения переходных процессов repeat(10) @(posedge clk); - $display("[TB] -check_impulses- Тест на долгие импульсы пройден"); + if (total_impulse_cycles == pulse_w*pulse_n) + $display("[TB] -check_impulses- Pulse generation correct"); + else begin + $display("[ERROR] -check_impulses- Pulse generation incorrect. Total number of pulses: %d, must be: %d", total_impulse_cycles, pulse_w*pulse_n); + $finish; + end + $display("[TB] -check_impulses- Done"); endtask // --- ОСНОВНОЙ ПРОЦЕСС ТЕСТИРОВАНИЯ --- initial begin - $display("[TB] Старт тестов"); + $display("[TB] Tests start"); // Инициализация rst = 1; @@ -208,7 +231,7 @@ module generator_tb; check_impulses(); - $display("[TB] Все тесты выполнены!"); + $display("[TB] All Tests complete!"); $finish; end