寻找verilog 2001模块声明语法

时间:2011-02-06 21:18:43

标签: parsing syntax verilog

我可以在google上找到几个v2k完整的语法 - 但要么我失去了理智,要么就端口声明而言它们都以相同的方式被破坏了。 示例输入:

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

我想我可以查看icarus源码,或Perl :: Verilog。我希望得到一个确认,即上面的语法被破坏了 - 或者有人可以指出我错过了什么,如果没有。正确语法的来源会很棒......

1 个答案:

答案 0 :(得分:3)

您的第一个代码块使用list_of_port_declarations语法,该语法在IEEE 1364-2001(Sec 12.3.3)和所有更高版本中有效。第一个链接的语法不完整,第二个链接看起来像this construct

您的第二个代码块绝对有效。看起来像模块定义中的实例端口的语法是显式端口构造。不经常使用,当您想要在内部呈现与内部使用的信号接口不同的信号接口时,可以使用这些信号。以下是一些例子:

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相同。