Verilog: реализация с использованием примитивных модулей против побитовых операторов

В учебнике, который я читаю, реализованы 1-битные сумматоры с использованием встроенных примитивных модулей:

module yAdder1(z, cout, a, b, cin);
     output[0:0] z, cout;
     input[0:0] a, b, cin;
     wire[0:0] tmp, outL, outR;

     xor left_xor(tmp, a, b);
     xor right_xor(z, cin, tmp);
     and left_and(outL, a, b);
     and right_and(outR, tmp, cin);
     or my_or(cout, outR, outL);
endmodule

Но почему бы не использовать побитовые операторы? Кажется проще.

module yAdder1(z, cout, a, b, cin);
     output[0:0] z, cout;
     input[0:0] a, b, cin;

     assign z = (a ^ b) ^ cin;
     assign cout = (a & b) | ((a ^ b) & cin);
endmodule

Разве побитовые операторы неявно используют примитивные модули?

2 ответа

Решение

Встроенные примитивы - это удобный способ выразить ворота в моделях уровня ворот. Обычно они генерируются другими инструментами. Кроме этого нет особой причины использовать их в обычном verilog.

Вероятно, есть несколько из них, с которыми вы можете столкнуться, в основном различные буферные растворы, которые можно использовать для вождения автобусов. Но все остальные не так часто используются.

И нет, они не используются неявно в симуляции.

Это просто другой стиль написания verilog. Первый в структурном формате, а второй больше в поведенческом / функциональном формате.

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

Другие вопросы по тегам