Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog 非阻塞分配的微妙之处_Verilog_Nonblocking - Fatal编程技术网

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的早期版本得到描述