vhdl - 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 如何确保故障得到正确解决?他们可以做到的事情我可以想象:
- 允许调度(N 个周期 + D 个 delta 周期),因此 OR 门到 1 的更改被调度为(5ns + 1delta)并保证最后执行。
- 安排两个时间 (5ns),但有安排分配的操作删除同一时间安排的同一驱动程序的所有分配
- 不仅安排分配,而且安排时间(5ns)的整个计算,并将门输入的评估延迟到那个时间。然而,这个问题的答案似乎暗示这不是发生的事情:Understanding the Verilog Stratified Event Queue
请注意,我试图理解两种语言规定的行为,而不是达到特定的结果。
解决方案
对于您显示的信号分配,Verilog 和 VHDL 都保证最后一次写入获胜。正如其他人所评论的那样,这将有助于显示语句的完整上下文以确认这是您的意图。
不会有毛刺,因为c
从 0→1的转换发生在temp
从 1→0 的转换之前,由一个增量周期分隔。虽然您无法确定不同并发进程之间的顺序,但如果同一进程内存在确定性顺序,则最后写入同一变量获胜。
推荐阅读
- react-native - 反应本机地图 animateToRegion 不起作用
- reactjs - React useState 与对象的最佳实践?
- azure-data-factory-2 - DIU-小时,它是如何计算的?
- r - 如何将相关结果放入R中的表格中?
- python - 在绘图地图上绘制蒙版数据
- vue.js - 严重漏洞 - npm-laravel 8 包和依赖项
- config - 当我启动 Jasper 时,Raspberry pi 出现错误
- python - 如何从 Amazon SageMaker 可读格式模型(需要部署为 Sagemaker 终端节点)中获取 tf.Keras 模型对象?
- android - Kotlin 中的 Android-App:更新 imageView 仅更新最后一个选项
- python - elasticsearch如何找到具有精确单词匹配的文档