如何在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
断言-反断言序列之后,您可以在那之后继续进行其余的模拟
我一直在尝试将我的输出 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
断言-反断言序列之后,您可以在那之后继续进行其余的模拟