天天看點

Verilog在設計輸入定義信号時,什麼時候用wire?什麼時候用reg?

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

繼續閱讀