总的来讲,在功能文件中,always块中被赋值的信号必须定义成reg型,而在testbench文件中,输入信号(时钟信号、复位信号和测试模块的输入信号)须要定义为reg型,其它情况都定义为wire型。
在verilog中,可以把wire理解成一根物理的连线,用来连接电路(Verilog文本设计综合成的就是“电路")。只能用于assign左侧赋值,不能在always块中赋值,描述的时组合逻辑。
而reg型可以综合成寄存器、锁存器,甚至于物理连线,可用来存储数据,连接数据等。在always块中左侧赋值,描述的即可能是时序逻辑也可能是组合逻辑。
/*****************案例一:功能文件中***********************************/
//信号定义
reg [12:0] cnt_baud ;//cnt_baud在always块中在左侧赋值,定义为reg型
wire add_cnt_baud;//add_cnt_baud在assign语句左侧赋值,定义为wire型
wire end_cnt_baud;//end_cnt_baud在assign语句左侧赋值,定义为wire型
//波特率计数器
always @(posedge clk or negedge rst_n)begin //时序逻辑
if(!rst_n)begin
cnt_baud <= 0;
end
else if(add_cnt_baud)begin
if(end_cnt_baud)begin
cnt_baud <= 0;
end
else begin
cnt_baud <= cnt_baud + 1;
end
end
end
assign add_cnt_baud = flag; //组合逻辑
assign end_cnt_baud = add_cnt_baud && cnt_baud == baud-1;//组合逻辑
/*****************案例二:testbench中***********************************/
//时钟复位 reg型
reg clk ;
reg rst_n ;
//输入 reg型
reg [7:0] tx_din ;
reg tx_din_vld ;
reg key ;
//输出 wire型
wire busy ;
wire tx_bit ;
//模块例化
uart_tx u_tx(
/*input */.clk (clk ),
/*input */.rst_n (rst_n ),
/*input */.tx_byte_vld (tx_din_vld),
/*input [7:0] */.tx_byte (tx_din ),
/*output */.busy (busy ),
/*output */.tx_dout (tx_bit )
);