Doka avatar

Журнал Эмбеддед-Инженера

О микроэлектронике, радиотехнике и хобби

Содержание

Dmitry Murzinov

4 минут чтения

Генераторы RTL карты регистров (или CSR - control/status registers) появились задолго до стандарта IP-XACT, а значит прошли достаточно большой путь эволюции. Да и сам IP-XACT за это время "эволюционировал" в SystemRDL.

Однако до сих пор существуют детские проблемы, а то и вовсе фундаментальные недоработки тулов для генерации RTL CSR.

Далее по пунктам разберу что же с ними не так?

1. Zoo and lack of Standards supports

Это конечно прозвучит весьма странно, однако даже сегодня не у всех тулов есть поддержка IP-XACT & SystemRDL.

Окей. Если тулы не поддерживают стандарт, значит у них есть собственный уникальный взгляд на метаописание карты регистров. Приемлемо, но…​ помимо зоопарка форматов на метаописание присутствует крайне неприятная вещь в виде зоопарка в описании полей доступа - и тут возникает достаточно нетривиальная задача по матчингу разных типов между разными тулами.

Более того в некоторых метаописаниях предусматривается несколько полей доступа, например у SystemRDL их два: для HW и SW доступа, что лишь плодлливает масла в огонь.

2. SV only, not Verilog

Есть определенная категория тулов, которая поддерживает RTL-вывод только в VHDL. Однако большая часть тулов поддерживает RTL-вывод в SystemVerilog и VHDL. Pure Verilog в пролёте.

Т.е. я понимаю что систем-верилог - это модно, стильно, молодёжно, но такая оголтелая ориентация на SV как на основной RTL deliverables, а не на Verilog.. Сириусли?

Т.е. по замыслу разработчиков опен-сорс тулов для генерации карты регистров у вас нет денег на покупку коммерческого тула для генерации карты регистров, но есть деньги на покупку синтезатора и симулятора от $SNPS/$CDNS ??? Смехотворно!

3. Registers splitting mechanism

Довольно распространённый сценарий, но я почему-то не смог найти поддержку его реализации у текущих тулов. Имею в виду кейс, когда ширина регистра/поля регистра превосходит ширину внутренней шины данных.

Вот допустим есть переменная value7[19:0], а доступ к шине данных - восьмибитный, т.о. надо переменную расположить в трёх соседних ячейках:

  • value7[19:16]

  • value7[15:8]

  • value7[7:0]

Т.е. гипотетический workaround понятен: можно описать регистр как три отдельных регистра с идентичным именем, но разными диапазонами бит, но в этом случае атрибуты и описание регистра надо будет продублировать дважды, что как-то не особо методологически правильно.

Другой пример: [записать|прочитать] [ключ|результат] шифрования размером 128 или 256 бит по шине 32-битного процессора.

4. Documentation as last priority

Такое ощущение, что генераторы полей регистров ориентированы на всё что угодно, но не на автоматическое формирование документации следуя концепции единого источника.

Основные претензии:

  • До сих пор нету красивой рисовалки полей регистров. Если таковой функционал заявлен, то реализуется через bitfield (форк автора Wavedrom)либо с помощью ПО из набора asciidoctor-diagrams.

  • Нет достаточного числа полей для описания функционала регистра/поля регистра, чтобы в автоматическом режиме сгенерировать исчерпывающую документацию. В идеале хотелось бы иметь следующие поля для документации в метаописании:

    • Имя для машины (название переменной в коде)

    • Имя для человека (человекопонятное имя сущности)

    • Описание (для таблицы регистров)

    • Расширенное описание (в том случае, если описание функционала довольно объёмное, то его можно вынести в отдельный абзац с помощью расширенного описания)

  • Не все тулы поддерживают многострочные строки (с возможностью произвольного форматирования внутри такой строки): хотелось бы иметь возможность прям в метаописании применять специфичное для документации форматирование (asciidoc/markdown разметку), которые 1-в-1 будут вставляться в документ при рендере. В этом плане весьма выигрышны метаописания на основе формата Yaml, который нативно поддерживает подобные многострочные описания.

5. Configurations' support

Ну и на десерт самое экзотичное.

Для документации и автоматической генерации системных/функциональных тестов очень хочется реализации поддержки неких сетапов/конфигов, которые по сути содержат описания инициализационной последовательности для разных кейсов.

Вот, допустим, есть универсальный IP-блок: USB. И этот блок можно сконфигурировать как Host или как Device. Т.е. помимо значений по сбросу для полей регистров, метаописание будет иметь еще два значения на каждое поле: сценарий#1 (Host) и сценарий#2 (Device). В каких-то случаях (там где это необходимо) необходимо помимо самих значениях полей для сценария указывать еще и последовательность инициализации полей регистров: порядковым номером (если каждое поле должно быть проинициализировано в строгом порядке) или указанием зависимостей after и before от проинициализированных полей.

Помимо автоматической генерации документации с описанием сценариев работы и конфигурации, можно теже сценарии использовать для верификаци для быстрой настройки на определенный режим работы и для генерации Си-кода с последовательностью инициализации (для системных тестов или end user сценариев применения).

  • PeakRDL :: (Python) Control and status register code generator toolchain

  • reggen and regtool :: (Python) from OpenTitan project

  • RGGEN :: (Ruby) Code generation tool for control and status registers

  • Corsair :: (Python) Control and Status Register map generator for HDL projects

  • Cheby :: (Python) aims at defining a file format to describe the HW/SW interface (the memory map), and a set of tools to generate HDL, drivers, documentation. Publication

Последние записи

Разделы