0

我试图从 Thomas Moorby 的“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 版本之一中修复。有没有其他方法可以让这个工作?另外,当前代码有什么问题(如果有的话)?

4

2 回答 2

0

奇怪的代码,您正在clk使用或门行为解析驱动器。首先assign是不断驾驶0。其次assign是反转解析值。但是第二个wor输入的初始值是多少?那第二个产品不会首先assign产生XXored with0会给你X)吗?您是否尝试过在模拟器中运行它,或者至少在某个地方绘制您想要获得的硬件?就像您正在喂食和逆变器0 or'ed with X,它将产生X.

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

1)先转换assigninitial begin clk = 0; end

2)assign其次always

3)制作clk reg类型

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

于 2018-03-20T16:05:05.660 回答
0

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

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

或者

 always 
     #5 clk = ~clk;
 initial 
     clk = 0;
于 2018-03-20T19:25:08.017 回答