HDLBits (20) — 模块
本题链接:
https://hdlbits.01xz.net/wiki/Module
到目前为止,您已经熟悉了 module,它是一个通过输入和输出端口与其外部交互的电路。 更大、更复杂的电路是通过将更小的模块和一些连接在一起的其他部分(例如 assign 语句和 always 块)组成构建的更大的模块。因为模块可以包含其他模块的实例,所以形成了一个层次结构。
下图显示了一个带有子模块的非常简单的电路。 在本练习中,创建模块 mod_a 的一个实例,然后将模块的三个引脚(in1、in2 和 out)连接到顶层模块的三个端口(线网 a、b 和 out)。 模块 mod_a 是我们为您提供的——而您需要将实它例化。
在连接模块时,对您而言只有模块上的端口是重要的。 您不需要知道模块内的代码。 模块 mod_a 的代码如下所示:

只要使用的所有模块在属于同一个项目中(编译器凭借这个知道在哪里可以找到该模块),那么模块的层次结构就可以通过在另一个模块中实例化一个模块创建。 一个模块的代码没有写在另一个模块的主体中(不同模块的代码没有嵌套)。
您可以通过端口名称或端口位置将信号连接到模块。 如需额外练习,请尝试使用两种方法。


题目
将信号连接到模块端口
有两种常用的方法将电线连接到端口:分别是按位置和按名称。
按位置
按位置将电线连接到端口的语法我们应该很熟悉,因为它使用类似 C 的语法。实例化模块时,端口根据模块的声明从左到右连接。例如:
mod_a instance1 ( wa, wb, wc );
这会实例化一个 mod_a 类型的模块,并给它一个实例名称“instance1”,然后将信号 wa(在新模块外部)连接到新模块的第一个端口(in1),将 wb 连接到第二个端口(in2),然后wc 到第三个端口(出)。这种语法的一个缺点是,如果模块的端口列表发生更改,那么就还需要找到并更改模块的所有实例以匹配新模块。
按名称
按名称将信号连接到模块的端口可以使电线保持正确连接,即使端口列表发生更改。然而,这种语法更加冗长。
mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) );
上面的行实例化了一个名为“instance2”的 mod_a 类型的模块,然后将信号 wa(模块外部)连接到名为 in1 的端口,将 wb 连接到名为 in2 的端口,将 wc 连接到名为 out 的端口。请注意这里的端口顺序是无所谓的,因为无论其在子模块端口列表中的位置如何,都将使用正确的名称进行连接。此外还要注意此语法中端口名称之前的点。
预期的解决方案长度:大约 1 行。

答案

输出波形


模块是 Verilog 中基本单元的定义形式,是与外界交互的接口。
模块格式定义如下:
模块定义必须以关键字 module 开始,以关键字 endmodule 结束。
模块名,端口信号,端口声明和可选的参数声明等,出现在设计使用的 Verilog 语句(图中 Declarations_and_Statements)之前。
模块内部有可选的 5 部分组成,分别是变量声明,数据流语句,行为级语句,低层模块例化及任务和函数,如下图表示。这 5 部分出现顺序、出现位置都是任意的。但是,各种变量都应在使用之前声明。变量具体声明的位置不要求,但必须保证在使用之前的位置。

参考内容:
5.1 Verilog 模块与端口 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog-module-port.html