Verilog语言之模块层级:模块的实例化

1.例化语法

一个模块能够在另外一个模块中被引用, 这样就建立了描述的层次。模块实例化语句形式如下:
module_name instance_name(port_associations) ;

连接信号到模块端口

有两种常用的方法将信号连接到端口上:位置和名称。

位置

通过位置将信号连到端口上的语法应该比较熟悉,因为这是类c语言的语法。当实例化一个模块时,根据这个模块声明时的端口顺序从左到右写下来。举个例子:

mod_a instance1 ( wa, wb, wc );

这实例化了一个模块mod_a并且起了一个实例名instance1。这种语法有一个缺点,如果模块端口列表发生改变,所有这个模块的实例也必须被找到并且改成和新的相匹配。

名称

通过名称将信号连接到模块的端口,即使端口列表发生更改,也可以保持正确连接。但是这个语法更冗长。

mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) );

注意端口的顺序在这里是不相关的,无论它在子模块的端口列表中的位置如何,都将连接到正确的名称。还请注意此语法中紧靠端口名称前面的英文句号“.”。查看更多https://hdlbits.01xz.net/wiki/Module

根据名称连接是最常用也是最方便的,在给实例起名时推荐用原端口名_u0,多次调用数字增长。例如:

mod_a mod_a_u0 ( .out(wc), .in1(wa), .in2(wb) );

mod_a mod_a_u1 ( .out(wc), .in1(wa), .in2(wb) );etc

良好的代码书写风格给阅读和重用都有极大的方便。

 

2. 悬空端口的处理

在我们的实例化中,可能有些管脚没用到,可在映射中采用空白处理,如:

DFF d1 (
.Q(QS),
.Qbar ( ),
.Data (D ) ,
.Preset ( ), // 该管脚悬空
.Clock (CK)
);
对输入管脚悬空的, 则该管脚输入为高阻 Z, 输出管脚被悬空的, 该输出管脚废弃不用。查看更多https://hdlbits.01xz.net/wiki/Module_add

 

3. 不同端口长度的处理


当端口和局部端口表达式的长度不同时, 端口通过无符号数的右对齐即就是在多余的高位补0,或者是截断高位进行匹配。

例如:
module Child (Pba, Ppy) ;
input [5:0] Pba;
output [2:0] Ppy;
. . .
endmodule
module Top;
wire [1:2] Bdl;
wire [2:6] Mpr;
Child C1 (Bdl, Mpr) ;
endmodule

上面的mpr被连接到端口后只使用三位mpr[2:4]。

你可能感兴趣的:(HDLBits)