Verilog中parameter、define、localparam的區別
阿新 • • 發佈:2018-12-11
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定義的變數在本模組中有效,不可用於模組例化時引數的傳遞,常用來定義一些狀態機常量,其他模組也可以定義這些變數,相互之間是無關的;