Часть 1: Начало реализации (Front-end Bridge)
Предисловие: первый шлюз перед превращением кода RTL в кремний
В современном проектировании полупроводников, особенно в процессе проектирования SoC (систем на кристалле), объединяющих миллиарды транзисторов, «кодирование RTL» является лишь отправной точкой в долгом путешествии. Распространенным заблуждением при первом знакомстве с Verilog HDL во время обучения в бакалавриате или магистратуре является убеждение, что «проектирование завершено, как только волна появляется в симуляции тестового стенда в соответствии с замыслом».

Однако среда моделирования — это идеальный логический мир, в котором не существует физических ограничений. думают: «Теперь я знаю, как проектировать микросхемы!» Однако, поступив в аспирантуру и столкнувшись с процессом выпуска микросхем, они погружаются в глубокие дебри полупроводниковой технологии.
Реальные полупроводники содержат огромное количество схем, подобных показанной ниже.

Такие схемы используются в огромных количествах,

Чтобы создать функционирующий чип, в котором электроны перемещаются по реально изготовленному полупроводнику, необходимо преодолеть суровые физические реалии, связанные с синхронизацией, мощностью, шумом, площадь и вариативность.
В этой статье «Начало реализации (фронтальный мост)» рассматриваются этапы до и после ввода кода RTL в инструмент синтеза.
Стиль кодирования Verilog: можно ли синтезировать код?
Первым препятствием в процессе проектирования является изучение стиля кодирования Verilog: можно ли синтезировать код?
EC%9D%B8%EA%B0%80">Стиль кодирования Verilog: является ли он кодом, пригодным для синтеза?
Первым этапом в процессе проектирования является изучение стиля кодирования Verilog.
Проектирование полупроводников является очень сложным процессом, поскольку производство чипов обходится более чем в 10 000 000 долларов США, а после производства их невозможно модифицировать. Поэтому «Кодирование аппаратного обеспечения должно быть высоконадежным и пригодным для массового производства».

1. Суть аппаратного обеспечения: «Это схемы, а не код»
Студенты часто ошибочно считают Verilog языком программирования, подобным C. Однако железобетонное правило для проектирования производственного уровня гласит:
- Понимание физики: электронам требуется время для перемещения (задержка затвора + задержка сети). Симуляция рассчитывает это время как «ноль», но в реальном кремнии это время зависит от температуры и напряжения.
- Эстетика простоты: Яркий синтаксис предназначен только для симуляции. Помните, что реальные чипы представляют собой лишь комбинации комбинационной + последовательной логики.
- Даже исключительно хорошо сделанные проекты могут подвергаться сбоям кремния. Если вы не сделаете его простым, вы также не сможете отладить причину.
2. Правила проектирования последовательной логики (FF) Правила проектирования
Триггеры составляют основу микросхемы. Допускаются только самые консервативные и стандартные структуры. Естественно, даже если нижеуказанные соглашения не соблюдаются, производство микросхем по-прежнему возможно на практике.
- Соглашения по тактовой частоте/сбросу:
- Тактовая частота с положительным фронтом: поскольку это является стандартным значением для библиотек ячеек, следует использовать только
posedge clk. Не рекомендуется смешиватьnegedge clkв одном чипе.- Перед изготовлением чипа необходимо провести статический анализ временных характеристик, чтобы убедиться, что все сигналы поступают вовремя.(статический анализ временных характеристик). Смешивание
posedgeиnegedgeсоздает «полуцикловые пути», которые уменьшают запас по времени вдвое. - Если интервалы высокого и низкого уровня тактового генератора не равны точно 50:50 (джиттер/сдвиг), вероятность возникновения проблем с шумом в смешанных интервалах
posedgeиnegedgeзначительно увеличивается. - На практике крупные корпорации используют еще более строгие критерии проектирования. За исключением сверхскоростных коммуникационных блоков, большинство системных интегральных схем проектируются с использованием
posedge.li>
- Перед изготовлением чипа необходимо провести статический анализ временных характеристик, чтобы убедиться, что все сигналы поступают вовремя.(статический анализ временных характеристик). Смешивание
- Асинхронный сброс: Сброс должен быть асинхронным, по возможности с использованием
negedge.- Многие ячейки библиотеки литейного производства оптимизированы для активного низкого асинхронного сброса.
- Надежная инициализация: При включении питания еще до стабилизации тактовой частоты, чтобы принудительно перевести чип в безопасное состояние «IDLE».
- Отсутствие гейтинга: Не размещайте логические вентили (AND, OR) непосредственно на тактовой линии; используйте ICG в соответствии с рекомендациями производителя.
- Глючный ад: Использование стандартного вентиля
ANDдля включения и выключения тактовой частоты может привести к возникновению коротких глюков. Если они попадают в триггеры, может произойти повреждение данных, и чип может перейти в состояние «неизвестной причины».code> для переключения тактового генератора может генерировать кратковременные помехи. Если это попадает в триггер, данные повреждаются, и чип переходит в состояние «необъяснимой остановки». - Сертифицированный заводом: ячейки ICG являются специальными компонентами, сертифицированными заводом как «Это значительно безопаснее с точки зрения глюков». Крупные компании отклоняют проекты, содержащие даже один стандартный логический вентиль на линиях тактового генератора, рассматривая это как «ошибку Lint».
- Глючный ад: Использование стандартного вентиля
- Тактовая частота с положительным фронтом: поскольку это является стандартным значением для библиотек ячеек, следует использовать только
Соответствие стандартному синтаксису:Verilog
always @(posedge clk or negedge rst_n) begin
if (!rst_n) data_q <= 8'd0; else data_q <= next_data; end 3. Комбинационная логика: wire над reg
Это самый важный момент, подчеркнутый в вашем представлении. Необходимо с осторожностью подходить к проектированию комбинационных схем с использованием reg в блоке always @(*).
В общем случае при проектировании цифровых схем вместо защелок используются триггеры.
- Риск: если условные операторы (
if,case) неправильно обрабатываются в блокеalways @(*), могут создаваться непреднамеренные защелки. Хотя это может работать в симуляции, в ходе реального массового производства это может привести к остановке работы при определенных температурах. - Безопасная альтернатива: по возможности используйте
assignиwireдля последовательных операторов присваивания.- Плохо (избегайте): Проектирование комбинационных схем с
regвнутриalways @(*)(риск возникновения задержек) - Хорошо (безопасно):
assign out = (cond) ? a : b;(физическая схема четко видна)
- Плохо (избегайте): Проектирование комбинационных схем с
4. Основы проектирования конечных автоматов (FSM)
Для серийных конечных автоматов ключевым моментом является не «сложные операторы case», а «четкое разделение сигналов».
- Разделение переходов между состояниями и логики вывода:
- Регистр состояний: блок
always(последовательный) - Логика следующего состояния: оператор
assign(комбинационный) - Логика вывода: оператор
assign(комбинационная)
- Регистр состояний: блок
5. Предотвращение ошибок за счет внимания к деталям-%EB%94%94%ED%85%8C%EC%9D%BC">5. Детали, которые предотвращают ошибки
- Соответствие разрядности: Никогда не допускайте ошибки, записывая
9'd0при сбросе10'd5. В тот момент, когда вы ожидаете, что инструмент примерно исправит это, массовое производство потерпит неудачу. - Ловушка значения по умолчанию: Отбросьте представление о том, что «это, вероятно, не нужно делать». Каждое выражение
caseдолжно иметьdefault, а каждое выражениеifдолжно иметьelse, чтобы обеспечить детерминированность каждого пути в схеме.
Рекомендуемая книга: Verilog Coding Style for Mass Production

Повторим, производство возможно даже без соблюдения стиля кодирования Verilog. Однако крупные корпорации внедряют эти правила, чтобы немного улучшить выход, минимизировать риск сбоев в массовом производстве и упростить выявление причин в случае сбоев.
- Руководство по методологии повторного использования (RMM): самая известная книга
- Руководство по стилю проектирования STARC: насколько я понимаю, инженеры крупных корейских компаний-производителей полупроводников, которые учились в Японии, в значительной степени опирались на эту книгу при разработке многих правил стиля кодирования Verilog, и не только для японских компаний-производителей полупроводников.

Далее идет RTL Linting. В то время как Lint в разработке программного обеспечения просто проверяет синтаксические ошибки или стиль, Linting в проектировании аппаратного обеспечения ставит вопрос выживания: «Можно ли преобразовать этот код в реальную схему?»
Симуляторы щедро принимают код, который является синтаксически правильным, но невозможно реализовать в реальном аппаратном обеспечении, или который, в случае реализации, привел бы к фатальным сбоям. Обнаружение этого «несоответствия между симуляцией и синтезом» является основной целью RTL Lint.1
1.1 Синтезируемость: разрыв между симуляцией и физической реализацией
Инструменты синтеза (например, Synopsys Design Compiler) считывают код RTL и преобразуют его в абстрактные логические вентили внутри инструмента, известные как GTECH(Generic Technology). Наиболее частая проблема, возникающая в ходе этого процесса, — это когда аппаратное обеспечение интерпретируется иначе, чем предполагал разработчик.
1.1.1 Вывод защелки: риск непреднамеренных устройств памяти
Одним из табу в проектировании цифровых схем является создание «выведенных защелок». При описании комбинационной логики, если выходные значения не указаны явно для всех возможных условий в операторе if или case, инструмент синтеза определяет, что предыдущее значение должно сохраняться в ситуациях, когда условие не указано. Поскольку комбинационные схемы не могут хранить значения сами по себе, инструмент принудительно вставляет прозрачный замок для хранения данных.-%ED%95%98%EB%8A%94%EA%B0%80">Почему следует избегать использования защелок?
- Увеличение сложности STA (статического анализа временных характеристик): триггеры передают данные только на фронтах тактового сигнала, что упрощает анализ временных характеристик. Напротив, защелки обладают характеристикой «заимствования времени», при которой изменения входных данных распространяются на выходные данные в течение всего прозрачного окна. Это значительно усложняет анализ временных путей, затрудняя завершение синхронизации, поскольку инструментам сложно точно рассчитать времена установки/удержания. При вставке цепочек сканирования для производственного тестирования защелки трудно контролировать и наблюдать, что затрудняет генерацию тестовых шаблонов и снижает охват неисправностей.
Решение: защитный стиль кодирования
Наиболее надежной профилактической мерой является присвоение значения по умолчанию в самом верху всех блоков always_comb (SystemVerilog) или always @(*) (Verilog). Это гарантирует, что даже если конкретный путь опущен в условном операторе, будет присвоено значение по умолчанию. Следовательно, нет необходимости поддерживать значение, и защелка не создается.
Пример 1: Когда enable равен 0, нет определения для data_out, что приводит к созданию защелки.
always @(*) begin if (enable) data_out = data_in;
end Пример 2: Инициализируется значением 0 при входе в блок, поэтому значение определяется без необходимости ввода оператора if -> синтезируется как комбинационная логика (MUX)
always_comb begin data_out = 1'b0; // Присвоение по умолчанию if (enable) data_out = data_in; end
Кроме того, при использовании оператора case всегда необходимо включать клаузу default, чтобы предотвратить неопределенные состояния. Без клаузы default инструмент пытается сохранить предыдущее значение при получении входа, не соответствующего ни одному из условий case, тем самым создавая защелку.
1.1.2 Проблемы полного и параллельного case: «Злые близнецы»
Одной из самых спорных и опасных тем в истории проектирования Verilog является использование прагм синтеза, таких как // synopsys full_case parallel_case. Выдающийся эксперт по Verilog Клиффорд Каммингс назвал их «злыми близнецами синтеза Verilog» и предупредил об их опасности. Хотя их использование действительно может несколько сократить ваш код, лично я избегаю такого стиля. Достаточно просто узнать о существовании прагм синтеза.


Как правило, даже университетские исследовательские лаборатории имеют небольшой стиль кодирования Verilog.
В следующей статье мы рассмотрим RTL Lint.