我正在尝试在modelsim中使用门延迟来建模一个完整的加法器。为简单起见,这是一个自包含的简单测试平台:
module simple_delay;
reg x, y, cin;
wire a,b,c, s, cout;
// simple structural full adder
xor #1 XO1(a, x, y);
and #1 A1 (b, x, y);
xor #1 XO2(s, cin, a);
and #1 A2 (c, cin, a);
or #1 O1 (cout, c, b);
initial
begin
x= 1'b1; y = 1'b1; cin = 1'b0;
#10 $stop;
end
endmodule
我希望输出a和b在一个延迟单位后可用,输出c
和s在一个延迟之后(总计2),最后在cout
在一个延迟之后(总计3)。相反,cout
在2个延迟后也有效。
这是由于短路布尔评估引起的吗?由于b
在一个延迟后变为1,因此cout
将为1,而与仍未知(x)的c
的值无关。这是模拟器的工作方式吗?如果是这样,我该如何禁用它(我在文档中没有找到任何相关内容,并且禁用优化无法解决该问题)。
我是否可以强迫modelsim不聪明,并实际上将cout
的计算延迟一个单位?
c
在时间1将为零,因为cin
为低;使用“与”门时,如果任何输入为低,则其他输入无关,输出为低。因此,b
和c
在时间1都将具有已知值。因此cout
在时间2时将具有正确的值。
最坏情况下的延迟是3,当cin
为高且a&b==0
时观察到。所有其他输入条件的延迟为2。
这不是ModelSim是“智能”的,它是仅在部分输入“已知”的情况下,模拟门足够智能来计算输出。别忘了,它“对您来说是未知的,但实际上是0
或1
,并且门会在一段时间之前与“已知”输入一起“看到”它,然后进行计算。在实际的硬件中会发生什么。
这就是模拟器的工作方式,如IEEE Std 1800-2012的表28-3“用于多个输入逻辑门的真值表”中所述。如果or
门的任何输入为1,则输出为1。