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操作的基本类型,在设计和激励中都具有重要作用。了解这两个类型的区别,可以有效地减少设计中出现端口声明的错误现象发生。
======== ======\\ ======= -
|| || \\ // \\ /-\
|| || || // // \\
|| || // || // \\
====== ======= || === ========
|| || || \\ // \\
|| || \\ || // \\
|| || \\ // // \\
|| || ======= // \\
作者:绿叶落秋风,专注FPGA技术分析和分享,转载请注明原文链接:https://www.cnblogs.com/electricdream/p/12918183.html,文中资源链接如下:
1. GITHUB开源仓库