时钟实现导致模拟无限循环

问题描述 投票:0回答:1

我刚刚开始学习Verilog并制作了一个系统时钟及其各自的测试平台,但它在测试平台中陷入了无限循环。你能帮我吗?

下面分别是系统时钟和时钟测试平台的实现。 它应该给我一个时间周期为 10ns、占空比为 50% 的时钟,并且应该在设置复位信号时复位(1),只要复位保持为 1,就应该将时钟设置为 0。 测试平台陷入了无限循环。 我正在使用 Iverilog 版本 12.0

//CLK.v

    `timescale 1ns / 1ps

    module clock_generator(
        input wire reset,      // Reset input
        output reg clk       // Clock output
    );
        parameter frequency = 1e8; // in Hz
        parameter duty = 0.50; // Duty in fraction
        parameter tp = (1/frequency) * 1e9;
        parameter cycle = tp*duty; // High Low cycle

        initial begin
            clk = 1'b0;
        end

        always begin
            if (reset) begin
                clk = 1'b0;   // Reset clock to 0
            end else begin
                clk = 1'b1;   // Set clock high
                #(cycle) clk = 1'b0; // High phase duration
                #(tp - cycle); // Low phase duration
            end
        
        end
    
endmodule

//CLK_tb.v

    `timescale 1ns / 1ns
    `include "CLK.v"

    module CLK_tb;
        reg reset;
        wire clk;

        // Instantiate the clock module
        clock_generator UUT (
            .clk(clk),
            .reset(reset)
        );

        initial begin
            $dumpfile("Clk_tb.vcd");
            $dumpvars(0, CLK_tb);

            // Apply the reset pattern
            reset = 1'b0;  // Start with reset = 0
            #30;          // Hold reset = 0 for 30ns
            reset = 1'b1;  // Set reset to 1
            #10;          // Hold reset = 1 for 10ns
            reset = 1'b0;  // Clear reset
            #50;          // Hold reset = 0 for 50ns
            reset = 1'b1;  // Set reset to 1
            #30;          // Hold reset = 1 for 30ns
            reset = 1'b0;  // Clear reset

            #100;         // Run simulation for an additional 100ns
            $display("Simulation over.");
            $finish;       // End the simulation
        end
    endmodule
verilog infinite-loop clock iverilog
1个回答
0
投票

无限循环在

clock_generator
模块中:

    always begin
        if (reset) begin
            clk = 1'b0;   // Reset clock to 0
        end else begin

当测试台将

reset
设置为1时,
if
子句为真,
always
块在零时间内保持触发。

您需要在

if
子句中添加延迟,例如:

    always begin
        if (reset) begin
            clk = 1'b0;   // Reset clock to 0
            #1;
        end else begin

此更改避免了无限循环。 您需要确定

#1
是否是适合您的代码的延迟值。

© www.soinside.com 2019 - 2024. All rights reserved.