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