#119. 模块例化

    ID: 119 Type: Default 1000ms 256MiB

模块例化

题目描述

通过前面一系列的练习,用户应当已经熟悉单个模块电路的设计了。对于功能上更复杂的电路模块,一般都是由若干子模块以及附加的功能电路构成的。 image

在模块实例化过程中,被例化模块的端口信号是最重要的,用户甚至可以不知道模块的内部结构。上图展示了一个非常简单的包含有子模块电路的电路结构,在此电路中,创建模块mod_a的一个实例化,并将该实例化模块的三个端口(in1,in2,out)与顶层电路的三个端口(a,b,out)直接连接,其中mod_a模块的代码如下:

module mod_a ( input in1, input in2, output out );
// Module body
assign out = in1 & in2; //这只是一个简单的示例
endmodule

模块实例化一般有两种语法格式,分别称为基于端口名称的实例化和基于端口位置的实例化。 基于位置的实例化和C语言中的函数调用类似(只是语法上类似,实际上该例化会产生实际的硬件电路),以上述mod_a模块的实例化为例,可以在上层模块中使用以下语句:

module top(input wa,input wb,output wc);
mod_a inst_name1(wa,wb,wc);
endmodule

其中inst_name1是mod_a模块的实例化名称,可以由用户自定义,通过这种例化方式,便实现了端口对应:wa↔in1, wb↔in2, wc↔out 。 基于端口名称的实例化如下所示

module top(input wa,input wb,output wc);
mod_a 	inst_name2(
.out		(wc),
.in1		(wa),
.in2		(wb));
endmodule

本教程推荐用户使用基于端口名称的例化方式,因为这种方式编写的代码可读性更强。 试创建一verilog电路,并按照上图中所示实例化mod_a模块(建议使用基于端口名称的方式实例化)。

Hint:

  • 推荐使用基于端口名称的实例化方式
  • 模块调用就像是一个树形的层次结构,不允许循环调用,如a调用b,b又调用a,也不允许模块调用自身,即模块c中又实例化模块c。
  • 不允许在进程块(如always、initial等)或赋值语句(如assign语句)内进行模块实例化
  • 模块的实例化名称可以自定义,如在同一模块中要对一个模块多次实例化,需要有不同的实例化名称。

输入格式

一位线网型变量a、b

输出格式

一位线网型变量out

示例代码

module top(
  input     a,
  input     b,
  output    out
);
  
// 请用户在下方编辑代码



//用户编辑到此为止
endmodule


module mod_a ( 
  input     in1, 
  input     in2, 
  output    out 
);
assign out = in1 & in2;
endmodule