Verilog 中 = 和 <= 有什么区别?

What is the difference between = and <= in Verilog?

这段代码中的=<=有什么区别?另外,如何打印 data?

的值
    module always_example();
reg clk,reset,enable,q_in,data;

always @ (posedge clk)
if (reset)  begin
   data <= 0;
end else if (enable) begin   
   data <= q_in;
end
// if i put     $print("data=%d", data);   there is error
endmodule

<= 是非阻塞赋值。它用于描述顺序逻辑,就像在您的代码示例中一样。请参阅 IEEE 标准 1800-2012,第 10.4.2 节 "Nonblocking procedural assignments"。

= 用于阻塞赋值。它用于描述组合逻辑。

另见 Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill!

您可以使用 $display 而不是 $print 来打印变量的值。另见 IEEE 标准 1800-2012,第 21.2 节 "Display system tasks"。

= 是阻塞语句。在 always 块中,该行代码只有在其前一行执行后才会执行。因此,它们一个接一个地发生,就像循环中的组合逻辑一样。

<= 本质上是非阻塞的。这意味着在 always 块中,每一行都将并行执行。因此导致顺序元素的实现。