sk2400

《Verilog HDL 综合实用教程》读书笔记——阻塞与非阻塞(补充)

0
阅读(8572)

组合逻辑用阻塞式赋值,时序逻辑用非阻塞式赋值(当对变量的赋值和引用都在同一条always中时,可以采用阻塞式)。
 
    阻塞赋值的组合逻辑:
        reg TM,TN,TO,TZ;
        always @ (A or B or C or D or E)
         begin
           TM = A & B;
           TN = C & D;
           TO = TM|TN|E;
           TZ = !TO;
         end
    阻塞式是计算A & B之后立即更新TM的值。既TO使用的是当前的A与B的结果。如果是用非阻塞:
        reg TM,TN,TO,TZ;
        always @ (A or B or C or D or E)
         begin
           TM <= A & B;
           TN <= C & D;
           TO <= TM|TN|E;
           TZ <= !TO;
         end
   A & B的值在当前仿真周期结束之后被赋给TM,所以TO使用的是上一时刻的A与B。若要使非阻塞和阻塞的结果一样,要将非阻塞的always事件表中加入TM、TN、TO:
   always @ (A or B or C or D or E or TM or TN or TO)这样每次TM、TN、TO变化时也要执行这段代码。(但使用ISE6.3对以上三种情况综合的结果完全相同)
 
    又若有这种情况:
       always @ (posedge ClkA)
         ... = DataOut;
 
       always @ (posedge ClkA)
         DataOut = ...;
    两个进程的执行顺序不定,所以改成:
       always @ (posedge ClkA)
         ... = DataOut;
 
       always @ (posedge ClkA)
         DataOut <= ...;
 
       (具体情况具体分析啊)