RTL基本知识:阻塞赋值与非阻塞赋值
Posted 魏老师说IC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RTL基本知识:阻塞赋值与非阻塞赋值相关的知识,希望对你有一定的参考价值。
0 丑话说在前边
RHS:运算符(= or <=)右侧的表达式
LHS:运算符(= or <=)左侧的表达式
竞争(Race Condition):在同一仿真时间槽(time-slot)多条语句同时执行顺序不同时可能产生不同的执行结果的情况。
建议规则一:模拟组合逻辑时使用阻塞赋值。
建议规则二:在过程性语句中,模拟时序逻辑时使用非阻塞赋值。
建议规则三:模拟latch时使用非阻塞赋值。
建议规则四:在同一个过程性语句中同时包括时序逻辑和组合逻辑时,该过程性语句中使用非阻塞赋值。
建议规则五:不要在同一个过程性语句中混用阻塞赋值与非阻塞赋值。
建议规则六:不要在多个过程性语句中对同一个变量进行赋值操作。
建议规则七:如果要观测非阻塞赋值的结果,使用$strobe和$monitor进行观测。
建议规则八:不要使用#0。
1 阻塞赋值
阻塞赋值使用的赋值运算符为“=”。阻塞赋值的过程是立刻执行的,即阻塞赋值运算符右侧表达式求值完后立刻会更新至运算符左侧,并且这个执行的过程不受其他语句执行的影响,其后的语句只有当前的赋值操作执行完成后才能顺序执行。
2 非阻塞赋值
非阻塞赋值使用的赋值运算符为“<=”。非阻塞赋值执行过程为:在当前仿真时间槽(time-slot)开始分析计算获得右侧表达式的值,在当前时间槽执行结束时更新左侧表达式的值,在右侧表达式分析计算和左侧表达式被更新之间,任何其他事件都可以执行,同时也有可能修改已经计算完成的右侧表达式的值,即非阻塞赋值的过程不影响其他语句的执行.
根据非阻塞赋值的特点,其赋值运算符左侧操作数只能为寄存器类型,因此非阻塞赋值只能用于过程性语句中(initial和always),不允许在连续赋值语句中使用非阻塞赋值。
3 阻塞赋值与非阻塞赋值区别
更多资讯,请关注下方二维码!
以上是关于RTL基本知识:阻塞赋值与非阻塞赋值的主要内容,如果未能解决你的问题,请参考以下文章