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操作的基本类型,在设计和激励中都具有重要作用。了解这两个类型的区别,可以有效地减少设计中出现端口声明的错误现象发生。

猜你喜欢

转载自www.cnblogs.com/electricdream/p/12918183.html