1. 程式人生 > >Verilog中parameter、define、localparam的區別

Verilog中parameter、define、localparam的區別

1、首先講講語法方面的不同

(1)、parameter常量的定義和使用

parameter constant_name = constant_value;

本模組使用:用constant_value去代替常量的值

例項模組使用:通過 #(  .變數名1(變數值1), .變數名2(變數值2),    ........)使用

           module_name   #(   .W(4)  ,  .N(10)    )    module_instance(

             埠連線;

               )

parameter DATA_WIDTH = 8;   // 定義資料位的寬度
parameter ADDR_WIDTH = 16;   // 定義地址位的寬度
parameter CNT_MAX = 25'd24_999_999;  //定義計數最大值

//下面三個都可以
#(
	parameter WIDTH = 3,N = 5
)
parameter WIDTH = 3,N = 5;

parameter WIDTH = 3;
parameter N = 5;


呼叫
用CNT_MAX取代模組中的常量25'd24_999_999的值


cnt
#( 
     .WIDTH(4),.N(10)   // 將模組的常量引數值改變了
)
cnt_ins
(
    .CLK(CLK)
    .RST_N(RST_N)
    .CLK_OUT(CLK_OUT)
)

(2)、`define常量的定義

`define    constant_name   constant_value   //後面不要分號

//定義

`define     IADDR_WRITE    0x222
`define     BAUD_RATE      10'd530
`define     UART_CNT       10'd1024
`define     DATA_WIDTH     8

//使用

addr <= (`IADDR_WRITE)

if(!Rst_n)
   addr <= (DATA_WIDTH)'d0;


   

(3)、localparam常量的定義

localparam constant_name  =  constant_value;  // 跟parameter常量定義是一樣的

// 一般用於狀態機的定義,本模組中有效,不能用於例化引數傳遞
localparam    IDLE = 8'b0000_0000,
              S1   = 8'b0000_0001,
              S2   = 8'b0000_0010,
              S3   = 8'b0000_0100,
              S4   = 8'b0000_1000,
              S5   = 8'b0001_0000
              S6   = 8'b0010_0000,
              S7   = 8'b0100_0000,
              S8   = 8'b1000_0000;

localparam  
        R_IDLE         =  4'b0001,         //初始化等待狀態
        R_START        =  4'b0010,         //接收到起始位0(還要判斷是否為資料抖動)
        R_SAMPLE       =  4'b0100,         //接收資料
        R_STOP         =  4'b1000;         //等待停止位結束,回到初始化狀態
              
    

2、概念上的不同

parameter 定義的變數在本模組中有效,還可以用於模組例化時引數的傳遞;

`define變數跟C的巨集定義比較類似,生命週期可以跨模組,常定義一些各個模組間公用的常量,如暫存器地址,行地址,場i地址;

localparam定義的變數在本模組中有效,不可用於模組例化時引數的傳遞,常用來定義一些狀態機常量,其他模組也可以定義這些變數,相互之間是無關的;