【发布时间】:2021-11-13 10:14:15
【问题描述】:
为了设置阶段,假设一个计算((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 如何确保故障得到正确解决?他们可以做到我能想象到的事情:
- 允许调度 (N 个周期 + D 个增量周期),因此 OR 门更改为 1 被调度 (5ns + 1delta) 并保证 最后执行。
- 同时安排时间 (5ns),但安排分配的操作会删除在同一时间安排的同一驱动程序的所有分配
- 不仅要安排分配,还要安排整个计算时间 (5ns),并将门输入的评估延迟到该时间。然而,这个问题的答案似乎暗示这不是发生的事情:Understanding the Verilog Stratified Event Queue
请注意,我试图理解两种语言规定的行为,而不是达到特定的结果。
【问题讨论】:
-
How much research effort is expected of Stack Overflow users? 对于 VHDL,请考虑一个可由读者复制并提出特定问题的仿真。你想象的三件事并不完全清楚。第三个似乎无效。请参阅 IEEE Std 1076-2008 IEEE 标准 VHDL 语言参考手册 10.5.2 简单信号分配至 10.5.2.2 执行简单分配语句和 14.7 模型执行。 投影输出波形(一个队列)。
-
or和and运算符位于 VHDL 简单信号分配的值表达式中。 -
您提供的verilog代码在相应的always块或assign语句之外毫无意义。在您的情况下定义“故障”。故障的行为将取决于您的定义、您的始终阻塞和其余逻辑。通常为了解决任何语言的故障,都会使用触发器。
标签: vhdl verilog variable-assignment cycle