一、module內部有效的定義
用parameter來定義一個標志符代表一個常量,稱作符號常量,他可以提高程序的可讀性和可維護性。parameter是參數型數據的關鍵字,在每一個賦值語句的右邊都必須是一個常數表達式。即該表達式只能包含數字或先前已經定義的參數。
parameter msb=7; //定義參數msb=7
parameter r=5.7; //定義r為一個實型參數5.7
parameter byte_size=8,byte_msb=byte_size-1; //利用常數表達式賦值
參數型常量經常用於定義延遲時間和變量寬度。在模塊和實例引用時,可以通過參數傳遞改變在被引用模塊或實例中已經定義的參數。
1 module exam_prj 2 #(parameter WIDTH=8) 3 //端口內的參數只能在這使用 4 ( 5 input [WIDTH-1:0] dataa,//[WIDTH-1:0] 6 input [WIDTH-1:0] datab, 7 8 output reg [WIDTH:0] result 9 );
parameter Conuter_Top = 4'd9;//用於代碼部分的參數 //代碼部分省略
這里出現的兩個參數parameter,第一個表示只在端口設置時使用,后面的是對於模塊內部的使用。
二、參數傳遞
傳遞的方法:
1、module_name #( parameter1, parameter2) inst_name( port_map);
1 module adder_16(sum,a,b); 2 parameter time_delay=5,time_count=10; 3 ...... 4 endmodule 5 module top; 6 wire[2:0] a1,b1; 7 wire[3:0] a2,b2,sum1; 8 wire[4:0] sum2; 9 adder_16 #(4,8) AD1(sum1,a1,b1);//time_delay=4,time_count=8 10 endmodule
2、module_name #( .parameter_name(para_value), .parameter_name(para_value)) inst_name (port map);
1 //module exam_prj_tb; 2 3 exam_prj//--------- 4 #( 5 .WIDTH(8), 6 .Conuter_Top(4'd5) 7 ) 8 exam_prj_inst//------*注意例化時的名字在這個位置* 9 ( 10 .dataa(dataa), 11 .datab(datab), 12 13 .result(sum) 14 );
3、在多層次的模塊中,改變參數需要使用defparam命令。 defparam Test.T.B1.P=2; //Test、T、B1分別是高層模塊中的底層模塊實例。
參數需要寫絕對路徑來指定。
三、子模塊調用子模塊
1 module Sub_Sub_Modu; 2 parameter W1=4; 3 ... 4 5 endmodule 6 7 module Sub_modu; 8 parameter W=8; 9 ... 10 Sub_Sub_Modu #(W) ( ); 11 ... 12 endmodue 13 14 module Main_Modu ; 15 ... 16 Sub_Modu #(16) ; //這樣W和W1都是16位 17 .. 18 endmodue