面向验证和仿真的行为描述语句:
1、延时控制语句
(1)语法格式:#<延迟时间> 行为语句 OR #<延迟时间>
其中“#”是延时控制的关键字符,“<延迟时间>”以多个仿真时间单位的形式给出。
使用编译指令将时间单位与物理时间相关联,编译指令需要在模块描述前定义:timescale 1ns /100ps(延迟时间为1ns,时间精度为0.1ns)
(2)实际的仿真中,延时控制语句可以出现在任何赋值语句中,主要有三类:
#<延迟时间常量> 行为语句
仿真进程遇到这条语句后,并不会立即执行行为语句制定的操作,而是要等到<延迟时间值>所指定的时间过去后,才开始执行行为语句的操作。比如:
'timescale 1ns /1ps
module delay_demo1(q0_out,q1_out,q2_out);
output [7:0] q0_out,q1_out,q2_out;
reg [7:0] q0_out,q1_out,q2_out;
initial
begin
q0_out=0;
//循环体
repeat(100)
begin
#5 q0_out=1;//延迟语句1
#5 q0_out=2;//延迟语句2
end
end
initial
fork
//循环体2
repeat(100)
begin
# 5 q1_out=3;//延迟语句3
# 5 q1_out=4;//延迟语句4
end
//循环体3
repeat(100)
begin
# 5 q2_out=5;//延迟语句5
# 5 q2_out=6;//延迟语句6
end
join
endmodule
注:三个循环体同时并行执行。
#<延迟时间常量> 行为语句
仿真进程遇到该语句后,也不进行任何操作,而是进入等待状态,等过了延迟时间后,再继续执行后续语句。并行fork…join语句块和串行begin…end语句块进入仿真等待状态的影响是不同的,因此各自产生的作用也不同。比如:
'timescale 1ns/1ps
module delay_demo2(q0_out,q1_out);
output [7:0] q0_out,q1_out;
reg [7:0] q0_out,q1_out;
initial
begin
q0_out=0;
#100 q0_out=1;
#100;
#100 q0_out=10;
#300 q0_out=20;
end
initial
fork
q1_out=0;
#100 q1_out=1;
#100;
#200 q1_out=10;
#300 q1_out=20;
join
endmodule
注:注意串/并行执行的区别。
#<延迟表达式> 行为语句
延迟时间是一个变量或者表达式,极大地增强了仿真程序的可移植性。如果对应的值出现负值或者“x”、“z”等,将其按照0来处理。比如:
'timescale 1ns/1ps
module delay_demo3(q0_out,q1_out);
output [7:0] q0_out,q1_out;
reg [7:0] q0_out,q1_out;
parameter delay_time=100;
initial
begin
q0_out=0;
#delay_time q0_out=1;
#(delay_time/2);
#(delay_time*2) q0_out=10;
#300 q0_out=20;
end
initial
begin
q1_out=0;
#100;
#(delay_time-5'bxxxxx) q1_out=1;
#100;
#100 q1_out=10;
#50;
#(delay_time-200) q1_out=20;
end
endmodule
注:仿真验证通过ModelSim仿真工具。