zoukankan      html  css  js  c++  java
  • verilog之wire和reg

    verilog之wire和reg

    1、区别

    wire为线,reg为寄存器。至少初期这两个名词的意思是这样的。wire在电路设计中指代的就是某个点的逻辑值,而reg则指代某个寄存器输出的逻辑值。这个理解可以覆盖大部分的使用。而不在这一范围内的就是使用always写组合逻辑。这时的reg具备的只有语法意义,而没有电路意义。always块内要求使用reg类型,拓展了always的用法,但是降低了verilog与电路的对应性。

    在端口声明中,wire是输入的唯一类型。可以从电路来理解,reg变量只有存在被赋值的语句才有意义,如果使其作为模块的输入,那么这个reg变量就会需要在模块内写输入的赋值,显然不合理。没有赋值的reg就是wire。至于输出,则是可以选择reg和wire。reg可以使用,是模块内有reg的赋值语句。如果没有,编译器会警告然后将该端口在RTL视图中剥离。好像一些编译器会直接删除这部分语句。wire自然也可以。wire在模块内肯定有连线。

    同样,在激励文件中,reg作为其他模块的输入,也是基于要在激励文件中编写其他模块的输入。输出则是默认wire类型。这里主要防止模块输出为reg。reg和reg在端口相连是非法的。这里可能是考虑到reg变量的赋值只能在always等结构中,端口处显然不存在这一结构。

    2、使用

    通过前面的总结可以看到使用中的结构是:

    源文件:

    module test(
     input wire a,
     output wire/reg b
    );
    //===========
    endmodule

    激励文件

    module test_tb;
    reg a_in;
    wire b_out;
    test U1(
     .a(a_in),
     .b(b_out)
    );
    //////////////
    endmodule

    上层文件:

    module test_top(
    //////////////////
    );
    reg/wire a_in;
    wire b_out
    test U2(
     .a(a_in),
     .b(b_out)
    );
    endmodule

    小总结:在端口声明中,一定是reg数据向外输出,绝对不能出现数据向reg输入。wire则随便,可进可出。简而言之就是reg只出不进,wire可出可进。

    3、作用

    reg和wire作为verilog操作的基本类型,在设计和激励中都具有重要作用。了解这两个类型的区别,可以有效地减少设计中出现端口声明的错误现象发生。

  • 相关阅读:
    maven完成构建后,eclipse导入运行maven web
    maven构建java项目的过程【完全】
    maven配置【转载】
    iOS - 移动设备防丢失App
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
  • 原文地址:https://www.cnblogs.com/electricdream/p/12918183.html
Copyright © 2011-2022 走看看