2014-12-06 15 views
3

全部#0相关的代码示例我已经发现与程序代码有关(IE代码在begin - end之内)。连续赋值和原始实例化呢?该IEEE 1364 & IEEE 1800(Verilog的& SystemVerilog的分别)只给一个单行描述,我可以找到(部分名下引用IEEE 1364的所有版本“分层事件队列”):哪个区域是连续赋值和#0调度的原始实例化

的明确的零延迟(#0)要求暂停过程并将其作为当前时间的非活动事件添加,以便在当前时间的下一个仿真周期中恢复过程。

我在IEEE Std 1364-1995之前很早就读过文档,并与几位一直在使用Verilog的工程师交谈。总之,非活动区域是使触发器与Verilog的不确定处理顺序同步的失败解决方案。后来Verilog创建了非阻塞赋值(<=)并解决了与不确定顺序同步的问题。非活动区域保留在调度程序中,不会破坏遗留代码和一些不明显的转角情况。现代指导方针表示避免使用#0,因为它会造成竞争条件并可能阻碍仿真性能。性能影响是不关心小型设计。我运行混合RTL到晶体管级模块的巨大设计。因此,即使小的性能提升加起来,也无需调试胭脂竞争条件,节省时间。

我跑了测试案例去除/添加#0大规模设计的Verilog基元。有些模拟器有其他的不明显变化。很难说LRM之后谁做得更好,或者有更聪明的优化器。

添加一个per-compile脚本来移除硬编码表格#0很容易。挑战在于参数化延迟。我是否真的需要创建生成块以避免非活动区域?感觉就像它可能会引入更多的问题比解决:从一开始

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。或者至少有一种方法来进行概念验证测试。

回答

4

这是一个容易的。第28.16门和净延迟2000至12年LRM的以及部分7.14门和净延迟1364至2005年LRM的都表示

对于这两个闸门和渔网,默认延迟应零延时 规范给出。 因此,这意味着

gateName instanceName (pins); 

相当于写

gateName #0 instanceName (pins); 

我不知道,你所引用的文字而来,但部分4.4.2.3无效事件1800的区域 -2012 LRM说

如果在活动区域​​集中正在执行事件,则显式#0 延迟控制要求暂停进程并将事件调度为当前时间段的非活动区域中的 ,以便 该进程可以在下一个从无效到有效迭代中恢复。

关键文本是delay control,这是一个程序性构造。所以#0作为不活动的事件只适用于程序性陈述。

程序#0的问题是他们移动竞争条件,他们并没有消除它们。有时你必须添加多个序列#0以避开竞争条件,但你并不总是知道多少,因为另一段代码也添加了#0。只要看看UVM代码;它杂乱无章的#0,因为他们没有花时间来正确编码的东西。

+1

P.S.我在1989年向Verilog介绍了非阻塞任务,并于1990年在第一次Verilog会议上发表了一篇论文,描述了我尝试在线重新创建的所有这些内容。敬请关注我的博客,网址为http://go.mentor.com/drich – 2014-12-06 22:40:34

+0

'#0'通常是一个红旗,暗示某件事情已经结束!期待您的博客文章。 – Chiggs 2014-12-08 13:39:54

+0

在正确的方向,但也许只有一半是真的。术语“延迟控制”在IEEE Std 1800-2005中增加了术语,IEEE 1364(我引用的)没有使用该术语。 “延迟控制”不是程序专有的;在[IEEE Std 1800-2012](http://standards.ieee.org/getieee/1800/download/1800-2012.pdf)的第6.7节_Net declarations_&10.3 _Continuous assignmentments_中至少引用了'net_type_identifier' 。 “延迟控制”不是§28中的一部分_Gate-level和switch-level modeling_或29 _User-defined primitives_,所以原语w /#0是清楚的。我需要多学习一下“延迟控制” – Greg 2014-12-08 16:37:41

相关问题