Ошибка тестового стенда iverilog: вход объявлен как провод, но это не так

Я очень новичок в iverilog и создаю счетчик, чтобы уменьшить тактовую частоту 100 МГц до чего-то более удобного для работы, как часть более крупного проекта. Я нашел некоторый код, который делает это, и поэтому я попытался написать тестовый стенд для него. Вот код, который я нашел:

    module slowClock(clk, reset, clk_1Hz);
input clk, reset;
output clk_1Hz;

reg clk_1Hz;
reg [27:0] counter;

always@(posedge reset or posedge clk)
begin
     if (reset == 1'b1)
         begin
             clk_1Hz <= 0;
             counter <= 0;
         end
     else
         begin
             counter <= counter + 1;
             if ( counter == 25_000_000)
                 begin
                     counter <= 0;
                     clk_1Hz <= ~clk_1Hz;
                 end
         end
end
endmodule   

и вот тестовый стенд, который я написал:

module slowClock_tb(clk, reset, clk_1Hz);
    input  clk;
    input  reset;
    output  clk_1Hz;

initial 
begin
    clk = 1'b0; 
    reset = 1'b0;
#2 reset = ~reset;

end

    always #3 clk = ~clk;

slowClock clock_generator(clk, reset, clk_1Hz);


endmodule

Вот сообщения об ошибках:

$ iverilog  slowClock.v slowClock_tb.v 
slowClock_tb.v:8: error: clk is not a valid l-value in slowClock_tb.
slowClock_tb.v:2:      : clk is declared here as wire.
slowClock_tb.v:9: error: reset is not a valid l-value in slowClock_tb.
slowClock_tb.v:3:      : reset is declared here as wire.
slowClock_tb.v:10: error: reset is not a valid l-value in slowClock_tb.
slowClock_tb.v:3:      : reset is declared here as wire.
slowClock_tb.v:14: error: clk is not a valid l-value in slowClock_tb.
slowClock_tb.v:2:      : clk is declared here as wire.
4 error(s) during elaboration.

Первое сообщение об ошибке: CLK объявлен здесь как провод. Но он не был объявлен как провод ни в исходном коде, ни в тестовом стенде. То же самое касается сброса. Я пытался получить помощь от репетиторов в кампусе, но они не знали, почему это происходит, или не могли посоветовать, как это исправить.

Кто-нибудь может подсказать как это исправить?

1 ответ

Решение

Когда вы не включаете тип, все переменные / сигналы выводятся в виде проводов. Вы не дали им тип, поэтому они должны быть проводами.

Вы также определили clk а также reset в качестве входных данных в вашем модуле testbench, но затем вы назначаете их внутри testbench, поэтому они не являются действительными значениями l.

Попробуй это:

module slowClock(
    input  wire clk,
    input  wire reset,
    output reg clk_1Hz
    );

    reg [27:0] counter;

    always@(posedge reset or posedge clk) begin
        if (reset == 1'b1) begin
            clk_1Hz <= 0;
            counter <= 0;
        end else begin
            counter <= counter + 1;
            if ( counter == 25_000_000) begin
                counter <= 0;
                clk_1Hz <= ~clk_1Hz;
            end
        end
    end
endmodule
module slowClock_tb;
    reg clk = 1'b0;
    reg reset = 1'b0;
    integer counter = 0;
    wire clk_1Hz;

    initial begin
        #2 reset <= ~reset;
    end

    always #3 clk <= ~clk;

    slowClock clock_generator(clk, reset, clk_1Hz);

    always @(posedge clk) begin
        counter <= counter + 1;
        $display("%0d", counter);

        if (counter > 100) $finish;
    end

endmodule
Другие вопросы по тегам