gpt4 book ai didi

verilog - 哪个区域是连续分配和具有 #0 计划的原始实例化

转载 作者:行者123 更新时间:2023-12-01 12:38:28 28 4
gpt4 key购买 nike

全部 #0我发现的相关代码示例与程序代码有关(begin - end 中的 IE 代码)。那么连续赋值和原始实例化呢? IEEE 1364 和 IEEE 1800(分别为 Verilog 和 SystemVerilog)只给出了我能找到的一行描述(在部分名称“分层事件队列”下引用所有版本的 IEEE 1364):

An explicit zero delay (#0) requires that the process be suspended and added as an inactive event for the current time so that the process is resumed in the next simulation cycle in the current time.



我阅读了文档并与一些早在 IEEE Std 1364-1995 之前就已经使用 Verilog 的工程师进行了交谈。总而言之,非事件区域是用 Verilog 的不确定处理顺序同步触发器的失败解决方案。后来 Verilog 创建了非阻塞分配 ( <=) 并解决了不确定顺序的同步。非事件区域留在调度程序中,以免破坏遗留代码和一些晦涩的极端情况。现代指南说要避免使用 #0因为它会产生竞争条件并可能阻碍模拟性能。性能影响是不关心小型设计。我运行具有混合 RTL 到晶体管级模块的大型设计。因此,即使是很小的性能提升,也不必调试 rouge 竞争条件,从而节省时间。

我已经运行测试用例删除/添加 #0到大规模设计上的 Verilog 原语。一些模拟器有其他显着的变化。很难判断谁在 LRM 之后做得更好,或者谁拥有更智能的优化器。

添加每次编译脚本以删除 #0 的硬编码形式, 很容易。挑战在于参数化延迟。我真的需要创建生成 block 以避免非事件区域吗?感觉它可能会带来比解决更多的问题:
generate
if ( RISE > 0 || FALL > 0)
tranif1 #(RISE,FALL) ipassgate ( D, S, G );
else
tranif1 ipassgate ( D, S, G );
if ( RISE > 0 || FALL > 0 || DECAY > 0)
cmos #(RISE,FALL,DECAY) i1 ( out, in, NG, PG );
else
cmos i1 ( out, in, NG, PG );
if (DELAY > 0)
assign #(DELAY) io = drive ? data : 'z;
else
assign io = drive ? data : 'z;
endgenerate

Verilog 原语和连续赋值从一开始就使用 Verilog。我相信参数化延迟比非事件区域要长。我还没有找到任何关于这些条件的推荐或解释的文档。我的本地 Verilog/SystemVerilog 专家网络都不确定它应该在哪个区域运行。是否有我们都忽略的细节,或者它是语言中的灰色区域?如果是灰色区域,我如何确定它是通过哪种方式植入的?

接受的答案应包括对任何版本的 IEEE1364 或 IEEE1800 的引用。或者至少是一种进行概念验证测试的方法。

最佳答案

这是个简单的。 1800-2012 LRM 的第 28.16 节门和网络延迟以及 1364-2005 LRM 的第 7.14 节门和网络延迟都说

For both gates and nets, the default delay shall be zero when no delay specification is given. So that means


gateName instanceName (pins);

相当于写
gateName #0 instanceName (pins);

我不确定您引用的文字来自哪里,但是 1800-2012 LRM 的第 4.4.2.3 节非事件事件区域说

If events are being executed in the active region set, an explicit #0 delay control requires the process to be suspended and an event to be scheduled into the Inactive region of the current time slot so that the process can be resumed in the next Inactive to Active iteration.



关键文本是 delay control ,这是一个程序结构。所以#0 作为非事件事件仅适用于程序语句。

程序问题 #0是他们改变了比赛条件,他们没有消除它们。有时您必须添加多个序列号 #0 才能摆脱竞态条件,但您并不总是知道有多少,因为另一段代码也在添加 #0。只看UVM代码;它到处都是乱七八糟的#0,因为他们没有花时间正确编码。

关于verilog - 哪个区域是连续分配和具有 #0 计划的原始实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27327307/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com