verilog_analizer

0

Описание

учебный верилог

Языки

  • C86,8%
  • Yacc7%
  • Verilog3,4%
  • Lex1,2%
  • Makefile0,8%
  • Python0,8%
README.md

verilog_analizer

учебный верилог

Verilog Static Analyzer (Linter) 🚀 О проекте Это инструмент для статического анализа и проверки семантики кода на языке Verilog. Анализатор не просто проверяет синтаксис, но и понимает физический смысл цифровой схемы: вычисляет параметры, проверяет разрядность шин и находит потенциальные ошибки в логике (например, нежелательные защелки-latches). Проект объединяет в себе синтаксический чекер, семантический линтер и генератор логических нетлистов.

✨ Ключевые возможности

  • Двухпроходной анализ: Первым проходом собираются параметры (

    parameter
    ), вторым — вычисляются зависимости и проверяются сигналы.

  • Вычислитель констант: Полная поддержка арифметики в параметрах и диапазонах шин, включая системную функцию

    $clog2
    (потолок двоичного логарифма).

  • Контроль разрядности (Width Check):

    • Проверка соответствия LHS и RHS в операторах
      assign
      и процедурных блоках.
    • Поддержка конкатенаций как в правой (
      assign a = {b, c}
      ), так и в левой части (
      assign {a, b} = c
      ).
  • Анализ процедурной логики:

    • Корректная обработка блоков
      always @(*)
      ,
      if-else
      и
      case
      .
    • Linter: Автоматическое обнаружение неполных операторов
      case
      , приводящих к генерации защелок (latches).
  • AST Visualization: Генерация детализированного дерева абстрактного синтаксиса (AST) для отладки структуры модуля.

  • Синтез логического нетлиста (Netlist Generation):

    • Генерация нетлиста в формате JSON (совместим с Yosys/Netlistsvg).
    • Автоматическое развертывание сложных выражений в цепочки логических вентилей (
      AND
      ,
      OR
      ,
      XOR
      ,
      BUF
      ).
    • Генерация временных соединений (
      $tmp
      ) для промежуточных вычислений.
    • Bit-blasting: Полная поддержка многобитных шин в секциях
      ports
      и
      cells
      .

    Вычислительный движок:

    • Поддержка параметров и системной функции
      $clog2
      .
    • Рекурсивный вычислитель константных выражений для определения разрядности шин.

    Семантический контроль:

    • Проверка разрядности в
      assign
      (включая конкатенации в LHS и RHS).
    • Обнаружение неполных
      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" ] } } }

    Используйте код с осторожностью.

    🛠 Архитектура

    1. Frontend: Flex/Bison для построения AST-дерева.

    2. Core: Таблица символов и семантический анализатор.

    3. 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

📋 Пример работы

При обнаружении ошибки в разрядности или структуре

case
, анализатор выдает предупреждение:

text

[Warning] L15: Несовпадение разрядности в присваивании. LHS: 8 бит, RHS: 4 бит. [Warning] L13: Оператор case не полон (описано 2 из 4 состояний). Возможна генерация защёлки (latch).

Проект находится в начальной стадии. Код "сырой". При использовании прошу понимать риск.

📂 Структура проекта

  • lexer.l
    — лексические правила (Flex).

  • parser.y
    — грамматика Verilog (Bison).

  • ast.c/h
    — управление узлами дерева и визуализация.

  • semantics.c
    — движок вычислений и проверок.

  • symbol_table.c
    — реестр идентификаторов и параметров.

📝 Планы на будущее (To-Do)

  • Поддержка многофайловых проектов (
    include
    ).
  • Генерация графических схем в формате DOT/Graphviz.
  • Статический анализ временных задержек (Timing Analysis).