本文为日常随记,刚开始接触verilog语言,很多不清楚,仅作为日常记录查阅使用。
1.verilog设计的基本单元——module
module是verilog语言中最基本的一个模块单元,一个module应该具有哪些要素呢?首先对于一个module,我们应该设计好其各个I/O,以及每个I/O的性质,用于与模块外部的信号相联系,让用户知道如何连线。其次,需要对模块内部进行设计,包括变量声明,语句、代码块功能实现等。综上所述,我们可以把一个module分成以下五个部分:
(1)模块名
(2)端口定义
(3)I/O说明
(4)内部信号的声明
(5)模块功能实现
/
//module 模块名 (端口1,端口2,端口3);
//I/O说明
//内部信号说明
//模块功能实现
//endmodule
//module 模块名 (端口1,端口2,端口3);
module FreDevider (
Clock,
rst,
Clkout
);
//I/O说明
input Clock;
input rst;
output Clkout;
//内部信号说明
reg Clkout;
//模块功能实现
always@(posedge Clock or posedge rst)
begin
if(rst)
Clkout<=0;
else
Clkout<=~Clkout;
end
//endmodule
endmodule
当我们已经写好了一种类型的module,在使用的时候就可以直接调用module。使用方法是 模块名+实例名+端口声明+信号声明,一个模块可以定义多个实例。
//已经定义过一个叫FreDevider的module
FreDevider uut1( //模块名:FreDevider 实例名:uut1
.Clock(clock_signal), // 端口声明: .端口名 信号声明: (信号名)
.rst(rst_signal),
.Clkout(clkout_signal)
);
附录
(1)parameter是常量的声明,声明后可替代模块中相同的常量,一般用在常量较多的模块中,方便修改。
parameter MAX = 10;
x = MAX;
y = MAX;
z = MAX;
(2)`define作用于整个工程,而parameter只作用于本模块,一旦define指令被编译,则在整个编译过程中都有效,所以仿真时使用define相对于parameter重声明占用更少的内存