Verilog 非阻塞分配的微妙之处
在此示例中,非阻塞分配传播到连续分配。这会导致任何执行范例。请详细说明这段代码-可能的错误,如何删除它以及良好的编码风格Verilog 非阻塞分配的微妙之处,verilog,nonblocking,Verilog,Nonblocking,在此示例中,非阻塞分配传播到连续分配。这会导致任何执行范例。请详细说明这段代码-可能的错误,如何删除它以及良好的编码风格 always @(posedge clk) dff1 <= f(x); assign fsm_in = f(dff1); assign fsm_out = fsm_state; always @(fsm_in) fsm_state <= g(fsm_in); 始终@(posedge clk) dff
always @(posedge clk)
dff1 <= f(x);
assign fsm_in = f(dff1);
assign fsm_out = fsm_state;
always @(fsm_in)
fsm_state <= g(fsm_in);
始终@(posedge clk)
dff1首先:最佳实践是为寄存器提供非阻塞分配,为组合逻辑提供阻塞分配。我建议大家看看这篇文章:作者CliffordE.Cummings。§11涵盖了组合逻辑。本文的指导方针适用于IEEE标准1364-1995,至今仍然完全适用;Verilog和SystemVerilog
也就是说,给定的原样代码将在功能上工作,因为您有一个简单的条件。它很可能也会正确合成(基于Cliff的页面)
如果对更复杂的设计使用糟糕的编码风格,可能会遇到问题。有关示例,请参见。糟糕的编码风格也使其他人难以阅读[1]。可读代码是您希望教授和同事使用的代码。理想的脱毛工具也会标记它。最好让自己养成编写高质量代码的习惯
1:如果您确实不想让其他人先阅读您的代码,请参见§34:最佳做法是对寄存器进行非阻塞分配,对组合逻辑进行阻塞分配。我建议大家看看这篇文章:作者CliffordE.Cummings。§11涵盖了组合逻辑。本文的指导方针适用于IEEE标准1364-1995,至今仍然完全适用;Verilog和SystemVerilog
也就是说,给定的原样代码将在功能上工作,因为您有一个简单的条件。它很可能也会正确合成(基于Cliff的页面)
如果对更复杂的设计使用糟糕的编码风格,可能会遇到问题。有关示例,请参见。糟糕的编码风格也使其他人难以阅读[1]。可读代码是您希望教授和同事使用的代码。理想的脱毛工具也会标记它。最好让自己养成编写高质量代码的习惯
1:如果你真的不想让别人阅读你的代码,请参见§34。你的代码很好,尽管我同意格雷格的观点,在组合过程中使用阻塞赋值是更好的方式
关于你的评论:
非常简单地说,调度程序包含5个队列(SV有17个),但是
您只对其中的两个感兴趣:活动事件队列
,以及
非阻塞分配更新队列
。在给定的模拟周期中
模拟器处理活动事件队列,然后进行非阻塞更新
队列一般来说,这将创建更多的事件和模拟器周期
以预先确定的顺序绕过队列,直到此时不再有任何事件
这是模拟时间。然后,模拟器继续进行下一次
事件被调度(例如,在下一个时钟边缘)
假设4件事情“同时”发生:fsm\U状态发生变化
是f(x)
中的一个更改,并且您的两个NBA分配都将执行。远至
就模拟器而言,这4条语句是在同一时间执行的
模拟循环,但顺序未定义。“立即”的定义是
相当复杂,但假设它们都是时钟边缘的结果,
语句之间没有顺序依赖关系。模拟器通常是
单线程,因此它实际上会在不同的时间执行4条语句
实时,但它知道所有4个都将在同一时间发生
模拟时间
fsm\u状态
和f(dff1)
上的更改是更新事件
,并添加到
计划程序的活动事件队列
立即评估两个NBA的RHS,并更新LHS
添加到非阻塞分配更新队列
模拟器现在看到一个包含4个事件的队列。它执行两个活动的
事件首先以未定义的顺序发生,因此fsm_in
和fsm_out
获取新的
价值观如果没有更多的活动事件,它将执行两个
非阻塞更新,以未定义的顺序,因此dff1
和fsm\u状态
现在可以获取
他们的新价值观
在您的情况下,模拟周期尚未结束,因为更改已打开
fsm_in
也是一个更新事件,这会触发评估/执行
对
中的fsm\u敏感的always块的。这是一个评估
事件
。sim卡执行always块,立即读取的新值
fsm_in
,并将fsm_状态的更新添加到NBA分配更新中
队列如果没有活动事件,则对分配执行操作,并且
fsm\u state
获取它的新值
这将一直持续,直到此模拟周期中没有更多事件,并且
然后,如果将来有计划,模拟器将提前时间
您可以从Verilog LRM的第5节获得所有这些信息,但这并不意味着
很有道理。所有的语言都是在标准化后期移植的
过程和使用(VHDL)术语,在LRM的其他地方没有使用。信息技术
还以与Verilog XL的行为相匹配的方式添加了所有,以及
特别是为了记录XL特有的非决定论,所以不要期望
太多了。直到1992年,NBA才被加入到语言中
想想看。不要麻烦SV LRM;还有更多的队列,而且
普通文本发生了变化,只是增加了另一层混乱
克里夫·卡明斯(Cliff Cummings)在他的一篇论文(关于
非阻塞作业),但请仔细阅读。我很确定
活动事件队列的描述不正确(用于RHS评估
NBAs)。如果他是对的,那会引起各种各样的问题;他大概
从t的早期版本得到描述