Verilog中#的另外一种用法:模块外定义常参#(parameter ...)以及调用时修改参数#(10,2)

简介

Verilog中用web

parameter 常参名(通常全大写) 常数

语句来定义常参,parameter的位置也比较灵活,本文主要介绍一种在model的描述代码块外定义的常参。例子以下:svg

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 函数名后紧跟#()括号内正常定义常参,这种状况通常适用于须要在端口内定义常参的状况,但代码部分依旧能够使用。函数

有时候咱们还会在模块实例化调用时看到以下状况:code

模块名 #(10,2,....) 实例名 (参数传递)

即在调用模块时能够经过#(常数,常数,…)来从新定义被调用模块的常参的值,一般状况下一一对应便可,当定义的常参过多时能够采用以下方法来修改(相似于传参):xml

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模块参数定义以下input

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
) ;

看其余博主的文章时发现好像修改的常参并不必定只能是模块外定义的,以下代码:it

module top ( .....)
input....;
output....;
M1 #( 10 ) U1 (..........);
endmodule

module M1(....);
parameter para1 = 5 ;
input...;
output...;
......
endmodule

因此模块内参数也是能够经过#()来修改的。io