parameter与localparam的使用

:parameter可用作在顶层模块中例化底层模块时传递参数的接口,localparam的作用域仅仅限于当前module,不能作为参数传递的接口。

[plain] view plain copy
 
  1. `timescale 1ns/100ps  
  2.   
  3. module mem (  
  4.   
  5.   clka,  
  6.   wea,  
  7.   addra,  
  8.   dina,  
  9.   
  10.   clkb,  
  11.   addrb,  
  12.   doutb);  
  13.   
  14.   parameter       DATA_WIDTH = 16;  
  15.   parameter       ADDR_WIDTH =  5;  
  16.   localparam      DW = DATA_WIDTH - 1;  
  17.   localparam      AW = ADDR_WIDTH - 1;  
  18.   
  19.   input           clka;  
  20.   input           wea;  
  21.   input   [AW:0]  addra;  
  22.   input   [DW:0]  dina;  
  23.   
  24.   input           clkb;  
  25.   input   [AW:0]  addrb;  
  26.   output  [DW:0]  doutb;  
  27.   
  28.   reg     [DW:0]  m_ram[0:((2**ADDR_WIDTH)-1)];  
  29.   reg     [DW:0]  doutb;  
  30.   
  31.   always @(posedge clka) begin  
  32.     if (wea == 1'b1) begin  
  33.       m_ram[addra] <= dina;  
  34.     end  
  35.   end  
  36.   
  37.   always @(posedge clkb) begin  
  38.     doutb <= m_ram[addrb];  
  39.   end  
  40.   
  41. endmodule  


在顶层文件中例化mem module时可以这样做:

[plain] view plain copy
 
  1. mem #(.DATA_WIDTH(DATA_WIDTH), .ADDR_WIDTH(6))  
  2.  i_mem (  
  3.   .clka (adc_clk),  
  4.   .wea (adc_wr),  
  5.   .addra (adc_waddr),  
  6.   .dina (adc_wdata),  
  7.   .clkb (dma_clk),  
  8.   .addrb (dma_raddr),  
  9.   .doutb (dma_rdata_s));  


也可以将底层模块的parameter参数置于module端口声明之前,例如:

[plain] view plain copy
 
    1. `timescale 1ns/100ps  
    2. module mem   
    3.           #(parameter DATA_WIDTH = 16  
    4.             parameter ADDR_WIDTH =  5)  
    5.            (    
    6.             input    clka,  
    7.             input    wea,  
    8.             input   [AW:0]  addra,  
    9.             input   [DW:0]  dina,  
    10.             input           clkb,  
    11.             input   [AW:0]  addrb,  
    12.             output  [DW:0]  doutb  
    13.            );   
    14.   
    15.   localparam      DW = DATA_WIDTH - 1;  
    16.   localparam      AW = ADDR_WIDTH - 1;  
    17.   
    18.   reg     [DW:0]  m_ram[0:((2**ADDR_WIDTH)-1)];  
    19.   reg     [DW:0]  doutb;  
    20.   
    21.   always @(posedge clka) begin  
    22.     if (wea == 1'b1) begin  
    23.       m_ram[addra] <= dina;  
    24.     end  
    25.   end  
    26.   
    27.   always @(posedge clkb) begin  
    28.     doutb <= m_ram[addrb];  
    29.   end  
    30.   
    31. endmodule  
原文地址:https://www.cnblogs.com/Helloworld666/p/7325856.html