首页 > 解决方案 > Verilog 和 VHDL 如何处理 (n+delta) 周期后的冲突分配?

问题描述

为了设置阶段,假设一个计算((a AND b)或c)的电路,输入a,b,c同时改变,例如取自时钟寄存器。与门的延迟可以忽略不计,因此根本没有建模,但或门的延迟很重要,比如 5ns。

门是通过在两个单独的过程中使用运算符和延迟分配来建模的:

Verilog:
    (process 1) temp <= a & b;
    (process 2) out <= #5 temp | c;

VHDL:
    (process 1) temp <= a and b;
    (process 2) out <= temp or c after 5ns;

现在有了正确的新旧输入值,就会出现故障:(a = 1, b = 1, c = 0) -> (a = 0, b = 1, c = 1)。这会导致温度值(与门的输出)在一个增量周期内变为 0,因此安排在 5ns 后将或门更改为 0。同时,c 变为 1 并将 OR 门“更改”为 1(当时它仍然为 1)。

现在有趣的部分:让输入在时间 0ns 发生变化。将 OR 门更改为 1 安排在时间 0ns,时间为 5ns。将 OR 门更改为 0 安排在时间 (0ns + 1delta),持续5ns 后。“太简单”的模型将时间安排为 5ns,并有可能以错误的顺序执行它们,从而使 OR 门的输出错误地为 0。

现在的问题是,Verilog 和 VHDL 如何确保故障得到正确解决?他们可以做到的事情我可以想象:

请注意,我试图理解两种语言规定的行为,而不是达到特定的结果。

标签: vhdlverilogvariable-assignmentcycle

解决方案


对于您显示的信号分配,Verilog 和 VHDL 都保证最后一次写入获胜。正如其他人所评论的那样,这将有助于显示语句的完整上下文以确认这是您的意图。

不会有毛刺,因为c从 0→1的转换发生temp从 1→0 的转换之前,由一个增量周期分隔。虽然您无法确定不同并发进程之间的顺序,但如果同一进程内存在确定性顺序,则最后写入同一变量获胜。


推荐阅读