verilog_analizer
Описание
учебный верилог
Языки
- C86,8%
- Yacc7%
- Verilog3,4%
- Lex1,2%
- Makefile0,8%
- Python0,8%
verilog_analizer
учебный верилог
Verilog Static Analyzer (Linter) 🚀 О проекте Это инструмент для статического анализа и проверки семантики кода на языке Verilog. Анализатор не просто проверяет синтаксис, но и понимает физический смысл цифровой схемы: вычисляет параметры, проверяет разрядность шин и находит потенциальные ошибки в логике (например, нежелательные защелки-latches). Проект объединяет в себе синтаксический чекер, семантический линтер и генератор логических нетлистов.
✨ Ключевые возможности
-
Двухпроходной анализ: Первым проходом собираются параметры (
), вторым — вычисляются зависимости и проверяются сигналы.parameter -
Вычислитель констант: Полная поддержка арифметики в параметрах и диапазонах шин, включая системную функцию
(потолок двоичного логарифма).$clog2 -
Контроль разрядности (Width Check):
- Проверка соответствия LHS и RHS в операторах
и процедурных блоках.assign - Поддержка конкатенаций как в правой (
), так и в левой части (assign a = {b, c}).assign {a, b} = c
- Проверка соответствия LHS и RHS в операторах
-
Анализ процедурной логики:
- Корректная обработка блоков
,always @(*)иif-else.case - Linter: Автоматическое обнаружение неполных операторов
, приводящих к генерации защелок (latches).case
- Корректная обработка блоков
-
AST Visualization: Генерация детализированного дерева абстрактного синтаксиса (AST) для отладки структуры модуля.
-
Синтез логического нетлиста (Netlist Generation):
- Генерация нетлиста в формате JSON (совместим с Yosys/Netlistsvg).
- Автоматическое развертывание сложных выражений в цепочки логических вентилей (
,AND,OR,XOR).BUF - Генерация временных соединений (
) для промежуточных вычислений.$tmp - Bit-blasting: Полная поддержка многобитных шин в секциях
иports.cells
Вычислительный движок:
- Поддержка параметров и системной функции
.$clog2 - Рекурсивный вычислитель константных выражений для определения разрядности шин.
Семантический контроль:
- Проверка разрядности в
(включая конкатенации в LHS и RHS).assign - Обнаружение неполных
(предупреждение о генерации защёлок).case
Процедурная логика:
- Корректный разбор
,always @(*)и вложенныхif-else.case
Topology Analysis (Анализ топологии):
- Combinational Loop Detection: Автоматическое обнаружение бесконечных комбинационных петель (например,
), которые приводят к осцилляциям в железе.assign a = b; assign b = a; - Unused Signals Detection: Поиск объявленных, но не задействованных в логике сигналов (
/wire), помогающий очистить проект от «мусора».reg
Advanced RTL Linting:
- Sensitivity List Check: Проверка полноты списка чувствительности в блоках
. Инструмент предупредит, если вы забыли добавить сигнал, используемый внутри блока.always @(...) - L-Value Type Check: Строгая проверка типов — запрет на использование
в процедурных блоках (требуетсяwire).reg
Smart Synthesis & Netlist:
- Генерация JSON-нетлиста с поддержкой векторных операций и параметров.
- Pattern Matching: Распознавание сложных конструкций (например, синхронный триггер с асинхронным сбросом) и их замена на компактные ячейки
.$DFF_SR
📊 Пример синтезированного нетлиста
Для кода
анализатор генерирует:assign out = a & b;json
"cells": { "$cell_1": { "type": "$AND", "parameters": { "WIDTH": 4 }, "connections": { "A": [ "a[0]", "a[1]", "a[2]", "a[3]" ], "B": [ "b[0]", "b[1]", "b[2]", "b[3]" ], "Y": [ "$tmp1" ] } } }Используйте код с осторожностью.
🛠 Архитектура
-
Frontend: Flex/Bison для построения AST-дерева.
-
Core: Таблица символов и семантический анализатор.
-
Backend: Модуль генерации нетлиста (Netlist Generator).
🛠 Стек технологий
- Flex (Lexical Analyzer): Токенизация Verilog-кода.
- Bison (Parser Generator): Построение грамматики и дерева AST.
- C (GCC): Высокопроизводительное ядро анализатора и семантический движок.
Для сборки проекта
make
Для прогона тестов из терминала или главного Makefile:
make test — инкрементальная сборка. Если вы исправили только один файл test-3.v, при запуске выполнится только этот тест. Это экономит кучу времени.
make retest — полный прогон с нуля. Полезно перед финальным коммитом.
make clean — если нужно просто все подтереть.
Для анализа Verilog-файла:
bash
./verilog_analyzer tests/test-18.v
📋 Пример работы
При обнаружении ошибки в разрядности или структуре , анализатор выдает предупреждение:
text
[Warning] L15: Несовпадение разрядности в присваивании. LHS: 8 бит, RHS: 4 бит.
[Warning] L13: Оператор case не полон (описано 2 из 4 состояний). Возможна генерация защёлки (latch).
Проект находится в начальной стадии. Код "сырой". При использовании прошу понимать риск.
📂 Структура проекта
-
— лексические правила (Flex).lexer.l -
— грамматика Verilog (Bison).parser.y -
— управление узлами дерева и визуализация.ast.c/h -
— движок вычислений и проверок.semantics.c -
— реестр идентификаторов и параметров.symbol_table.c
📝 Планы на будущее (To-Do)
- Поддержка многофайловых проектов (
).include - Генерация графических схем в формате DOT/Graphviz.
- Статический анализ временных задержек (Timing Analysis).