Verilog - 寄存器在综合时被删除
Verilog - Register being removed at synthesis
我写了一小段 Verilog,它显示了 LED 的计数。我收到来自 Vivado 的警告:
[Synth 8-3332] Sequential element (led_reg[3]) is unused and will be removed from module top.
这是我的代码:
module top(
input wire reset, // ACTIVE LOW
input wire system_clk_p,// 200MHz DIFFERENTIAL CLOCK
input wire system_clk_n,//
//LED
output reg [3:0] led
);
reg counter;
wire reset_p;
assign reset_p = ~reset;
clk_wiz_0 clocks
(
.clock_200MHz_p(system_clk_p), // Input Clock 200MHz p
.clock_200MHz_n(system_clk_n), // Input Clock 200MHz n
.clock_125MHz(clock_125MHz), // Output Clock 125MHz
.reset(reset_p)
);
always @(posedge clock_125MHz or negedge reset)
begin
if (!reset)
begin
counter <= 0;
led <= 0;
end
else
begin
counter <= counter + 1;
if (counter == 125000000)
begin
counter <= 0;
led <= led + 1;
end
end
end
endmodule
我认为 LED 的寄存器是绝对需要的,因为我正在增加 LED 的值。
以为我会 post 这个,因为我花了一点时间才意识到问题出在哪里,而且通常很难见树不见林:
警告说LED寄存器未被使用,已被合成;我的错误是认为那意味着 led_reg
是问题所在,但事实并非如此。
问题是 counter
被声明为 reg counter;
,只有一位宽。因为它只有一个位宽,所以在它溢出之前它可以数到的最大数字是 1,这意味着它永远无法达到预期的 125000000,这是需要 led
输出的地方。结果,合成器优化了 led_reg
,因为那段代码无法访问。
为了解决这个问题,我将 counter
声明为 integer counter;
,它的宽度足以计数到 125000000。
我写了一小段 Verilog,它显示了 LED 的计数。我收到来自 Vivado 的警告:
[Synth 8-3332] Sequential element (led_reg[3]) is unused and will be removed from module top.
这是我的代码:
module top(
input wire reset, // ACTIVE LOW
input wire system_clk_p,// 200MHz DIFFERENTIAL CLOCK
input wire system_clk_n,//
//LED
output reg [3:0] led
);
reg counter;
wire reset_p;
assign reset_p = ~reset;
clk_wiz_0 clocks
(
.clock_200MHz_p(system_clk_p), // Input Clock 200MHz p
.clock_200MHz_n(system_clk_n), // Input Clock 200MHz n
.clock_125MHz(clock_125MHz), // Output Clock 125MHz
.reset(reset_p)
);
always @(posedge clock_125MHz or negedge reset)
begin
if (!reset)
begin
counter <= 0;
led <= 0;
end
else
begin
counter <= counter + 1;
if (counter == 125000000)
begin
counter <= 0;
led <= led + 1;
end
end
end
endmodule
我认为 LED 的寄存器是绝对需要的,因为我正在增加 LED 的值。
以为我会 post 这个,因为我花了一点时间才意识到问题出在哪里,而且通常很难见树不见林:
警告说LED寄存器未被使用,已被合成;我的错误是认为那意味着 led_reg
是问题所在,但事实并非如此。
问题是 counter
被声明为 reg counter;
,只有一位宽。因为它只有一个位宽,所以在它溢出之前它可以数到的最大数字是 1,这意味着它永远无法达到预期的 125000000,这是需要 led
输出的地方。结果,合成器优化了 led_reg
,因为那段代码无法访问。
为了解决这个问题,我将 counter
声明为 integer counter;
,它的宽度足以计数到 125000000。