在编写各种语言时,正确良好的注释是必不可少的,一般我们最少要保证3:1的代码注释比例,即3句代码至少一个注释。Verilog有两种注释方式:
单行注释:以 // 开头
多行注释:以 /* 开始,以 */ 结束
一、Verilog调用模块
Verilog的基本设计单元是“模块”。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能。每个Verilog程序包括4个主要的部分:端口定义、IO说明、内部信号声明、功能定义。
例如下面的代码:
module yuanlaishini(a,b,c,d);
input a,b;
output c,d;
reg [23:0] counter;
assign c = a | b;
assign d = a & b;
endmodule
每个模块都是以module开始,endmodule结束。yuanlaishini为模块名,在实际中我们应该起一个比较“正经”的名字,最好是能体现模块功能的名字。上述例子中(a,b,c,d)即为端口定义,描述了本模块都有哪些端口,input a,b;与output c,d; 即为IO说明,reg [23:0] counter为内部信号声明;assign在前面已介绍过,它是一种给wire类型赋值的,assign这两句即为功能定义。
功能定义有三种方法:assign语句是来描述组合逻辑;always语句是来描述组合/时序逻辑;例化实例元件(如:and #2 u1(q,a,b);)
上述三种逻辑功能是并行的,这也是FPGA最重要的一个特点,在C语言中,谁在前面谁先执行,但在verilog中无论多个always或assign如何放置,他们都是并行同时执行的。在always块中,逻辑是顺序执行的,而多个always块之间是并行的。
那么不同模块之间如何调用呢?
我们考虑一个简单的全加器模块:
module add(a,b,cin,s,cout);
input a,b,cin;
output cout,s;
assign {cout,s} = a + b + cin;
endmo