• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Verilog | 参数化模块调用

武飞扬头像
初雪白了头
帮助1

上接 模块与端口

一、 概述

        在进行模块调用时,有时需要修改模块中的参数,这个时候就需要进行参数化模块调用。

        众所周知,参数都是有各自的作用域的。

  • `define:      作用 -> 经常使用于定义常量能够跨模块、跨文件;

                             范围 -> 整个工程;

  • defparam:      作用 -> 改写模块在端口声明时声明的参数,或模块实体中声明的参数;

                          范围 - > 作用于例化模块;

  • parameter:  作用 -> 经常使用于模块间参数传递;

                             范围 -> 本module内有效的定义;

  • localparam :  作用-> 经常使用于状态机的参数定义;

                             范围 -> 本module内有效的定义,且不可用于参数传递;

二、 用法

        当一个模块被另一个模块引用例化时,高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块,而不用单独为只有参数不同的多个模块再新建文件。参数覆盖有 2 种方式:1)使用关键字 defparam,2)带参数值模块例化

  1. 使用关键字 defparam

    1.  
      defparam module_name.parameter1;
    2.  
      module_name inst_name(
    3.  
         port_map
    4.  
         );
  2. 带参数值模块例化和模块例化基本一样,有两种调用方法:
     

    1.  
      module_name #(
    2.  
         parameter1, //例化时,例化的参数顺序必须和模块顺序一致
    3.  
         parameter2
    4.  
      )
    5.  
      inst_name(
    6.  
         port_map
    7.  
         );
    1.  
      module_name #(
    2.  
        .parameter_name(para_value),//必须指定当前例化的端口名称,顺序可以自由排序
    3.  
        .parameter_name(para_value)
    4.  
      )
    5.  
      inst_name (
    6.  
         port map
    7.  
      );

三、 两者区别

(1)所有参数都是模块在端口声明时声明的参数或参数都是模块实体中声明的参数,这两种模块参数改写的方式可混用。

(2) 利用 defparam带参数例化 都既可以改写模块在端口声明时声明的参数,也可以改写模块实体中声明的参数。但是 defparam 不能同时修改两种参数,也不能在有端口声明参数的情况下修改模块实体中生命的参数。

例如:

  1.  
    module  ram
  2.  
       #(  parameter       AW = 2 ,
  3.  
           parameter       DW = 3 )
  4.  
       (
  5.  
           input                   CLK ,
  6.  
           input [AW-1:0]          A ,
  7.  
           input [DW-1:0]          D ,
  8.  
           input                   EN ,
  9.  
           input                   WR ,    //1 for write and 0 for read
  10.  
           output reg [DW-1:0]     Q    );
  11.  
     
  12.  
       parameter            MASK = 3 ;
  13.  
     
  14.  
       reg [DW-1:0]         mem [0:(1<<AW)-1] ;
  15.  
       always @(posedge CLK) begin
  16.  
           if (EN && WR) begin
  17.  
               mem[A] <= D ;
  18.  
           end
  19.  
           else if (EN && !WR) begin
  20.  
               Q       <= mem[A] ;
  21.  
           end
  22.  
       end
  23.  
     
  24.  
    endmodule
学新通

此时再用 defparam 改写参数 MASK 值时,编译报 Error;

  1.  
    //都采用defparam时会报Error
  2.  
    defparam     u_ram.AW = 4 ;
  3.  
    defparam     u_ram.DW = 4 ;
  4.  
    defparam     u_ram.MASK = 7 ;
  5.  
    ram   u_ram  (......);
  6.  
     
  7.  
    //模块实体中parameter用defparam改写也会报Error
  8.  
    defparam     u_ram.MASK = 7 ;
  9.  
    ram #(.AW(4), .DW(4))   u_ram (......);

(3)defparam 一般也不可综合。

(4)建议编写模块时,将需要修改的参数写入到模块端口声明之前的地方(用关键字井号 # 表示),例化时使用带参数值模块例化的方式。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfafbh
系列文章
更多 icon
同类精品
更多 icon
继续加载