Сборка и проверка
Вы научитесь
Как одна команда пересобирает вердикт заново.
Сборка — не вердикт, пока её нельзя пересобрать одной командой и получить вердикт заново. Виджет — такая команда для стека битстримов: CRC 12/12 по эталонам, ECC 32520/32520 кадров, 82/82 пина, 4224/4224 сегбита, золото 5/5 — каждый прогон исполнен, у каждого счёта есть знаменатель, а последняя строка говорит: audit: CLEAN. Spec урока, build_verify, — тот же список, но как spec. Если проверки должен помнить человек, однажды их не прогонят.
Попробуйте
Запустите аудит и найдите счёт с самым большим знаменателем; затем прочитайте build_verify и отметьте, какие проверки пересчитываются, а не вспоминаются.

One command re-runs every sweep: CRC 12/12 over 6 reference bitstreams, ECC 32520/32520 frames, FAR walk = Vivado FDRI, 82/82 pins, 4224/4224 segbits, writer 16/16 and fasm 22/22 byte-identical to xc7frames2bit and fasm2frames, gold 5/5. audit: CLEAN.
specs/fpga/verification/build_verify.t27
// SPDX-License-Identifier: Apache-2.0
// t27/specs/fpga/verification/build_verify.t27
// FPGA Build Verification Spec
// Validates all FPGA specs can generate Verilog and pass structural checks
// phi^2 + 1/phi^2 = 3 | TRINITY
module BuildVerify {
const TOTAL_FPGA_MODULES : u32 = 33;
const TOTAL_TESTBENCHES : u32 = 30;
const TOTAL_BOARD_CONFIGS : u32 = 3;
const TOTAL_SPECS : u32 = 66;
const NUM_BACKENDS : u32 = 4;
const VERILOG_FILES : u32 = 66;
struct ModuleReport {
name : str;
verilog_lines : u32;
has_tests : bool;
has_invariants : bool;
has_bench : bool;
}
struct BuildResult {
total_specs : u32;
parse_ok : u32;
typecheck_ok : u32;
gen_zig_ok : u32;
gen_verilog_ok : u32;
gen_c_ok : u32;
gen_rust_ok : u32;
seal_ok : u32;
failures : u32;
}
fn check_build_clean(result : BuildResult) -> bool {
return result.failures == 0;
}
fn coverage_percent(ok : u32, total : u32) -> u32 {
if total == 0 { return 0; }
return (ok * 100) / total;
}
test test_module_count {
invariant TOTAL_FPGA_MODULES == 31;
}
test test_testbench_count {
invariant TOTAL_TESTBENCHES == 30;
}
test test_board_count {
invariant TOTAL_BOARD_CONFIGS == 3;
}
test test_total_specs {
invariant TOTAL_SPECS == TOTAL_FPGA_MODULES + TOTAL_TESTBENCHES + TOTAL_BOARD_CONFIGS;
}
test test_backend_count {
invariant NUM_BACKENDS == 4;
}
test test_verilog_file_count {
invariant VERILOG_FILES == TOTAL_SPECS;
}
test test_coverage_100 {
var cov : u32 = coverage_percent(66, 66);
invariant cov == 100;
}
test test_coverage_0 {
var cov : u32 = coverage_percent(0, 66);
invariant cov == 0;
}
test test_coverage_50 {
var cov : u32 = coverage_percent(23, 46);
invariant cov == 50;
}
test test_check_build_clean_success {
var result : BuildResult = BuildResult {
total_specs: 66,
parse_ok: 66,
typecheck_ok: 66,
gen_zig_ok: 66,
gen_verilog_ok: 66,
gen_c_ok: 66,
gen_rust_ok: 66,
seal_ok: 66,
failures: 0
};
invariant check_build_clean(result) == true;
}
test test_check_build_clean_failure {
var result : BuildResult = BuildResult {
total_specs: 66,
parse_ok: 65,
typecheck_ok: 66,
gen_zig_ok: 66,
gen_verilog_ok: 66,
gen_c_ok: 66,
gen_rust_ok: 66,
seal_ok: 66,
failures: 1
};
invariant check_build_clean(result) == false;
}
invariant total_specs_positive : TOTAL_SPECS > 0;
invariant no_backend_gaps : NUM_BACKENDS == 4;
invariant all_backends_equal : VERILOG_FILES == TOTAL_SPECS;
}
Все уроки
Модуль 1 · Зачем проверять
Дизайны, которые компилируются и ошибаются; модель, которая выносит вердикт; план, записанный до кода.
Модуль 2 · Тестбенчи
Стимулы, проверки и вердикт, записанные как один spec рядом с дизайном, который они судят.
Модуль 3 · Временные диаграммы
Трасса каждого сигнала, прочитанная так, как её читает инженер по железу, и два прогона, сравнённые между собой.
Модуль 4 · Векторы соответствия
Случаи с ответом, записанным рядом, там, откуда их достанет компилятор.
Модуль 5 · Косимуляция
Spec, симулятор и плата сходятся в одном ответе на стенде Artix-7 XC7A200T, и что делать, когда не сходятся.
Модуль 6 · Покрытие
Чего коснулись тесты: строки, переключения, состояния — и что прячет это число.
Модуль 7 · Формальные методы
Ассерты, верные каждый такт; ограниченный поиск контрпримера; и почему доказательству нужна индукция.
Модуль 8 · Мутации
Ломайте дизайн нарочно и считайте, что заметили тесты.
Модуль 9 · Приёмка
Одна команда, все квитанции, чистый вердикт, который можно показать.