写在前面
verilog不同于其他编程语言,它是一种硬件描述语言。我在verilog的学习中、烧板中走过了许多弯路。
试过写个简单的ALU花了15h+的时间,几天几夜debug无数次。也试过写学号循环,仿真通过了,烧板时灯完全不亮。期间各种google和stackoverflow,最终才渐渐地对verilog有所感悟。
我略总结了几条准则,在写verilog时应该反复在心里确认。
把verilog看成硬件描述语言
简介
verilog这个语言的作用是描述硬件。因此在写代码时,应该反复确认代码能否与硬件构成一一对应的关系。
有些代码能够通过综合(synthesis)和仿真(simulation),但在烧板时却无法达到预期的效果。烧板无法达到预期的代码,称为不可合成的代码(non-systhesizable),这些代码没有真正地”描述“硬件如何工作,无法根据代码产生对应的硬件。
烧板能正确工作的代码,称为可合成代码(synthesizable)。下面我们会讨论如何写出正确的可合成的代码。
写出可合成代码的诀窍是,时刻把verilog看成描述硬件的语言
下面简单举几个例子
延时(delay)不可合成
下列代码
reg [20:0]cnt = 0;
always begin
#1000000;
cnt = cnt + 1;
end
在时间单位是1ns的情况下,他企图每1ms增加cnt的值。然而在烧板时它无法正确工作。
试想一下,作者希望延迟 10<