fix generator sync and complete randomized TB

This commit is contained in:
Zer0Nu11
2026-06-09 15:28:24 +03:00
parent 1a3b811e75
commit ccd9964ada
2 changed files with 46 additions and 22 deletions

View File

@ -55,11 +55,12 @@ module generator
if (cnt_pulse_num != pulse_num_reg) begin if (cnt_pulse_num != pulse_num_reg) begin
// wait for synchronization with sampler // wait for synchronization with sampler
if (!synced) begin if (!synced) begin
done <= 1; if (request & done) begin
if (request) begin
synced <= 1; synced <= 1;
done <= 0; done <= 0;
end end
else
done <= 1;
end end
else begin else begin
if (cnt_pulse_period != pulse_period_reg) begin if (cnt_pulse_period != pulse_period_reg) begin

View File

@ -43,7 +43,7 @@ module generator_tb;
.done(generator_done), .done(generator_done),
.request(sampler_done) .request(sampler_done)
); );
initial $display("[TB] Скомпилирован генератор ZERO_LEVEL: TRUE"); initial $display("[TB] Generator compiled. ZERO_LEVEL: TRUE");
end end
else if (ZERO_LEVEL == "logic") begin : gen_dut_logic else if (ZERO_LEVEL == "logic") begin : gen_dut_logic
generator #( generator #(
@ -62,12 +62,12 @@ module generator_tb;
.done(generator_done), .done(generator_done),
.request(sampler_done) .request(sampler_done)
); );
initial $display("[TB] Скомпилирован генератор ZERO_LEVEL: LOGIC"); initial $display("[TB] Generator compiled. ZERO_LEVEL: LOGIC");
end end
else begin : gen_dut_error else begin : gen_dut_error
// защита от дурака // защита от дурака
initial begin initial begin
$display("[ERROR] Неизвестное значение ZERO_LEVEL: %s", ZERO_LEVEL); $display("[ERROR] Unknown value ZERO_LEVEL: %s", ZERO_LEVEL);
$finish; $finish;
end end
end end
@ -144,39 +144,55 @@ module generator_tb;
int rand_delay; int rand_delay;
int rand_ack; int rand_ack;
bit rand_first; 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( set_config(
.w(3), .w(pulse_w),
.p(10), .p(pulse_p),
.n(4), .n(pulse_n),
.h(1024) .h(pulse_h)
); );
reset_dut(5); reset_dut(5);
repeat(2) @(posedge clk); repeat(2) @(posedge clk);
// 3. Генерируем случайную БОЛЬШУЮ длительность для импульса START // Старт норме 1 такт. Сделаем случайным от 5 до 25 тактов.
// В норме он 1 такт. Сделаем случайным от 5 до 25 тактов.
rand_start_duration = $urandom_range(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 fork
// Поток 1: Удерживаем старт аномально долго // Поток 1: Удерживаем старт аномально долго
begin begin
start_dut(rand_start_duration); start_dut(rand_start_duration);
end end
// Поток 2: Обслуживаем n=4 циклов синхронизации со случайными задержками // Поток 2: Обслуживаем n=4 циклов синхронизации со случайными задержками
begin begin
repeat(4) begin repeat(pulse_n) begin
// Рандомизируем параметры для каждого из 4-х рукопожатий // Рандомизируем параметры для каждого из 4-х рукопожатий
rand_first = $urandom; // Случайно: Самплер первый (1) или Генератор первый (0) rand_first = $urandom; // Случайно: Самплер первый (1) или Генератор первый (0)
rand_delay = $urandom_range(1, 8); // Случайная задержка ожидания (1..8 тактов) 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( synchronize(
.sampler_first(rand_first), .sampler_first(rand_first),
@ -186,16 +202,23 @@ module generator_tb;
end end
end end
join join
repeat(pulse_p) @(posedge clk);
disable counter_proc;
// Ожидание завершения переходных процессов // Ожидание завершения переходных процессов
repeat(10) @(posedge clk); 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 endtask
// --- ОСНОВНОЙ ПРОЦЕСС ТЕСТИРОВАНИЯ --- // --- ОСНОВНОЙ ПРОЦЕСС ТЕСТИРОВАНИЯ ---
initial begin initial begin
$display("[TB] Старт тестов"); $display("[TB] Tests start");
// Инициализация // Инициализация
rst = 1; rst = 1;
@ -208,7 +231,7 @@ module generator_tb;
check_impulses(); check_impulses();
$display("[TB] Все тесты выполнены!"); $display("[TB] All Tests complete!");
$finish; $finish;
end end