RTL基本知识:阻塞赋值与非阻塞赋值

0 丑话说在前边

RHS:运算符(= or <=)右侧的表达式

LHS:运算符(= or <=)左侧的表达式

竞争(Race Condition):在同一仿真时间槽(time-slot)多条语句同时执行顺序不同时可能产生不同的执行结果的情况。

建议规则一:模拟组合逻辑时使用阻塞赋值。

建议规则二:在过程性语句中,模拟时序逻辑时使用非阻塞赋值。

建议规则三:模拟latch时使用非阻塞赋值。

建议规则四:在同一个过程性语句中同时包括时序逻辑和组合逻辑时,该过程性语句中使用非阻塞赋值。

建议规则五:不要在同一个过程性语句中混用阻塞赋值与非阻塞赋值。

建议规则六:不要在多个过程性语句中对同一个变量进行赋值操作。

建议规则七:如果要观测非阻塞赋值的结果,使用$strobe和$monitor进行观测。

建议规则八:不要使用#0。

1 阻塞赋值

阻塞赋值使用的赋值运算符为“=”。阻塞赋值的过程是立刻执行的,即阻塞赋值运算符右侧表达式求值完后立刻会更新至运算符左侧,并且这个执行的过程不受其他语句执行的影响,其后的语句只有当前的赋值操作执行完成后才能顺序执行。

2 非阻塞赋值

非阻塞赋值使用的赋值运算符为“<=”。非阻塞赋值执行过程为:在当前仿真时间槽(time-slot)开始分析计算获得右侧表达式的值,在当前时间槽执行结束时更新左侧表达式的值,在右侧表达式分析计算和左侧表达式被更新之间,任何其他事件都可以执行,同时也有可能修改已经计算完成的右侧表达式的值,即非阻塞赋值的过程不影响其他语句的执行.

根据非阻塞赋值的特点,其赋值运算符左侧操作数只能为寄存器类型,因此非阻塞赋值只能用于过程性语句中(initial和always),不允许在连续赋值语句中使用非阻塞赋值。

 3 阻塞赋值与非阻塞赋值区别

更多资讯,请关注下方二维码!

猜你喜欢

转载自www.cnblogs.com/xgcl-wei/p/9059789.html
今日推荐