全部#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。或者至少有一种方法来进行概念验证测试。
P.S.我在1989年向Verilog介绍了非阻塞任务,并于1990年在第一次Verilog会议上发表了一篇论文,描述了我尝试在线重新创建的所有这些内容。敬请关注我的博客,网址为http://go.mentor.com/drich – 2014-12-06 22:40:34
'#0'通常是一个红旗,暗示某件事情已经结束!期待您的博客文章。 – Chiggs 2014-12-08 13:39:54
在正确的方向,但也许只有一半是真的。术语“延迟控制”在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