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
// 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

View File

@ -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