Модуль является основным строительным блоком в языках SystemVerilog и Verilog, он может быть как отдельным элементом, так и совокупностью блоков более низкого уровня проектирования. Как правило, элементы сгруппированны в модули для того, чтобы обеспечить общую функциональность, которая позволяет использовать его повторно, на всем протяжении проекта. Модуль можно рассматривать как черный ящик, он обеспечивает необходимую функциональность для блоков более высокого уровня через имеющиеся входные и выходные порты, при этом скрывая внутреннюю структуру. Это позволяет конструктивно изменять внутренние элементы модуля, не затрагивая остальную часть проекта.

Рисунок 1 – Структура модуля на языке SystemVerilog

Как видно из рисунка 1, модуль на SystemVerilog объявляется с ключевым словом module, далее идет имя модуля (module_name), затем следует список параметров. Параметры в данном случае представляют собой список входных (inputs_ports) и выходных (outputs_ports) портов, с которыми модуль может взаимодействовать. При синтезе кода, эти параметры будут представлять из себя физические проводные соединения, которые соединяют созданные модуль с остальной частью схемы. Также, объявляется ширина портов с помощью конструкции [msb:lsb], где lsb – наименее значимый бит, а msb – самый значимый бит. Затем описывается сама программа и ключевое слово endmodule, которое свидетельствует об окончании модуля.

Рисунок 2 – Инвертор на языке SystemVerilog

Рисунок 3 – Симуляция модуля comblogic

На рисунке 2 представлен модуль, описывающий инвертор на языке SystemVerylog. Название модуля comblogic, входной порт: [2:0] t, представляющий из себя 2-х битную шину, выходной однобитный порт v, оператор непрерывного присваивания assign, описывающий комбинационную логику инвертора.

Рисунок 4 – Описание различных битовых операций языке SystemVerilog

Рисунок 5 – Симуляция модуля mainoper

На рисунке 4 представлен пример описания различных битовых операций. Модуль mainoper описывает такие битовые операции как AND, OR, XOR, NAND, NOR. В данном случае, &, | - являются примерами операторов, a, b – являются операндами, (a ^ b) – выражение. 

SystemVerilog и Verilog являются языками как структурного, так и поведенческого описания. Внутренние части каждого модуля могут быть определены на различных уровнях абстракции, в зависимости от потребности проекта. Модуль ведет себя одинаково со средой, независимо от уровня абстракции, на котором описан модуль. Внутренние части модуля скрыты от окружающей среды, что позволяет изменять сам модуль, без внесения изменений в окружающую среду. Существуют четыре так называемых уровней абстракции:

  • Поведенческий или алгоритмический (behavior) – это самый высокий уровень абстракции, представляемый в SystemVerilog и Verilog. Этот уровень реализуется с точки зрения желаемого алгоритма функционирования проекта, не затрагивая детали реализации оборудования.
  • Уровень передачи данных (dataflow) – описывает процесс изменения данных при их передаче между регистрами.
  • Вентильный уровень (gate-level) – уровень рассматривается с точки зрения логических элементов и соединений между ними.
  • Транзисторный уровень (switch-level) – это самый низкий уровень абстракции. Модуль рассматривает создание и соединение различных типов транзисторов.

SystemVerilog и Verilog позволяют одновременно использовать различные уровни абстракции в одном модуле.

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