• blocking and nonblocking


     1 module    sort3
     2 (
     3     data_in1,data_in2,data_in3,
     4     data_out1,data_out2,data_out3,
     5     clk,reset
     6 );
     7 
     8 output    [7:0]        data_out1,data_out2,data_out3;
     9 input        [7:0]        data_in1,data_in2,data_in3;
    10 input                    clk,reset;
    11 
    12 reg        [7:0]        data_out1,data_out2,data_out3;
    13 reg        [7:0]        data_tempt1,data_tempt2,data_tempt3;
    14 
    15 always @ (posedge clk)
    16     if(!reset)
    17         begin
    18             data_out1    <=    1'b0;
    19             data_out2    <=    1'b0;
    20             data_out3    <=    1'b0;
    21         end
    22     else
    23         begin
    24             {data_tempt1,data_tempt2,data_tempt3}={data_in1,data_in2,data_in3};
    25             sort2(data_tempt1,data_tempt2);
    26             sort2(data_tempt1,data_tempt3);
    27             sort2(data_tempt2,data_tempt3);
    28             {data_out1,data_out2,data_out3}={data_tempt1,data_tempt2,data_tempt3};
    29         end
    30         
    31 task    sort2;
    32     inout        [7:0]        x,y;
    33     reg        [7:0]        temp;
    34     if(x > y)
    35         begin
    36             temp    =    x;
    37             x        =    y;                    //因为需要做数据交换,所以用blocking赋值
    38             y        =    temp;
    39         end
    40 endtask
    41 
    42 endmodule

    数字排序,用到了blocking,仿真结果正确。

     1 module    sort3
     2 (
     3     data_in1,data_in2,data_in3,
     4     data_out1,data_out2,data_out3,
     5     clk,reset
     6 );
     7 
     8 output    [7:0]        data_out1,data_out2,data_out3;
     9 input        [7:0]        data_in1,data_in2,data_in3;
    10 input                    clk,reset;
    11 
    12 reg        [7:0]        data_out1,data_out2,data_out3;
    13 reg        [7:0]        data_tempt1,data_tempt2,data_tempt3;
    14 
    15 always @ (posedge clk)
    16     if(!reset)
    17         begin
    18             data_out1    <=    1'b0;
    19             data_out2    <=    1'b0;
    20             data_out3    <=    1'b0;
    21         end
    22     else
    23         begin
    24             {data_tempt1,data_tempt2,data_tempt3}={data_in1,data_in2,data_in3};
    25             sort2(data_tempt1,data_tempt2);
    26             sort2(data_tempt1,data_tempt3);
    27             sort2(data_tempt2,data_tempt3);
    28             {data_out1,data_out2,data_out3}={data_tempt1,data_tempt2,data_tempt3};
    29         end
    30         
    31 task    sort2;
    32     inout        [7:0]        x,y;
    33     reg        [7:0]        temp;
    34     if(x > y)
    35         begin
    36         temp        <=    x;
    37             x        <=    y;                    //因为需要做数据交换,所以用blocking赋值
    38             y        <=    temp;
    39         end
    40 endtask
    41 
    42 endmodule

     nonblocking仿真结果错误。

    在编写时牢记这八个要点可以为绝大多数的
    Verilog 用户解决在综合后仿真中出现的 90-100% 的冒险竞争问题。
    1) 时序电路建模时,用非阻塞赋值。
    2) 锁存器电路建模时,用非阻塞赋值。
    3) 用 always 块建立组合逻辑模型时,用阻塞赋值。
    4) 在同一个 always 块中建立时序和组合逻辑电路时,用非阻塞赋值。
    5) 在同一个 always 块中不要既用非阻塞赋值又用阻塞赋值。
    6) 不要在一个以上的 always 块中为同一个变量赋值。
    7) 用$strobe 系统任务来显示用非阻塞赋值的变量值
    8) 在赋值时不要使用 #0 延迟

  • 相关阅读:
    cgo中调用有函数指针参数的C函数
    为什么要微服务架构服务化?
    学习刘杨人像后期笔记纪要
    错误日志表设计
    通过jstack日志分析和问题排查
    【JVM】jmap命令详解----查看JVM内存使用详情
    【JVM】jstat命令详解---JVM的统计监测工具
    介绍几种常用的监控工具
    【转】Pinpoint分布式系统性能监控工具
    【转】Skywalking概述
  • 原文地址:https://www.cnblogs.com/wangbin0729/p/13268980.html
Copyright © 2020-2023  润新知