结构verilog中生成时钟的代码

时间:2018-03-20 15:44:49

标签: verilog iverilog

我试图通过" The Verilog HDL"来教我自己的verilog编程。托马斯莫尔比的书。在其中一个练习中,他们要求仅使用结构verilog生成一个时钟(当然除了$ monitor部分)。

我尝试了以下内容:

module clock();
    wor clk;
    assign clk=0;

    initial begin 
        $monitor($time,,"clk=%b", clk);
        #100 $finish;
    end

    assign #5 clk = ~clk;
endmodule

问题是,它适用于iVerilog 0.9.7,但对于10.0及更高版本,它不起作用..我只是得到clk的未定义值!

似乎不是iVerilog中的错误,否则它可能已在10.x版本之一中修复。有没有其他方法让这个工作?另外,当前代码有什么问题(如果有的话)?

2 个答案:

答案 0 :(得分:0)

奇怪的代码,您正在使用or-gate行为解析clk个驱动器。首先assign会不断推动0。第二个assign正在反转已解析的值。但第二个wor输入的初始值是多少?第二个assign不会产生XX 0 X会产生0 or'ed with X吗?您是否尝试过在模拟器中运行它,或者至少在某个地方绘制您想要获得的硬件?这就像你正在使用X进行馈送和逆变,这将产生assign

如果您想为时钟建模,您可以:

1)将第一个initial begin clk = 0; end转换为assign

2)第二个alwaysclk

3)制作reg page-break-inside: avoid类型

如果你想要一个可合成的时钟发生器,你需要一个振荡源,PLL等。

答案 1 :(得分:0)

这是一个混乱的代码。通常使用regs作为以下之一完成时钟生成

reg clk;
initial begin
    clk = 0;
    forever 
         #5 clk = ~clk;
end

 always 
     #5 clk = ~clk;
 initial 
     clk = 0;