使用defparam语句时,可以使用参数的层级结构名称在整个设计的任何模块实例中更改参数值。但是,generate生成块实例或实例数组内部或其下层级结构中的defparam语句不得更改该层级结构之外的参数值。
generate生成块的每个实例都被视为一个独立的层级结构作用域。因此,这条规则意味着,生成块中的defparam语句不能针对同一生成块的另一个实例中的参数,即使另一个实例是由同一个generate循环构造创建的。例如,以下代码是不允许的:
同样,数组实例中一个实例的 defparam 语句不得针对数组另一个实例中的参数。
defparam 赋值右侧的表达式应为常量表达式,只涉及数字和参数引用。被引用的参数(在 defparam 右侧)应与defparam 语句在同一模块中声明,如果一个参数有多个defparam,则该参数取源文件中最后一个defparam语句的值。defparam语句尤其适用于将所有的覆盖参数值集中到一个模块中,例子如下:
module top;
reg clk;
reg [0:4] in1;
reg [0:9] in2;
wire [0:4] o1;
wire [0:9] o2;
vdff m1 (o1, in1, clk);
vdff m2 (o2, in2, clk);
endmodule
module vdff (out, in, clk);
parameter size = 1, delay = 1;
input [0:size-1] in;
input clk;
output [0:size-1] out;
reg [0:size-1] out;
always @( posedge clk)
# delay out = in;
endmodule
module annotate;
defparam
top.m1.size = 5,
top.m1.delay = 10,
top.m2.size = 10,
top.m2.delay = 20;
endmodule
模块 annotate 包含 defparam 语句,用于覆盖顶层模块 top 中实例 m1 和 m2 的size和delay值。top模块和annotate模块都被视为顶层模块。
点赞加关注博主(ID:FPGA小飞)的博文,咱们一起系统学习verilog最终标准IEEE Std 1364-2005吧!