Ошибка тестового стенда 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