verilog-2001的标准,标准中对wire和reg的讲述如下:
wire:
A wire net can be used for nets that are driven by a single gate or continuous assignment.
reg:
Assignments to a reg are made by procedural assignments (see 6.2 and 9.2). Since the reg holds a value
between assignments, it can be used to model hardware registers. Edge-sensitive (i.e., flip-flops) and level
sensitive (i.e., RS and transparent latches) storage elements can be modeled. A reg needs not represent a
hardware storage element since it can also be used to represent combinatorial logic.
对组合逻辑输出变量,可以直接用assign。即如果不指定为reg类型,那么就默认为1位wire类型,故无需指定1位wire类型的变量。
当然专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。
比如:
module lddata(clk,rst,cs,din,dout,tmpdata);
input clk, rst,cs;
input din;
output dout,tmpdata;
reg tmpdata;
always@(posedge clk or negedge rst)
if(!rst)
tmpdata <=0;
else
tmpdata<= din;
assign dout = tmpdata|cs;
endmodule
其实他们是不同的抽象级别,wire 如同vhdl中的signal类型,是和实际的物理连接对应的,而reg属于算法描述层次用的类型,和实际电路没有直接的对应关系,也就是说它相当于c语言中的变量(int,float等),vhdl中的variable。reg不和实际的电路如寄存器对应,高层次的描述时用。而always其实算是算法级描述的语句,所以其中的变量必须声明为reg
比如:一个简单的组合逻辑的例子,用了reg类型
module mux(a,b,c,sel);
input a,b,sel;
output c;reg c;
always @(sel or a or b)
if(sel ==1'b0) c="a";
else c="b";
endmodule;
这个综合出来就是一个简单的二选一选择器,组合逻辑电路
看它描述的方式,是不是就是把电路的行为(功能)描述出来了,这种就是算法级描述
wire表示直通,即输入有变化,输出马上无条件地反映(如与、非门的简单连接)。reg表示一定要有触发,没有输入的时候可以保持原来的值,但不直接实际的硬件电路对应(并非不能生成实际电路)。
文章评论(0条评论)
登录后参与讨论