Ищем Verilog 2001 модуль объявления грамматики - PullRequest
2 голосов
/ 07 февраля 2011

Я могу найти несколько полных грамматик v2k в Google - но я либо схожу с ума, либо они все ломаются одинаково в отношении объявлений портов. Пример ввода:

module foo ( 
    input x, 
     output [2:0] y);
endmodule;

Я не могу найти грамматику, которая будет анализировать этот синтаксис, но они примут такие вещи в качестве «порта» в list_of_port:

         { name[3:0], name2[2:0]} 
.. or ..   .name( othername )

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

Примеры

http://www.externsoft.ch/download/verilog.html#module_declaration

http://www.syncad.com/VeriLogger_bnf_Syntax_Verilog_2001.htm#list_of_ports

Полагаю, я могу заглянуть в источник на икаре или Perl :: Verilog. Я надеюсь получить подтверждение того, что вышеприведенные грамматики нарушены - или кто-то может указать, что мне не хватает, если нет. Источником правильной грамматики было бы здорово ...

1 Ответ

3 голосов
/ 07 февраля 2011

Ваш первый блок кода использует синтаксис list_of_port_declarations, который действителен в IEEE 1364-2001 (Раздел 12.3.3) и во всех последующих версиях. Грамматика из первой ссылки неполная, вторая ссылка выглядит так, как будто она включает эту конструкцию

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

module mod1(portA);
input portA; //Implicit port named portA connected to implicit wire portA
endmodule

Здесь portA является неявным и наследует атрибуты из входного объявления, поскольку у него один и тот же идентификатор portA.

module mod2(.expA(sigA));
wire sigA;
endmodule

module top;
wire sigB;
mod2 modInst(.expA(sigB));
endmodule

В этом примере мы используем явный порт для модуля mod2. Внутренне expA подключен к sigA, но, как вы видите в экземпляре modInst, мы используем внешнее имя для именованных соединений.

module mod3 (.expA({sigC,sigD}), sigF, .expB(sigG[1],sigB[3:0]));
output reg [3:0] sigC, sigD;
input wire [1:0] sigG;
input wire [7:0] sigB;
output wire sigF;
endmodule

Это также верно. Порт expA предполагает ширину конкатенации sigC и sigD. То же самое с портом expB.

...