zoukankan      html  css  js  c++  java
  • 阻塞与非阻塞verilog

    前几天看到一个很不错的博客,关于阻塞与非阻塞的精华部分。

    --------------------------------------------------------

    阻塞赋值“=”与非阻塞赋值“<=”的本质区别在于:非阻塞赋值语句右端表达式计算完后并不立即赋值给左端,而是同时启动下一条语句继续执行,我们 可以将其理解为所有的右端表达式RHS1、RHS2等在进程开始时同时计算,计算完后 ,等进程结束时同时分别赋给左端变量LHS1、LHS2等。
            而阻塞赋值语句在每个右端表达式计算完后立即赋给左端变量,即赋值语句LHS1=RHS1执行完后LHS1是立即更新的,同时只有LHS1=RHS1执行 完后才可执行语句LHS1=RHS2,依次类推。前一条语句的执行结果直接影响到后面语句的执行结果。
            非阻塞赋值不能用于“assign”持续赋值中。阻塞赋值则既能用于“assign”持续赋值,也能用于“initial”和“always”等过程块 中,阻塞赋值则技能用于“assign”持续赋值,也嗯那个用于“initial”和“always”等过程赋值中。
    对于时许逻辑描述和建模,应尽量使用非阻塞赋值方式。

    ——
    用阻塞赋值方式描述了一个移位寄存器:

    EX1:
    module weise1(Q0,Q1,Q2,Q3,din,clk);
    output Q0,Q1,Q2,Q3;
    input clk,din;
    reg Q0,Q1,Q2,Q3;
    always @(posedge clk)
        begin
        Q3=Q2;
        Q2=Q1;
        Q1=Q0;
        Q0=din;
        end
    endmodule

    其RTL综合结果:

    将上面例子中的阻塞赋值语句保持不变,仅仅将其两条语句的排列顺序改一下的话,则综合器综合的结果就会大不同。

    EX2:
    module weise1(Q0,Q1,Q2,Q3,din,clk);
    output Q0,Q1,Q2,Q3;
    input clk,din;
    reg Q0,Q1,Q2,Q3;
    always @(posedge clk)
        begin
        Q3=Q2;
        Q1=Q0;
        Q2=Q1;
        Q0=din;
        end
    endmodule

    其RTL综合结果:

    将四条阻塞赋值语句的顺序完全颠倒的话,则综合器实际上等效成一个触发器。

    EX3:
    module weise1(Q0,Q1,Q2,Q3,din,clk);
    output Q0,Q1,Q2,Q3;
    input clk,din;
    reg Q0,Q1,Q2,Q3;
    always @(posedge clk)
        begin
        Q0=din;
        Q1=Q0;
        Q2=Q1;
        Q3=Q2;
        end
    endmodule

    其RTL综合结果:

    而用非阻塞赋值方式描述的移位寄存器,无论将其“always”过程块中四条赋值语句的顺序怎么变动,均不会影响其综合几个,其结果与第一个例子的结果相 同。对于时许逻辑描述和建模,应尽量使用非阻塞赋值方式。此外,若在同一个“always”过程块中描述时许和组合逻辑混合电路时,也最好使用非阻塞赋值 方式。

    ——

            非阻塞赋值不能用于“assign”持续赋值中,一般只出现在“initial”和“always”等过程块中,对reg型变量进行赋值。像assign out<=a+b;这样的语句是错误的。
            当用“always”块来描述组合逻辑时,既可以用阻塞赋值,也可以采用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值,虽然同时使用这两种赋值方式在综合时并不一定会出错。
    在向函数(function)的返回值赋值时,应使用阻塞赋值“=”。
            不能在一个以上的“always”过程块中对同一个变量赋值,这样会引起冲突,在综合时会报错。
            在一个模块中,严禁对同一个变量既进行阻塞赋值,又进行非阻塞赋值,这样在综合时会报错。
            对时序逻辑描述和建模,应尽量使用非阻塞赋值方式,此外,若在同一个“always”过程块中描述时序和组合逻辑混合电路时,也最好使用非阻塞赋值方式。

  • 相关阅读:
    magento 产品目录全部修改 :
    zencart 支付流程总结
    去掉 power by ecshop的方法
    ECSHOP实现收货国家省市由选择下拉菜单改为手动
    MYSQL的随机抽取实现方法
    Ecshop中导航栏中使用二级菜单显示并调用子分类
    打包遇到的问题
    jQuery is not defined问题
    实现表格中每行展开收起内容
    jQuery对象与DOM对象的相互转化
  • 原文地址:https://www.cnblogs.com/habyjingloveDY/p/3370543.html
Copyright © 2011-2022 走看看