• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【IEEE_Verilog-4.10】参数

4.10 Parameters

Verilog HDL参数既不属于变量组,也不属于网络组。参数不是变量;它们是常数。参数有两种类型:模块参数和指定参数。重新声明已经由net、参数或变量声明的名称是非法的。
这两种类型的参数都接受范围规范。默认情况下,参数parameters和specparams应尽可能宽以包含常量的值,除非出现范围规范。

4.10.1 Module parameters模块参数

模块参数声明的语法见语法4-4。

list_of_param_assignments应该是一个以逗号分隔的赋值列表,其中赋值的右侧应该是一个常量表达式,即只包含常量数和之前定义的参数的表达式(参见第5条)。
list_of_param_assignments可以作为一组module_items出现在模块中,也可以出现在module_parameter_port_list中的模块声明中(见12.1)。如果任何param_assignments出现在module_parameter_port_list中,那么任何出现在模块中的param_assignments都将成为局部参数,不应被任何方法覆盖。
参数表示常量;因此,在运行时修改它们的值是非法的。但是,可以在编译时修改模块参数,使其值与声明赋值中指定的值不同。这允许定制模块实例。参数可以通过defparam语句或模块实例语句进行修改。参数的典型用途是指定延迟和变量的宽度。参数赋值请参见12.2。
模块参数可以有类型规范和范围规范。模块参数的类型和范围应符合以下规则:
---没有类型或范围说明的参数声明,在应用任何值覆盖后,默认为赋给参数的最终值的类型和范围。
---具有范围规范但没有类型规范的参数应该是参数声明的范围,并且应该是无符号的。符号和范围不受值覆盖的影响。
---具有类型规范但没有范围规范的参数应具有指定的类型。在应用任何值覆盖后,有符号的参数应默认为赋给该参数的最终值的范围。
---具有符号的类型规范和范围规范的参数应该是有符号的,并且应该是其声明的范围。符号和范围不受值覆盖的影响。
---如果一个参数没有范围说明,并且具有signed类型说明或没有类型说明,则该参数的隐含范围应为lsb等于0,msb等于1,小于赋给该参数的最终值的大小。
---没有范围的参数规范,有符号类型规范或没有任何类型的规范,并且最终赋值给它的值不需要调整大小,必须有一个隐含的范围,LSB等于0,MSB等于一个与实现相关的值至少为31。
4.8.2中描述的实值和整数值之间的转换规则也适用于参数。
允许非实数参数的位选择和部分选择(见5.2)。
例如:

parameter msb = 7; // 定义msb为常数7
parameter e = 25, f = 9; // 定义两个常数
parameter r = 5.7; // 定义r为实参数
parameter byte_size = 8,
          byte_mask = byte_size - 1;
parameter average_delay = (r + f) / 2;
parameter signed [3:0] mux_selector = 0;
parameter real r1 = 3.5e17;
parameter p1 = 13'h7e;
parameter [31:0] dec_const = 1'b1; // 转换为32位的值
parameter newconst = 3'h4; // 隐含范围[2:0]
parameter newconst = 4; // 隐含范围至少为[31:0]

4.10.2 Local parameters (localparam)

Verilog HDL局部参数与参数是相同的,除了它们不能被defparam语句(见12.2.1)或模块实例参数值赋值(见12.2.2)直接修改之外。局部参数可以给包含形参的常量表达式赋值,可以用defparam语句或模块实例形参值赋值来修改。
允许非实数类型的局部参数的位选择和部分选择(见5.2)。
局部形参声明的语法见语法4-4。

4.10.3 Specify parameters

声明指定参数的语法请参见语法4-5。

关键字specparam声明一种特殊类型的参数,该参数仅用于提供计时和延迟值,但可以出现在任何没有分配给参数且不属于声明范围规范的表达式中。指定参数(也称为specparams)允许在指定块(见第14条)和主模块体中。
在指定块外声明的指定参数必须在引用之前声明。赋给指定参数的值可以是任何常量表达式。指定参数可以用作后续指定参数声明的常量表达式的一部分。与模块参数不同,指定参数不能从语言内部修改,但可以通过SDF注释修改(参见条款16)。
指定参数和模块参数不可互换。此外,模块参数不能被赋值为包含任何指定参数的常量表达式。表4-7总结了两种参数声明的区别。

指定参数可以具有范围规范。指定参数的范围应符合以下规则:
---没有范围说明的specparam声明,在应用任何值覆盖后,默认为赋给参数的最终值的范围。
---带有范围说明的specparam应该是参数声明的范围。范围不应受值覆盖的影响。
允许非实数类型的指定参数的位选择和部分选择(见5.2)。

specify
specparam tRise_clk_q = 150, tFall_clk_q = 200;
specparam tRise_control = 40, tFall_control = 50;
endspecify\

关键字specify和endspecify之间的行声明了四个指定参数。第一行声明了指定参数tRise_clk_q和tFall_clk_q,分别为150和200;第二行声明tRise_control和tFall_control分别指定值为40和50的参数。
例如:

module RAM16GEN (output [7:0] DOUT, input [7:0] DIN, input [5:0] ADR,
input WE, CE);
specparam dhold = 1.0;
specparam ddly = 1.0;
parameter width = 1;
parameter regsize = dhold + 1.0; // Illegal - cannot assign
                                 // specparams to parameters
endmodule

posted on 2022-03-20 18:19  SOC验证工程师  阅读(391)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3