Verilog HDL程序是由模块构成的。
模块可以进行嵌套,从而将大型数字电路分割成不同小模块的设计。如果每个模块都可综合,则可以通过综合工具转化为逻辑单元描述,最后整合成一个很大的逻辑系统。
模块分为两种类型,一种用来生成电路结构,一种用来测试电路的逻辑功能。
每个模块都由module和endmodule两个语句及其间内容定义,要进行端口定义,并说明输入、输出口,描述模块功能。
Verilog用于电路描述
第一层:算法级
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级的行为描述的中间形式,自动转化为第三层门级的电路描述。
Verilog用于电路测试(信号描述)
描述测试信号的变化和测试过程的模块,也叫测试平台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
博客介绍了Verilog HDL程序由模块构成,模块可嵌套,分为生成电路结构和测试逻辑功能两种类型。阐述了Verilog用于电路描述的三个层级及综合过程,还说明了其用于电路测试的作用,即通过测试平台对电路模块进行动态测试。
2621

被折叠的 条评论
为什么被折叠?



