【发布时间】:2019-09-01 23:13:15
【问题描述】:
always@(a)
begin
#1 t<=a;
#1 c<=t;
end
我正在用下面给出的测试台分析上面的verilog代码
a=0;
#5 a=1;
#5 a=0;
#5 a=1;
#5;
这是我的分析: 从上面的测试台我可以看出'a'是一个总长度为20ns的时钟信号,OFF和ON时间分别为5ns。在第0 ns,'a'从X变为0。所以总是块被触发。因为块内的第一条语句有 1ns 的内部延迟,它等待 1ns。在 1ns 编译器知道它是非阻塞语句之后,所以只会进行评估而不是赋值。因此“a”值将被存储为临时并并行执行第二个语句。因为第二个也有内部延迟,它等待 1ns .然后评估完成。由于两个评估都完成了,现在将进行分配。
time a t c
0ns 0 x x
1ns 0 x x
2ns 0 x x
3ns 0 0 x
4ns 0 0 x
这个分析正确吗?
【问题讨论】:
-
“与实际输出相比,我的分析是错误的” 在这种情况下,我建议您先告诉我们您的分析是什么。在那之前,我们无法告诉你哪里出了问题。
-
(x) 在此代码中,假设“a”最初从 x 更改为 0。所以总是会触发块。在执行第一条语句时编译器会知道它是非阻塞语句,因此“a”的值被分配了临时变量但尚未分配给“t”。因为它是非阻塞的,所以它并行执行第二个语句。但是第二个语句有 1ns 的内部延迟,所以在 1ns 之后它执行。也就是说,'t' 被评估。所以仅在这两个评估之后,'t'和'a'的最终分配将发生。我的分析在这里吗?
-
请将您的文字添加到问题中(使用下方的“编辑”按钮)您意识到将
t排除在敏感列表之外是不正常的吗? -
我完全重写了问题
标签: verilog