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类型数据需要使用过程赋值(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类型是在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。