当我写一些Verilog代码时,我发现了一些令人困惑的东西。
我定义了一条延迟为20ns的电线。该模块如下:
`timescale 1ns/1ns
module wireDelay(
input a_i,
output b_o
);
wire #20 w_tmp;
assign w_tmp = a_i;
assign b_o = w_tmp;
endmodule
在模拟过程中,我发现如果输入的电平不会比导线延迟停留一段时间,则在输出端不会观察到。
输入上面的波,而输出另一波。
我很奇怪它为什么会发生,现实世界中是否也是如此?
答案 0 :(得分:1)
wire c;
assign #5 c = a && b; //delay in the continuous assignment
wire #5 c = a && b; //delay in the implicit assignment
wire #5 c; //delay in the wire declaration
assign c = a && b;
为了证明延迟操作员的脉冲吞咽效果,请考虑以下情况。在上面的例子中,如果在时间10输入一个改变的值(并保持其值至少5个时间单位),那么输出c将在时间15改变值。如果输入a的值脉冲比传播时短延迟赋值然后a上的值不会传递给输出。
在现实世界中,组合逻辑有自己的传播延迟,因此可能会出现组合路径足够不能通过比其延迟更短的转换。见图,
你可以看到,如果发射翻转从1-0-1过渡到Off period = 5ns,但是组合路径的净延迟是10ns然后根据工作频率(当然< 10ns clk周期)它不会传递到捕获翻牌的Q.当顺序电路在那里时,时序到来。组合电路没有Clk,因此它可以根据其负载电容和CMOS的寄生元件(无论是哪个系列)以最大值工作。
答案 1 :(得分:1)
简而言之,请查看代码中“w_tmp”的声明。
wire #20 w_tmp;
该声明告诉编译器“w_tmp”是一个导线,它有20个时间单位的“惯性延迟”。 The pulse width less than inertial delay does not contain enough energy to switch output.
如果是“传输延迟”,您会在输出处观察到转换,因为“a_i”会改变它的状态。