为什么这会模拟延迟为 2 的连续分配,就像延迟为 3 一样

问题描述 投票:0回答:1

我有这个系统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

我的猜测是这与活动安排有关,但我对此非常不确定,因为我在这方面没有经验,而且我不想在理解上存在差距,因此非常欢迎任何帮助。

verilog system-verilog
1个回答
0
投票

这称为惯性延迟模型—左侧的变化速度不能比右侧的变化快。

基本上,连续分配一次只能有一个待处理的 LHS 计划更新。在某些情况下,新的计划更新会取消挂起的更新。

这在 [url=https://ieeexplore.ieee.org/document/8299595]IEEE 1800-2017 SystemVerilog LRM[/url] 中的10.3.3 连续分配延迟

节中定义

还有其他类型的延迟模型可供选择,使用各种不同的构造。

© www.soinside.com 2019 - 2024. All rights reserved.