马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
这是IC君的第25篇原创文章(同步于公众号 icstudy )
Verilog HDL 是目前中国IC设计里最流行的硬件描述语言,做这一行的或多或少都会接触过。
在数字IC设计里面,我们常用Verilog来做两类任务,一类是设计:用来描述能实现规范指定的电路功能,这类代码是可综合的verilog代码,最终目的是要综合成门级netlist,拿去做Layout,产出芯片;
另外就是用来验证电路的:建立电路仿真平台,用来验证我们设定的电路是否符合规范要求,比如产生电路激励信号、打印一些信息供debug等,即我们常说的testbench。
在testbench里面我们通常会加一些延迟来描述信号发生的先后顺序,但可综合的电路里面则通常不会加延迟。这些不加延迟的电路,在仿真的时候波形里显示的输出信号在输入信号发生变化时立即随之变化,没有任何的延迟。
但实际上所有可综合代码都是可以映射成门级电路,是有延迟的。只是在没有综合成实际电路之前,我们不知道延迟是多少而已。为了描述没有定义延迟的电路信号发生先后顺序,verilog HDL里面引入了0延迟的概念,如果写了#0就称之为显性0延迟,如果什么都没写则为隐性0延迟。
如果不了解verilog 0延迟的概念,在看时序电路的波形时,就容易搞不清楚信号的传输是否正确。比如下面图1,信号a_in是用clk 采样生成的,a_in被clk 采样后再得到信号b_out, 那么a_in 由0变为1时,A时刻clk 采到的a_in是0,还是1呢? b_out正确的输出波形应该是图2还是图3呢?
图1 时序电路波形( b_out 是clk直接采样 a_in得到)
图1 时序电路波形( b_out 是clk直接采样 a_in得到)
图2 时序电路波形 b_out 波形一
图3 时序电路波形 b_out 波形二
如果你有了解verilog 0延迟的概念,你就可以把这里的0想象成一个具体的概念,无限接近0但比0大的数,比如0.1或更小,这样你很快就可以画出类似图4的波形。
图4 带有延迟的时序电路波形 因为a_in 是经过clk采样的,在A时刻a_in 由0变1是发生在clk上升沿的后面,所以在A时刻clk抓到的是a_in的低电平,在B时刻抓到的是a_in的高电平。
0延迟的概念也适用组合电路,不过一般来说,组合电路不太容易被困扰到。
如果你已经了解了verilog 0延迟的概念,下面的testbench例子发生的错误也适用0延迟来解释。你知道如何修正吗?
以下是testbench:
|