下图显示了一个带有子模块的非常简单的电路 在本练习中,创建模块mod_a的一个实例,然后将模块的三个引脚(in1 in2和out)连接到顶级模块的三个端口(连接a b和out) mod_a模块是为你提供的-你必须实例化它。
在连接模块时,只有模块上的端口是重要的。您不需要知道模块内部的代码。模块mod_a的代码是这样的:
module mod_a ( input in1, input in2, output out );
// Module body
endmodule
模块的层次结构是通过在另一个模块中实例化一个模块来创建的,只要使用的所有模块都属于同一个项目(这样编译器就知道在哪里可以找到模块)。一个模块的代码没有写在另一个模块的主体中(不同模块的代码没有嵌套)。
您可以通过端口名称或端口位置将信号连接到模块。对于额外的练习,可以尝试这两种方法。
1、将信号连接到模块端口有两种常用的连接方法:
按位置或按名称。
通过位置将连接线连接到端口的语法应该很熟悉,因为它使用类似c的语法。
在实例化模块时,根据模块的声明从左到右连接端口。
例如:mod_a instance1 (wa, wb, wc);它实例化一个mod_a类型的模块,并给它一个实例名“instance1”,然后将信号wa(新模块外部)连接到新模块的第一个端口(in1),将wb连接到第二个端口(in2),将wc连接到第三个端口(out)。
这种语法的一个缺点是,如果模块的端口列表发生了更改,那么还需要找到并更改模块的所有实例以匹配新模块。
2、通过名称将信号连接到模块的端口允许连接保持正确连接,即使端口列表改变。
但是,这种语法更冗长。mod_a instance2 (.out(wc), .in1(wa), .in2(wb));上面的代码行实例化一个名为“instance2”的mod_a类型的模块,然后将信号wa(模块外部)连接到名为in1的端口,将wb连接到名为in2的端口,将wc连接到名为out的端口。
注意,这里端口的顺序是不相关的,因为无论它在子模块的端口列表中的位置如何,连接都将被建立到正确的名称。还要注意此语法中紧靠端口名称前面的句点。
module top_module ( input a, input b, output out );
mod_a in (
.out (out),
.in1 (a),
.in2 (b)
);
endmodule