verilog中永久时钟的实现

verilog中永久时钟的实现,verilog,hardware-programming,Verilog,Hardware Programming,我正在用verilog实现一个时序电路。我想要一个时间段为10的钟。为了实现这一点,我做了如下工作 initial begin forever begin clk=0; #5 clk=1; #5 clk=0; end end 但是当我运行代码时,它会继续运行,而不显示任何输出。上述实现中是否存在任何错误?实现它的一种方法如下(假设您在测试

我正在用verilog实现一个时序电路。我想要一个时间段为10的钟。为了实现这一点,我做了如下工作

 initial begin
       forever begin
            clk=0;
            #5
            clk=1;
            #5
            clk=0;
       end
   end 

但是当我运行代码时,它会继续运行,而不显示任何输出。上述实现中是否存在任何错误?

实现它的一种方法如下(假设您在测试台中使用此方法):


由于没有$finish,您的代码将继续运行。所以它是一个自由运转的振荡器

以下是一些产生时钟的方法。或多或少,他们都是一样的

方法1:

        parameter int clk_tgl_period = 5;
        parameter timeout = 500;    
        module clkgen1;
        reg clk;
        initial begin
            clk <= '0;
            forever #(clk_tgl_period) clk = ~clk;
        end
        initial begin
            #(timeout) $finish
        end
        endmodule
方法-3

        parameter int clk_tgl_period = 5;
        parameter timeout = 500;    
        module clkgen3;
        reg clk;
        initial begin
            clk = 0;
            #(timeout) $finish;
        end
        always #(clk_tgl_period) clk++;
        endmodule

有关更多信息,您可能需要查看的第4节。

这在很大程度上取决于代码的其余部分。您是否曾经调用过
$finish
?如果没有,则总是有更多的事情要做,因为
永久
块将为
clk
保留调度事件以更改值。(请注意,使用
initial begin clk=0;forever clk=#5~clk;end
        parameter int clk_tgl_period = 5;
        parameter timeout = 500;    
        module clkgen2;
        reg clk;
        initial begin 
            clk = 0;
            #(timeout) $finish;
        end
        always #(clk_tgl_period) clk = ~clk;
        endmodule
        parameter int clk_tgl_period = 5;
        parameter timeout = 500;    
        module clkgen3;
        reg clk;
        initial begin
            clk = 0;
            #(timeout) $finish;
        end
        always #(clk_tgl_period) clk++;
        endmodule