module 模块名(端口名1,端口名2,…);
端口类型说明(input,output,inout);
参数定义(可选);
数据类型定义(wire,reg等);
……………………………说明部分…………………………………
实例引用低次层模块和基本门级元件;
连续赋值语句(assign);
过程块结构(initial和always)
行为描述语句;
任务和函数;
endmodule
……………………逻辑功能描述部分,顺序任意………………………
inout:双向端口
凡是在模块名后面圆括号中出现的端口名都必须明确地说明其端口类型
寄存器类型reg 连线类型wire
结构风格或者门级的描述方式——2选1数据选择器
module Mux2tol_structural(a, b, sel, out); //1995年版本
input a, b, sel; //输入端口声明
output out; //输出端口声明
wire nsel, a1, b1; //内部节点声明
//电路逻辑功能描述
not U1(nsel, sel); //调用名U1可省略;调用名(输出端口,输入端口1,输入端口2,…)
and U2(b1, b, nsel);
and U3(a1, a, sel);
or U4(out, a1, b1);
endmodule //无分号
修订后的Verilog HDL标准中,定义模块端口可写成:
module Mux2tol_structural(
input a, b, sel, //输入端口声明,后面是逗号
output out //输出端口声明,无逗号
);
数据流风格描述方式
module Mux2tol_dataflow(a, b, sel, out);
input a, b, sel; //输入端口声明
output out; //输出端口声明
wire out; //变量数据类型声明
//电路功能能描述。变量out的数据类型必须是wire型
assign out = (~sel & b) | (sel & a); //或out = sel?a:b;
endmodule
assign是关键词,是对变量赋值的意思
连续赋值语句的特点:方程式右边的输入变量受到持续监控,任何一个变量发生变化,整个表达式将被重新计算,并将变化值赋给左边的线网变量。
行为风格的描述方式
module Mux2tol_bh1(a, b, sel, out);
input a, b, sel; //输入端口声明
output out; //输出端口声明
reg out; //变量数据类型声明
//电路功能能描述
always @(sel or a or b) //无分号
if(sel == 1)
out = a;
else out = b;
endmodule
//或
module Mux2tol_bh1(a, b, sel, out);
input a, b, sel; //输入端口声明
output out; //输出端口声明
reg out; //变量数据类型声明
//电路功能能描述
always @(sel or a or b) //无分号,修订后的Verilog HDL:always@(sel, a, b) / always@(*)
case(sel)
1’b0:out = b;
1’b1:out = a;
endcase
endmodule
行为描述的标识是always语句,always是循环执行语句,后面跟着条件@(敏感变量) 即括号中的任一输入变量发生变化时,后面的过程赋值语句就会被执行一次,执行完最后一条语句后,执行挂起。
always内部被赋值的变量都要声明为reg类型
激励模块通常是顶层模块
以module开始和endmodule语句作为结尾的,内部包括模块名、线网/寄存器/变量声明、低层次模块的实例引用和行为语句块(initial 或 always),不需要端口列表和端口声明。
激励信号:reg以便保持激励值不变,直至执行到下一条激励语句为止
输出信号:wire以便能随时跟踪激励信号的变化
$monitor:将信息以指定的格式输出到屏幕上
$time:将返回当前的仿真时间
$stop:停止仿真但不退出仿真环境