「BUAA-CO」P1_Verilog阻塞和非阻塞赋值的讨论


概念区别

  1. 阻塞赋值操作符用等号(即 = )表示。“阻塞”是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量。

    也就是说:赋值时先计算等号右手方向(RHS)部分的值,这时赋值语句不允许任何别的Verilog语句的干扰,直到现行的赋值完成时刻,即把RHS赋值给 LHS的时刻,它才允许别的赋值语句的执行。

  2. 非阻塞赋值操作符用小于等于号 (即 <= )表示。“非阻塞”是指在进程语句(initial和always)中,当前的赋值语句不会阻断其后的语句。非阻塞语句可以认为是分为两个步骤进行的:

    • 计算等号右边的表达式的值,(我的理解是:在进入进程后,所有的非阻塞语句的右端表达式同时计算,赋值动作只发生在顺序执行到当前非阻塞语句那一刻)。

    • 在本条赋值语句结束时,将等号右边的值赋给等号左边的变量。

    也就是说:在赋值操作时刻开始计算非阻塞赋值符的RHS表达式,赋值操作时刻结束更新LHS。在计算非阻塞赋值的RHS表达式和更新LHS期间,其他的Verilog语句,包括其他的Verilog非阻塞赋值语句都能同时计算RHS表达式和更新LHS。非阻塞赋值允许其他的Verilog语句同时进行操作。

层次化队列事件

层次化事件队列是硬件仿真(Simulation)时,用于规定“不同事件执行的优先级关系”,在这里我们可以一般将一个事件理解为需要运行的一条语句(当然,有的语句由多个事件组成,例如非阻塞赋值需要被拆分为计算等号右边的值(RHS)和将结果赋予等号的左边变量(LHS),赋值事件在计算事件执行结束时才能加入队列。根据事件的优先级,Verilog 将其分为 4 个队列(队列间的优先级不同,从上到下优先级依次递减,只有当优先级高的队列中所有任务完成后,才会继续完成优先级较低的任务

  1. 动态事件队列(动态事件队列在队列内部执行顺序无硬性规定,但在同一个 begin - end 语句块中的语句应当严格按照源代码中的顺序执行;且多个非阻塞赋值应当按照语句执行顺序进行)
    • 阻塞赋值
    • 计算非阻塞赋值语句右边的表达式(RHS)
    • 连续赋值(如 assign)
    • 执行 display 命令
    • ……
  2. 停止运行的时间队列(#0)(不推荐使用)
  3. 非阻塞事件队列:更新非阻塞赋值语句 LHS(左边变量)的值。
  4. 监控事件队列(执行 monitor,strobe 命令)
    ## 注意事项
  5. 阻塞赋值是按需执行,非阻塞赋值是并行执行。
  6. 阻塞赋值和后面的赋值语句只有概念上的先后,而无实质上的延迟。 若在RHS 加上延迟,则在延迟期间会阻止赋值语句的执行, 延迟后才执行赋值,这种赋值语句是不可综合的。
  7. 一般可综合的阻塞赋值操作在RHS不能设定有延迟,(即使是零延迟也不允许)
  8. 非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在"initial"块和"always"块等过程块中。非阻塞赋值不允许用于连续赋值。

可综合风格的Verilog编程原则

  1. 时序电路建模时,用非阻塞赋值。
  2. 锁存器电路建模时,用非阻塞赋值。
  3. 用always块建立组合逻辑模型时,用阻塞赋值。
  4. 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。
  5. 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。
  6. 不要在一个以上的always块中为同一个变量赋值。
  7. 用$strobe系统任务来显示用非阻塞赋值的变量值
  8. 在赋值时不要使用 #0 延迟

赋值延后的情况

  1. 当在always块中的每一个条件分支中,仅有一条赋值语句(不管是阻塞与非阻塞),且要满足条件中的条件判断式不含有在本模块中定义并赋值的reg变量(采用非阻塞赋值)或者来自其他模块的非阻塞reg型信号,此时阻塞与非阻塞表现的结果是一样的,都是在时钟边沿瞬间完成的;

    理解非阻塞赋值分两个过程,RHS的计算为第一步,LHS的赋值为第二步,这是第一层面;第二,由于两步时间非常短,表现出来就是在时钟边沿瞬间完成,故表现结果非阻塞和阻塞一样,这是第二个层面。

  2. 当条件分支语句中含有的条件判断式是阻塞赋值变量(无论是外部输入的数据,或者是本模块的阻塞赋值变量,此时也包括assign赋值语句的LHS),那么也是在边沿瞬间完成赋值,不会延后1个周期;

    NOTE:assign赋值语句为连续赋值语句,与过程赋值语句并列(过程赋值包括阻塞与非阻塞)。

  3. 如果条件判断式中含有非阻塞赋值的reg变量(无论是本模块的还是其他外部模块的),那么在该条件分支下的非阻塞赋值语句会延后一个周期完成(相对条件判断式中的变量的赋值完成,延后一个周期赋值)。

  4. 一个条件分支中含有多条非阻塞语句时,若non1(第一条LHS)出现在第二条语句的RHS中,则会出现non2延迟一个周期的情况,
    ————————————————
    原文链接:https://blog.csdn.net/huigeyu/article/details/100105428


文章作者: Hyggge
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hyggge !
  目录