Verilog:错误引用标量线 'VALUE' 不是合法的 reg 或变量左值

Verilog : error Reference to scalar wire 'VALUE' is not a legal reg or variable lvalue

我受困于这段代码。我不明白为什么我的 VALUE 不能反转。

module PREDIV(
    input wire QUARTZ,
     output wire VALUE);

always @ (posedge QUARTZ)
    assign VALUE= ~VALUE;

endmodule

有一些问题。

您不应在 always 块中使用 assign 关键字。

进行程序分配时(在 always 块内),您应该将信号声明为 reg 类型,而不是 wire。这就是您的错误消息所指的内容。

对于顺序逻辑,您应该使用非阻塞赋值:<=

最后,一个reg被初始化为未知(X)。你需要一种方法来初始化VALUE,否则它将保持X。一种方法是添加 RESET 信号。

module PREDIV(
    input wire QUARTZ, input RESET,
     output reg VALUE);

always @ (posedge QUARTZ or posedge RESET)
    if (RESET) begin
        VALUE <= 0;
    end else begin
        VALUE <= ~VALUE;
    end

endmodule

看起来代码在 always 块中使用了阻塞赋值。 always 块应该只使用非阻塞赋值。

代码应该是这样的:

always @(posedge QUARTS)
Value <= ~Value;