Что означает правильность аппаратного обеспечения, синтезированного из кода Verilog

Я прочитал "Неблокирующие присвоения в Verilog Synthesis, убивающие стили кодирования!" пользователя Клиффорд Каммингс. Он говорит, что код в конце этого вопроса "гарантированно" будет синтезирован в конвейер с тремя триггерами, но не гарантируется правильное моделирование (пример pipeb3, стр. 10; "гарантированный" комментарий находится на стр. 12 ). Документ получил награду за лучшую бумагу, поэтому я полагаю, что утверждение верно. http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf

Мой вопрос: как определяется правильность синтеза Verilog, если не на основании семантики моделирования? Большое спасибо.

Я полагаю, что вопрос о бонусных баллах заключается в следующем: дайте простейшую возможную программу Verilog, которая имеет четко определенную семантику синтеза и не имеет четко определенной семантики моделирования, при условии, что это не приведенный ниже код. Еще раз спасибо.

Фактически, может ли кто-нибудь дать мне часть Verilog, которая хорошо определена как при моделировании, так и при синтезе, но при этом они дают разные результаты?

Код:

module pipeb3 q3, d, clk);
  output [7:0] q3;
  input [7:0] d;
  input clk;
  reg [7:0] q3, q2, q1;

  always @(posedge clk) q1=d;
  always @(posedge clk) q3=q2;
  always @(posedge clk) q1=d;
endmodule

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

[Теперь я думаю, что это не та статья. В разделе 5.2 стандарта 1364-2001 четко сказано, что смысл программы Verilog определяется ее моделированием, которое затем определяет стандарт (недетерминизм и все такое). Нет никаких упоминаний о каких-либо «гарантиях», которые инструменты синтеза должны предоставлять помимо симуляторов.

Существует еще один стандарт 1364.1-2002, который описывает синтезируемое подмножество. Нет очевидного упоминания о том, что семантика синтезируемого оборудования должна как-то отличаться от симуляции. В разделе 5.2.2 «Моделирование устройств хранения, чувствительных к границам» говорится, что неблокирующие назначения следует использовать для моделирования триггеров. На стандартном языке это означает, что использование чего-либо еще не поддерживается.

В заключение, в разделе, упомянутом в предыдущем абзаце, говорится, что блокирующие назначения могут использоваться для вычисления RHS неблокирующего назначения. Это, по-видимому, нарушает рекомендацию № 5 Каммингса.

Клифф Каммингс числится членом рабочей группы стандарта 1364.1-2002. Этот стандарт указан как замененный на веб-сайте IEEE, но я не могу сказать, чем он был заменен.]


person user1002059    schedule 26.06.2012    source источник
comment
Я бы определил, что синтезированное оборудование будет делать то, что может делать правильный симулятор. И наоборот. Симулятор должен дать тот же результат, что и синтезируемое оборудование.   -  person Morgan    schedule 26.06.2012
comment
Боюсь, что это явно неправильно. Моделирование намеренно недетерминировано, поэтому разные правильные тренажеры могут давать разные результаты. Действительно, разные прогоны одного и того же правильного симулятора могут дать разные результаты (AFAIK). Таким образом, одно и то же оборудование могло бы случайным образом переключаться с правильного на неправильное. Не хорошо. (При этом исходное определение потребует огромного списка оговорок, чтобы объяснить, что может означать результат, производимый оборудованием.)   -  person user1002059    schedule 27.06.2012
comment
IEEE 1364 теперь является частью IEEE 1800 - SystemVerilog. По сути, они объединили два языка в одну спецификацию. Они сделали это, потому что 1800 должен был добавить к 1364, но были пробелы. Поместив их в единую спецификацию, легче убедиться в отсутствии дыр.   -  person Paul S    schedule 28.06.2012
comment
Я хотел сказать, что если оборудование, сгенерированное из hdl, детерминировано, то есть вы всегда получаете одно и то же. Я бы хотел, чтобы симулятор подсказывал мне, что будет делать оборудование. Не получается аппаратное обеспечение, которое дает такой же результат, как и симулятор. NB: это также было моим мнением о том, чего я хочу от симулятора, а не в соответствии со спецификациями IEEE.   -  person Morgan    schedule 29.06.2012


Ответы (3)


Все -

Пришло время поделиться полезной справочной информацией и моим собственным мнением.

Во-первых, стандарт синтеза IEEE-1364.1-2002 Verilog RTL никогда не был полностью реализован ни одним поставщиком, поэтому никто из нас не торопился обновлять стандарт или предоставлять версию стандарта синтеза для SystemVerilog. Насколько мне известно, стандарт не был «заменен», а просто истек. Насколько мне известно, атрибуты, описанные в Стандарте, никогда не были полностью реализованы ни одним поставщиком. Единственная полезная функция в Стандарте, которая, как я полагаю, была реализована всеми поставщиками, заключалась в том, что поставщик должен установить макрос `define SYNTHESIS перед чтением любого пользовательского кода, так что теперь вы можете использовать` ifndef SYNTHESIS - `endif в качестве общей замены для конкретных поставщиков // synopsys translate_on - // synopsys translate_off pragma-comments.

Verilog был изобретен как язык моделирования и никогда не задумывался как язык синтеза. В конце 1980-х годов Synopsys осознала, что инженерам очень нравится этот язык моделирования Verilog, и начала определять подмножество языка, которое они (Synopsys) распознали бы и преобразовали посредством синтеза в оборудование. Теперь мы называем это подмножеством синтеза RTL, и это подмножество может со временем расти, поскольку поставщики инструментов синтеза обнаруживают уникальные и творческие способы преобразования нового типа описания в оборудование.

На самом деле не существует «определенной корректности синтеза Verilog». В 1999 году мы с Доном Миллсом написали статью под названием «Стили кодирования RTL, которые приводят к несоответствиям моделирования и синтеза», чтобы предупредить инженеров о законных стилях кодирования Verilog, которые могут определять синтезируемое оборудование с различным поведением. http://www.sunburst-design.com/papers/CummingsSNUG1999SJ_SynthMismatch.pdf

Учтите, что если бы синтезированные результаты всегда соответствовали поведению моделирования Verilog, не было бы необходимости запускать моделирование ворот. Дизайн, смоделированный с помощью RTL, был бы правильным. Поскольку нет гарантированного совпадения, инженеры запускают симуляторы ворот, чтобы доказать, что поведение ворот соответствует поведению RTL, или они пытаются запустить инструменты проверки эквивалентности, чтобы математически доказать, что код RTL перед синтезом эквивалентен моделям ворот после синтеза. , так что гейт-симки не требуются.

Что касается вопроса о бонусе, это действительно сложно, потому что семантика Verilog довольно хорошо определена, даже если определение состоит в том, что это допустимое условие гонки.

Что касается четко определенного кода в моделировании и синтезе с разными результатами, рассмотрим:

module code1c (output reg o, input a, b);

  always
    o = a & b;
endmodule

В симуляции вы никогда не пройдете мимо времени-0. Моделирование будет повторяться бесконечно из-за отсутствия списка чувствительности. Инструменты синтеза даже не учитывают список чувствительности при выводе комбинационной логики, поэтому вы получите два входа и логический элемент и предупреждение об отсутствующих элементах списка чувствительности, которые могут вызвать несоответствие между симуляциями до и после синтеза. В Verilog-2001 мы добавили always @ *, чтобы избежать этой распространенной проблемы, а в SystemVerilog мы добавили always_comb, чтобы удалить список чувствительности и сообщить инструменту синтеза логику, заданную разработчиком.

Что касается того, должна ли статья предлагать гарантии правильного поведения синтеза, вероятно, не должна, но гарантии, описанные в моей статье, определяют, что инженер может ожидать от инструмента синтеза, основанного на опыте работы с несколькими инструментами синтеза.

«В заключение, в разделе, упомянутом в предыдущем абзаце, говорится, что блокирующие назначения могут использоваться для вычисления RHS неблокирующего назначения. Это, по-видимому, нарушает рекомендацию № 5 Каммингса».

Вы правы, это нарушает правило кодирования №5 и, на мой взгляд, не должно использоваться.

Рекомендация по кодированию №5 часто нарушается в проектах VHDL, потому что переменные VHDL не могут запускать другой процесс. Я считаю, что лагерь VHDL по этому вопросу разделен поровну. Половина говорит, что вы не должны использовать назначения переменных, а другая половина использует переменные для повышения производительности моделирования, но затем требуется смешать назначения переменных с окончательным назначением сигнала для запуска других процессов.

Если вы нарушите рекомендацию по кодированию № 5 и если ваш код верен, моделирование будет работать, и синтез также будет работать, но если у вас есть какие-либо ошибки в вашем коде, очень сложно отладить проекты, которые нарушают рекомендацию по кодированию № 5, потому что отображение формы волны для комбинационного фрагмента не имеет смысла. Выходные данные комбинационной логики в отображении формы сигнала обновляются только тогда, когда сброс не заявлен и на фронте тактового сигнала, что не соответствует поведению реального комбинационного оборудования, и это оказалось сложной проблемой при отладке этих конструкций с использованием дисплеев сигналов (I не включил эту информацию в статью).

С уважением - Клифф Каммингс - Verilog и SystemVerilog Guru

person Cliff Cummings    schedule 27.06.2012
comment
Большое спасибо за подробный ответ и за объяснение того, что случилось со стандартом .1. - person user1002059; 28.06.2012

Я считаю, что причина, по которой синтез будет происходить правильно, заключается в том, что в реальном кремнии нет разницы между «блокировкой» и «неблокированием».

Synthesis прочитает это и создаст три шлепанца, прикованных спиной к спине, как вы описали.

Это не будет проблемой при синтезе (при условии, что вы не нарушаете время удержания флопа), потому что у настоящих гейт есть задержки. По нарастающему фронту clk потребуется несколько нс для того, чтобы значение d перешло в q1. К тому времени, когда d переходит в q1, q1 уже будет семплирован на втором флопе, аналогично с q2 и q3.

Причина, по которой это не работает при моделировании, состоит в том, что нет задержек гейта. На положительном фронте тактового сигнала q1 будет немедленно заменен на d, возможно, до того, как q1 был выбран вторым флопом. В реальной схеме (с правильной настройкой и временем удержания) q1 гарантированно будет дискретизирован по положительному фронту тактового сигнала до того, как первый флоп сможет изменить свое выходное значение.

person Tim    schedule 26.06.2012
comment
Большое спасибо. Я счастлив согласиться с тем, что код часто синтезируется правильно. Но это не то же самое, что гарантия. Если бы это было гарантировано, я мог бы пожаловаться поставщику любого инструмента, который не синтезирует его правильно. Фактически, я мог бы кричать на них. Ваш жалкий инструмент делает то же самое, что и симулятор, я хочу немедленно вернуть полную стоимость. Теперь ясно, что с этим что-то не так. Но лучшая газета, кажется, говорит, что вот как обстоят дела ... - person user1002059; 26.06.2012

Я знаю, что этому 3 года, но ваш пост просто пометили, когда кто-то попытался его отредактировать. Ответ Клиффа, конечно, исчерпывающий, но на самом деле он не отвечает на ваш вопрос. Другой ответ также совершенно неверен.

Мой вопрос: как определяется правильность синтеза Verilog, если не на основании семантики моделирования?

Вы, конечно, правы. Синтез является «правильным» только в том случае, если (а) результат (выход) моделируется таким же образом, как и исходный (входной), после возможного учета некоторых проблем с синхронизацией и т. Д., И / или (б) выход синтезатора может быть формально оказался эквивалентен входу синтезатора.

предоставить простейшую возможную программу Verilog, которая имеет четко определенную семантику синтеза и не имеет четко определенной семантики моделирования

В принципе, этого быть не должно. Производители синтезаторов пытались определить шаблоны, основанные на коде с четко определенной семантикой моделирования. Однако Verilog был (и остается) плохо определенным, а NBA изначально не существовали в языке, поэтому у вас есть странности, такие как пример с конвейером. Лучше забыть о них.

Фактически, может ли кто-нибудь дать мне часть Verilog, которая хорошо определена как при моделировании, так и при синтезе, но при этом они дают разные результаты?

Единственное определение термина «хорошо определенный» (в отличие от «правильного») в синтезе - это то, что несколько поставщиков будут давать один и тот же неверный результат. Это маловероятно. Я думаю, классический async reset и async set clocked F / F был бы близок.

person EML    schedule 16.07.2015