2

我可以用 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。不过,我希望能确认上面的语法被破坏了——或者有人可以指出我错过了什么。正确语法的来源会很棒......

4

1 回答 1

3

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

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

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

于 2011-02-07T07:32:04.373 回答