стиль кодирования Verilog для синтезируемого кода - PullRequest
0 голосов
/ 01 сентября 2018

Я кодировал что-то вроде следующего:

always @(state or i1 or i2 or i3 or i4) begin
next = 5'bx;
err = 0; n_o1 = 1;
o2 = 0; o3 = 0; o4 = 0;
case (state) // synopsys full_case parallel_case
IDLE: begin
if (!i1) next = IDLE;
else if ( i2) next = S1;
else if ( i3) next = S2;
else next = ERROR;
end
S1: begin
if (!i2) next = S1;
else if ( i3) next = S2;
else if ( i4) next = S3;
else next = ERROR;**strong text**
...

Мой менеджер, конечно, я не хочу спорить с ним, прежде чем у меня будут веские аргументы, но он пересмотрел мой код и сказал: "1004 *

next = 5'bx;
err = 0; n_o1 = 1;
o2 = 0; o3 = 0; o4 = 0;

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

Мне интересно, что-то не так с этим стилем кодирования? И вызовет ли это проблему синтеза или какую-либо проблему (может быть, какая-то версия или старый инструмент синтеза не будет синтезировать?), Инициализируя эти значения в комбинационной логике? То, что он сказал, имеет смысл для меня, и я на самом деле никогда не думал об этом, потому что он сказал, что это программная логика, и каждый провод получает свое начальное значение из логики перед этим с начальным условием. Я сказал ему, что школа научила нас этому, он был как школа, которая меньше заботится о синтезе, чем индустрия.

Спасибо за вашу помощь! Думаю, я не пытаюсь убедить его в чем-либо, даже если у меня есть ответ, так как команде все равно нужно придерживаться одного стиля, но он меня смущает, так как я видел, как другие делают это все время, и он также парень с тоннами опыта, так что ... запутался

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я думаю, что ваш босс подразумевает под «программной логикой», что ваш стиль кодирования требует, чтобы дизайнер думал последовательно. Другими словами, когда я читаю ваш блок always, я сначала должен подумать обо всех значениях, инициализируемых до их значений по умолчанию, а затем я должен оценить логику регистра. В действительности логика будет синтезироваться в эквиваленте default случая. Это вызывает несоответствие между логикой, которая представляет RTL, и логикой того, как я оцениваю ваше выражение в уме. Если вы знаете, что делаете, то это будет нормально большую часть времени . Но вы работаете в компании, поэтому ваш код должен учитывать других инженеров, работающих над проектом. Каждая отдельная команда в процессе проектирования будет рассматривать одну и ту же логику через потенциально разные объективы (например, физическая команда разработчиков не занимается Verilog, а синтезирует RTL). Если мы напишем наш Verilog, чтобы отразить окончательный RTL (т. Е. «Аппаратная логика»), то каждый анализирует логику подобным образом. Если я смотрю на выход в цепи и знаю все значения входов на заданном временном шаге, то я могу визуально проследить выход через схему и определить его значение, не обращая внимания на другую логику. Ваш код Verilog должен быть написан таким же образом.

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

Кроме того, как вырастил @ dave_59, если вы используете директиву full_case Synopsis, то она создаст для вас драйверы вывода по умолчанию, где для выходов установлено значение "все равно". Это не тот результат, которого хочет кто-либо, и он будет отмечен командой проверки. Чтобы это исправить, вам нужно убедиться, что каждому выходу назначается, добавив их во все случаи, как упомянул ваш начальник. Если вы все равно вынуждены это сделать, то full_case является избыточным, потому что вы явно сделали заявление case полным. Что касается более старых инструментов синтеза, я не считаю, что это является большой проблемой для этого конкретного предмета, но это соображение, которое всегда дается в промышленности. Проблема может возникнуть в том случае, если ваша компания настроила нижестоящие инструменты для принудительного использования старых конструкций в целях сокращения затрат на проверку.

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

0 голосов
/ 01 сентября 2018

Прежде всего, вы должны использовать always @(*) из Verilog-2001 или даже лучше always_comb из SystemVerilog, чтобы список чувствительности был создан автоматически для вас.

Проблема с вашим кодом заключается в использовании прагмы синтеза full case, как описано в этой статье . Ваш стиль кодирования устраняет необходимость в полном регистре, если вы уверены, что вы сделали присваивания каждой переменной в блоке always для всех возможных потоков через блок.

...