iverilog testbench错误:输入声明为wire,但它不是

时间:2017-10-31 00:43:51

标签: verilog test-bench iverilog icarus

我是iverilog的新手,我正在创建一个计数器,将100Mhz的时钟频率降低到更容易使用的状态,作为大型项目的一部分。 我发现了一些代码,所以我试着为它编写一个测试平台。 这是我找到的代码:

    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在这里被声明为wire。 但它尚未在原始代码或测试平台中声明为电线。重置也一样。 我尝试过从校园导师那里获得帮助,但是他们不知道为什么会这样,或者能够就如何解决这个问题提出建议。

有人可以建议如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

当您不包含类型时,所有变量/信号都被推断为电线。你没有给他们一个类型,所以他们被认为是电线。

您还在测试平台模块中定义了let object = {}; while(object = Object.getPrototypeOf(object)) {} console.log(object);clk作为输入,但之后您又在测试平台内分配了它们,这就是为什么他们&# 39;无效的l值。

试试这个:

reset
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