Всё в одном стенде
Вы узнаете
Что проверяет интеграционный стенд, когда все шины дизайна гоняются одновременно.
Интеграционный стенд гоняет все шины разом и спрашивает дизайн, держится ли он целиком: test_reset_all_modules, test_module_count, test_mac_uart_pipeline, test_spi_memory_pipeline, test_full_pipeline, семь тестов. Запись опускает тестбенч-спеку интеграции в Verilog: все шины дизайна в одном стенде.
Попробовать
В записи найдите пять тестов конвейеров; затем в спеке скажите, какие две шины соединяет интеграционный стенд.

The integration testbench spec lowered to Verilog: every bus of the design in one bench.
specs/fpga/testbench/integration_tb.t27
// SPDX-License-Identifier: Apache-2.0
// t27/specs/fpga/testbench/integration_tb.t27
// Full FPGA Integration Testbench
// Tests top-level connectivity: MAC + UART + SPI + Memory + Bridge
// phi^2 + 1/phi^2 = 3 | TRINITY
module Integration_Testbench {
const CLK_PERIOD : u32 = 20;
const SIM_TIMEOUT : u32 = 20_000_000;
const NUM_MODULES : u32 = 5;
var clk : bool = false;
var rst_n : bool = false;
var mac_busy : bool = false;
var uart_tx_ready : bool = false;
var spi_done : bool = false;
var mem_ready : bool = false;
var bridge_busy : bool = false;
var all_modules_idle : bool = false;
var integration_passed : bool = false;
var test_passed : u32 = 0;
var test_failed : u32 = 0;
fn tick() {
clk = false;
clk = true;
}
fn reset() {
rst_n = false;
tick();
tick();
rst_n = true;
tick();
}
fn check_all_idle() -> bool {
return !mac_busy && uart_tx_ready && spi_done && mem_ready && !bridge_busy;
}
test test_reset_all_modules {
reset();
all_modules_idle = check_all_idle();
invariant all_modules_idle == true;
}
test test_module_count {
invariant NUM_MODULES == 5;
}
test test_mac_uart_pipeline {
reset();
mac_busy = true;
tick();
tick();
mac_busy = false;
uart_tx_ready = true;
tick();
invariant uart_tx_ready == true;
}
test test_spi_memory_pipeline {
reset();
spi_done = false;
tick();
tick();
spi_done = true;
mem_ready = true;
tick();
invariant mem_ready == true;
}
test test_full_pipeline {
reset();
mac_busy = true;
tick();
mac_busy = false;
uart_tx_ready = true;
tick();
spi_done = true;
mem_ready = true;
bridge_busy = true;
tick();
bridge_busy = false;
all_modules_idle = check_all_idle();
invariant all_modules_idle == true;
integration_passed = true;
}
test test_stress_pipeline {
reset();
var i : u32 = 0;
while i < 10 {
mac_busy = true;
tick();
mac_busy = false;
uart_tx_ready = true;
tick();
spi_done = true;
mem_ready = true;
bridge_busy = true;
tick();
bridge_busy = false;
i = i + 1;
}
all_modules_idle = check_all_idle();
invariant all_modules_idle == true;
}
invariant num_modules_positive : NUM_MODULES > 0;
test test_tick_function {
reset();
var initial_clk : bool = clk;
tick();
invariant clk == !initial_clk;
}
bench bench_integration_throughput {
reset();
var i : u32 = 0;
while i < 50 {
mac_busy = true;
tick();
mac_busy = false;
uart_tx_ready = true;
tick();
i = i + 1;
}
}
}
Все уроки
Модуль 1 · Что такое шина
Зачем вообще существует шина: разговор по проводам, с кадрами и адресами, и кому позволено говорить.
Модуль 2 · Разговор по UART
Двухпроводная шина без такта: кадр, делитель, задающий скорость, и статус, который опрашивает драйвер.
Модуль 3 · SPI под тактом
Разговор под тактом: четыре режима, лестница предделителей и выбор кристалла на каждого подчинённого.
Модуль 4 · Регистровая шина APB
Шина регистров: PSEL и PENABLE, строобы и ожидания, и сколько адресных бит стоит количество периферии.
Модуль 5 · Пять каналов AXI4
Пять каналов: адрес, данные и отклик в обе стороны, lite или full, пакеты и идентификаторы.
Модуль 6 · Память
Что находится на дальнем конце каждой шины: карты памяти, типы портов и задержка, которую должно покрывать ожидание.
Модуль 7 · Мосты
Почему в дизайне появляется больше одной шины и пакетный мост, переносящий работу между ними.
Модуль 8 · Ethernet: кадры и тайминг
Кадры, контрольная сумма кадра, тайминг RGMII и заранее зарегистрированные шаги настоящего запуска.
Модуль 9 · Стенд
Дисциплина, оберегающая настоящее железо: кто держит IO, как взять и вернуть захват, и что запускается дальше.