我试图通过" 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版本之一中修复。有没有其他方法让这个工作?另外,当前代码有什么问题(如果有的话)?
答案 0 :(得分:0)
奇怪的代码,您正在使用or-gate行为解析clk
个驱动器。首先assign
会不断推动0
。第二个assign
正在反转已解析的值。但第二个wor
输入的初始值是多少?第二个assign
不会产生X
(X
0
X
会产生0 or'ed with X
吗?您是否尝试过在模拟器中运行它,或者至少在某个地方绘制您想要获得的硬件?这就像你正在使用X
进行馈送和逆变,这将产生assign
。
如果您想为时钟建模,您可以:
1)将第一个initial begin clk = 0; end
转换为assign
2)第二个always
到clk
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;