總的來講,在功能檔案中,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 )
);