当前位置: 首页 > 工具软件 > reg > 使用案例 >

reg、wire与logic的区别

杜阳炎
2023-12-01

一、wire

wire类型设计时表示导线结构,它不存储状态,只能负责传递驱动级的输出。wire型数据常用来表示用以assign关键字指定的组合逻辑信号。Verilog程序模块中输入、输出信号类型默认时自定义为wire型。wire型信号可以用做任何方程式的输入,也可以用做“assign”语句或者实例原件的输出。

<font color=#999AAA >wire   [n-1:0]      my_wire0,my_wire1,...,my_wirem-1;   //定义了m条总线,每条线位宽为n。
wire   my_wire= A & B; //assign组合逻辑,定义了一个输出信号mysignal0,A、B两个输入驱动。

二、reg

reg类型设计用于表示存储结构,它内部存储状态,并在时钟沿到来或异步信号改变等条件触发时改变内部状态。reg类型数据需要使用过程赋值(procedural assignment),即赋值定义在always、initial、task或function语法块中。reg类型数据默认初始值为不定值x。reg虽然是寄存器类型,但也可能被综合工具综合为组合逻辑。
reg类型通常用于always模块中的指定信号,always块中每个被赋值的信号必须是reg类型,输入信号不做要求。

reg   [n-1:0]      my_reg0,my_reg1,...,my_regm-1;  //定义了m个寄存器,每寄存器位宽为n。
reg		[7:0]			my_reg0,my_reg1;
wire					my_reg= A & B;    //连续赋值
always@(posedge clk,negedge rst)begin
if(!rst)begin
	reg0<=8'd0;
	reg1<=8'd0;
end
else begin
	reg0<=mysignal;
	reg1<=reg0;
end
end

三、logic

logic类型是在reg类型基础上进行改进,使得它除了作为一个寄存器变量外,还可以被连续赋值、门单元和模块所驱动。任何使用wire线网类型的地方都可以使用logic,但是logic类型不能有多个结构性的驱动。
wire定义时赋值是连续赋值,而logic定义时赋值只是赋初值,并且赋初值是不能被综合的。

logic  [7:0] my_logic0,my_logic1,...,my_logicm;  //定义了m个logic类型,每个位宽为n。
logic    my_logic =A & B; //在0时刻将mysignal1初始化为A & B的值,然后不再对其做进一步的更改。
wire     my_wire = A & B;   //连续赋值,与门。
module  logic _data_type(input logic rst_h);
	parameter  CYCLE=20;
	logic  q,q_l,d,clk,rst_l;
	initial begin
		clk=0;        //过程赋值
		forever # (CYCLE/2) clk=~clk;
	end
	assign   rst_l=~rst_h;    //连续赋值
	not  n1(q_l,q);           //q_l被门驱动
	my_dff d1(q,d,clk,rst_l);  //q被模块驱动
endmodule

四、总结

所以总结Verilog wire和reg的区别:

wire表示导线结构,reg表示存储结构。
wire使用assign赋值,reg赋值定义在always、initial、task或function代码块中。
wire赋值综合成组合逻辑,reg可能综合成时序逻辑,也可能综合成组合逻辑。

所以总结SystemVerilog logic的使用方法:
单驱动时logic可完全替代reg和wire。
多驱动时,如inout类型端口,使用wire。

 类似资料: