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。