Verilog HDL程序是由模块构成的。
模块可以进行嵌套,从而将大型数字电路分割成不同小模块的设计。如果每个模块都可综合,则可以通过综合工具转化为逻辑单元描述,最后整合成一个很大的逻辑系统。
模块分为两种类型,一种用来生成电路结构,一种用来测试电路的逻辑功能。
每个模块都由module和endmodule两个语句及其间内容定义,要进行端口定义,并说明输入、输出口,描述模块功能。
第一层:算法级
module muxtwo(out, a, b, sl); input a,b,sl output out reg out; always @(sl or a or b) if(! sl) out = a; else out = b endmodule
第二层:RTL级
module muxtwo(out, a, b, sl); input a, b, sl; output out; wire nsl, sela, selb; assign nsl = ~sl; assign sela = a&nsl; assign selb = b&.sl;//.sl代表引用端口 assign out = sela|selb endmodule
(前两层均属于行为描述)
第三层:门级
module muxtwo(out, a, b sl); input a,b,sl; output out; not u1(nsl, sl); sela #1 u2(sela, a, nsl); //#1代表延迟1个单位时间 selb #1 u3(selb, b, sl); or #1 u4(out, sela, selb); endmodule
综合的过程,就是把第一层的算法级的行为描述,经过第二层RTL级的行为描述的中间形式,自动转化为第三层门级的电路描述。
描述测试信号的变化和测试过程的模块,也叫测试平台testbench,用于对上述的电路模块进行动态的全方位测试(行为/结构),从而进行调试或验证。
下面是一个例子:
include "muxtwo.v" //子模块包含 module t; /*端口定义*/ reg ain, bin, select; reg clock; wire outw; /*寄存器初始化*/ initial begin ain = 0; bin = 0; select = 0; clock = 0; end /*定义测试信号*/ always #50 clock = ~clock;//set clock always @(posedge clock) begin #1 ain = {$random}%2;//create random data stream #3 bin = {$random}%2; end always #10000 select = !select;//stop working by disable sl /*引用模块,创建实例进行测试*/ muxtwo m(.out(outw), .a(ain), .b(bin), .sl(select)); endmodule