如何在verilog中初始化输出?

How to initialize an output in verilog?

我一直在尝试将我的输出 LEDR [3:0] 初始化为全 0。但是,在我的波形时序图中,LEDR 一直是 XXXX。我试过使用初始块,但它不起作用。 (我的IDE是Quartus Prime)

这是我的代码

module synasyn_counter(SW,LEDR,PLoad,CLK);
    parameter n=16;
    input CLK,PLoad;
    input [3:0] SW;
    output reg [3:0] LEDR;
    initial 
    begin
        LEDR=0;
    end
    always @(negedge PLoad or negedge CLK)
    begin
        if (PLoad==0) LEDR<=SW;
        else 
        begin
            if (LEDR==n-1) LEDR<=0;
            else LEDR<=LEDR+1;
        end
    end
endmodule

这是我的结果:

您不能在合成代码中使用 initial 块。这意味着纯粹基于模拟的代码。

在硬件中,我们一般通过一个reset信号来实现一个flop/register初始化。因此,如果您的设计中有一个低电平有效的异步复位,您可以为触发器方程做这样的事情 -

always @ (posedge clock or negedge reset) begin
  if(!reset) begin
    LEDR <= <initialized_value>
  end
  else begin
    <rest_of_your_code>
  end
end

完成此操作后,在您的 TB 中确保在开始时您断言 reset 信号(因为其低电平有效断言意味着将其拉低至 0)然后取消断言在 1 个或多个时钟周期之后。

请注意,在 reset 生效之前,您仍会看到 X,除非 reset 从 t=0 开始生效。因此,在您遵循一个 reset 断言-反断言序列之后,您可以在那之后继续进行其余的模拟