fix generator sync and complete randomized TB
This commit is contained in:
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user