我有这个系统verilog代码,它对一些带有延迟的简单操作进行连续分配,以及一个带有时钟的简单测试平台。
`timescale 1ns/1ps
module delays(input logic a, b);
logic bb, n1, n2;
assign #1ns bb = ~b;
assign #2ns n1 = bb;
assign #2ns n2 = a & bb;
endmodule
module tb_delays ();
reg a, b;
delays mod(.a(a), .b(b));
initial begin
a <= 0;
b <= 0;
end
always #4ns b <= ~b;
always #2ns a <= ~a;
endmodule
我正在 ModelSim - INTEL FPGA 入门版 10.5b 中运行此程序,我得到以下结果:
我得到了
1ns
的预期延迟 bb
以及 2ns
的预期延迟 n1
,但由于某种原因 n2
仅在 x
之后才将其 1
状态更改为 3ns
在知道 bb
的值后,而不是 2ns
。
有趣的是,如果我摆脱
bb
并有 2ns
延迟,那么一切都会按预期进行
module delays(input logic a, b);
logic n1, n2;
assign #2ns n1 = ~b;
assign #2ns n2 = a & (~b);
endmodule
如果我尝试在整个模块中保持相同的持续时间,那么
n2
永远不会脱离x
状态。
module delays(input logic a, b);
logic n1, n2;
assign #3ns n1 = ~b;
assign #3ns n2 = a & (~b);
endmodule
所有这些行为对我来说似乎都很奇怪,我无法理解这是否确实是预期的,或者是 ModelSim 的错误。但无论哪种方式,我怀疑它与时钟的持续时间有关,并且它接近模块模拟的持续时间,因为如果我将时钟设置得更慢,那么一切都会开始正常工作。
`timescale 1ns/1ps
module delays(input logic a, b);
logic bb, n1, n2;
assign #1ns bb = ~b;
assign #2ns n1 = bb;
assign #2ns n2 = a & bb;
endmodule
module tb_delays ();
reg a, b;
delays mod(.a(a), .b(b));
initial begin
a <= 0;
b <= 0;
end
always #8ns b <= ~b;
always #4ns a <= ~a;
endmodule
我的猜测是这与活动安排有关,但我对此非常不确定,因为我在这方面没有经验,而且我不想在理解上存在差距,因此非常欢迎任何帮助。
这称为惯性延迟模型—左侧的变化速度不能比右侧的变化快。
基本上,连续分配一次只能有一个待处理的 LHS 计划更新。在某些情况下,新的计划更新会取消挂起的更新。
这在 [url=https://ieeexplore.ieee.org/document/8299595]IEEE 1800-2017 SystemVerilog LRM[/url] 中的10.3.3 连续分配延迟
节中定义还有其他类型的延迟模型可供选择,使用各种不同的构造。