【问题标题】:iverilog testbench error: input is declared as wire, but it isn'tiverilog 测试台错误:输入被声明为线,但它不是
【发布时间】:2017-10-31 00:43:50
【问题描述】:

我对 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。 但在原始代码或测试台中,它都没有被声明为连线。重置也是如此。 我曾尝试从校内导师那里获得帮助,但他们不知道为什么会发生这种情况,或者能够就如何解决它提出建议。

谁能建议如何解决这个问题?

【问题讨论】:

    标签: verilog test-bench iverilog icarus


    【解决方案1】:

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

    您还在测试台模块中将clkreset 定义为输入,但随后您在测试台中分配给它们,这就是它们不是有效左值的原因。

    试试这个:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 2019-08-24
      • 2020-08-04
      • 2013-02-09
      • 1970-01-01
      • 2023-03-15
      • 2018-09-02
      相关资源
      最近更新 更多