时延赋值
疑问: 网页Verilog时延一章,有关assign #20 so_lose = ai & bi
到底是先延时20个时间单位再采样还是先采样再时延20个时间单位。做了以下的实验
1、原代码
- time_delay_module模型
module time_delay_module(
input ai, bi,
output so_lose, so_get, so_normal);
assign #20 so_lose = ai & bi ;
assign #5 so_get = ai & bi ;
assign so_normal = ai & bi ;
endmodule
- testbench
`timescale 1ns/1ns
module test ;
reg ai, bi ;
wire so_lose, so_get, so_normal ;
initial begin
ai = 0 ;
#25 ; ai = 1 ;
#35 ; ai = 0 ; //60ns
#40 ; ai = 1 ; //100ns
#10 ; ai = 0 ; //110ns
end
initial begin
bi = 1 ;
#70 ; bi = 0 ;
#20 ; bi = 1 ;
end
time_delay_module u_wire_delay(
.ai (ai),
.bi (bi),
.so_lose (so_lose),
.so_get (so_get),
.so_normal (so_normal));
initial begin
forever begin
#100;
//$display("---gyc---%d", $time);
if ($time >= 1000) begin
$finish ;
end
end
end
endmodule
把这个的代码的波形加载后观看
由于延后时的ai和bi的电平值相同,因此无法判断是先采样后延时赋值还是先延时后采样赋值,因此需要对原代码进行修改。
2、修改
将test模型的第一个initial
的时间稍做修改,其余的保持不变,结果如下,即把第一个25个时间单位的时延改成3
initial begin
ai = 0;
#3 ai = 1;
#35 ai = 0;
#40 ai = 1;
#10 ai = 0;
end
下载波形查看
由波形可以看出
- so_normal是没有时延的直接赋值,因此为ai&bi,结果为低电平。
- so_lose和so_get分别时延20和5个时间单位,但是刚开始的ai低平时钟只有3个单位,因此被忽略了,当ai到第3个时间单位时才重新计时。此时还是无法分清楚到底先采样后延时赋值还是先延时后采样赋值。
3.再修改
代码继续做如下改动,即将刚刚修改的3个延时的时间单位改成5
initial begin
ai = 0;
#5 ai = 1;
#35 ai = 0;
#40 ai = 1;
#10 ai = 0;
end
再拉取波形如下
- 这次
so_get
在5个单位前后拥有不同的电平值,可以很清楚的看到:ai的第5个单位是高电平而开始是低电平,so_get第5个单位是低电平,因此是先执行ai&bi
为低电平,然后时延5个单位再赋值给so_get - 因此结论正如原文中所说
先采样,后延时赋值
.