Verilog中用
parameter 常参名(一般全大写) 常数
语句来定义常参,parameter的位置也比较灵活,本文主要介绍一种在model的描述代码块外定义的常参。例子如下:
module exam_prj
#(parameter WIDTH=8) //端口内的参数只能在这定义
(
input [WIDTH-1:0] dataa,//[WIDTH-1:0]
input [WIDTH-1:0] datab,
output reg [WIDTH:0] result
);
Parameter Counter_Top = 4’d9; //用于代码部分的参数
//代码部分省略
在model 函数名后紧跟#()括号内正常定义常参,这种情况一般适用于需要在端口内定义常参的情况,但代码部分依旧可以使用。
有时候我们还会在模块实例化调用时看到如下情况:
模块名 #(10,2,....) 实例名 (参数传递)
即在调用模块时可以通过#(常数,常数,…)来重新定义被调用模块的常参的值,通常情况下一一对应即可,当定义的常参过多时可以采用如下方法来修改(类似于传参):
PROBE_SIGNAL_GEN
# (
.P_NUM_OF_EVENT ( 8 ) , // 8 event per group
.P_NUM_OF_BRANCH_EVENT0000 ( 8 ) , // event0000 is 8 branch
.P_NUM_OF_BRANCH_EVENT0001 ( 8 ) , // event0001 is 8 branch
.P_NUM_OF_BRANCH_EVENT0002 ( 8 ) , // event0002 is 8 branch
.P_NUM_OF_BRANCH_EVENT0003 ( 8 ) , // event0003 is 8 branch
.P_NUM_OF_BRANCH_EVENT0004 ( 8 ) , // event0004 is 8 branch
.P_NUM_OF_BRANCH_EVENT0005 ( 8 ) , // event0005 is 8 branch
.P_NUM_OF_BRANCH_EVENT0006 ( 8 ) , // event0006 is 8 branch
.P_NUM_OF_BRANCH_EVENT0007 ( 8 ) , // event0007 is 8 branch
.P_MAX_NUM_OF_INTERVAL ( 150 ) , // 150 -> 8-bit counter(max 255)
.P_INTERVAL_COUNT0000 ( 10 ) , // event0000 initial interval
.P_INTERVAL_COUNT0001 ( 20 ) , // event0001 initial interval
.P_INTERVAL_COUNT0002 ( 30 ) , // event0002 initial interval
.P_INTERVAL_COUNT0003 ( 40 ) , // event0003 initial interval
.P_INTERVAL_COUNT0004 ( 50 ) , // event0004 initial interval
.P_INTERVAL_COUNT0005 ( 60 ) , // event0005 initial interval
.P_INTERVAL_COUNT0006 ( 70 ) , // event0006 initial interval
.P_INTERVAL_COUNT0007 ( 80 ) // event0007 initial interval
)
PROBE_SIGNAL_GEN_000
(
.clk_in ( clk_in ) ,
.error_injection ( error_injection_group_000 ) ,
.timeout_injection ( timeout_injection_group_000 ) ,
.event_OR ( event_group_000 )
) ;
其中PROBE_SIGNAL_GEN模块参数定义如下
module PROBE_SIGNAL_GEN
# (
parameter P_NUM_OF_EVENT = 8 , //
parameter P_NUM_OF_BRANCH_EVENT0000 = 8 , //
parameter P_NUM_OF_BRANCH_EVENT0001 = 8 , //
parameter P_NUM_OF_BRANCH_EVENT0002 = 8 , //
parameter P_NUM_OF_BRANCH_EVENT0003 = 8 , //
parameter P_NUM_OF_BRANCH_EVENT0004 = 8 , //
parameter P_NUM_OF_BRANCH_EVENT0005 = 8 , //
parameter P_NUM_OF_BRANCH_EVENT0006 = 8 , //
parameter P_NUM_OF_BRANCH_EVENT0007 = 8 , //
parameter P_MAX_NUM_OF_INTERVAL = 110 , //
parameter P_INTERVAL_COUNT0000 = 10 , //
parameter P_INTERVAL_COUNT0001 = 20 , //
parameter P_INTERVAL_COUNT0002 = 30 , //
parameter P_INTERVAL_COUNT0003 = 40 , //
parameter P_INTERVAL_COUNT0004 = 50 , //
parameter P_INTERVAL_COUNT0005 = 60 , //
parameter P_INTERVAL_COUNT0006 = 70 , //
parameter P_INTERVAL_COUNT0007 = 80 //
)
(
input wire clk_in , //
input wire error_injection , //
input wire timeout_injection , //
output wire event_OR // monitor output
) ;
看其他博主的文章时发现好像修改的常参并不一定只能是模块外定义的,如下代码:
module top ( .....)
input....;
output....;
M1 #( 10 ) U1 (..........);
endmodule
module M1(....);
parameter para1 = 5 ;
input...;
output...;
......
endmodule
所以模块内参数也是可以通过#()来修改的。