隐式重新定义参数

时间:2014-12-17 02:44:45

标签: system-verilog

#token有时会出现在verilog模块的参数列表之前。据说这表明隐含的参数重新定义。在this示例"(2)"在没有给出任何解释的情况下跟随#令牌:

  //implicit parameter redefine

dff#(2)u4(q 3 ,, d 3,时钟);

解释here更有意义,重新定义的值遵循#token:

 Implicit in-line parameter redefinition (e.g. foo #(value, value) u1 (...); )

但是我更加困惑的是blink_leds示例here,它在参数列表之前添加了#token - 在顶层模块中!:

module blink_leds 
#(
    // Clock frequency
    parameter real CLK_FREQ     = 50.0e6,

    // LED LSB blink period
    parameter real BLINK_PERIOD = 0.5
)

为什么人们会被迫重新定义那些无法定义的参数?这,以及神秘的"(2)"我在这里寻求建议。感谢。

1 个答案:

答案 0 :(得分:1)

看起来您将模块定义与模块实例化混淆,以及与这两者相关的语法。前两个示例是模块实例化,即放下D触发器或模块foo,并为该单个实例隐式定义参数。因此,只有dff u4的参数设置为2,只有u1(模块foo的实例)将其参数设置为value和value。如果我要实例化另一个dff或foo,它可能有也可能没有与u4和u1相同的参数。例如,假设我有一个带有1个参数的dff模块:

dff #(2) u1 (...);
dff #(4) u2 (...);

我为该参数实例化了两个具有不同值的dff,但是我在u1中将参数更改为2,在u2中将参数更改为4只会影响这些实例,而不是彼此,而不是我之后可能声明的任何其他dff。

相反,在声明模块时,即定义foo是什么时,这是我在第三个例子中使用语法的时候:

module foo #(parameter real x = 0.5, parameter real y = 50.7) (input wire a, output wire b ...);

在这里,我定义了模块foo具有的参数,在本例中为参数x和y。我提供的值是这些参数的默认值。因此,如果我在某处实例化foo并且不重新定义参数,那么它们将采用这些值:

foo u1(...); // -- Instance of foo with x = 0.5 (default) and y = 50.7 (default)
foo #(1, 0.2) u2(...); // -- Instance of foo with x = 1 and y = 0.2
foo #(0.2) u3(...); // -- Instance of foo with x = 0.2 and y = 50.7 (default)
foo #(,1.4) u4(...); // -- Instance of foo with x = 0.5 (default) and y = 1.4

与上面的dff一样,这里我实例化foo很多次(u1..u4),重新定义了该实例的参数值。我没有改变foo的定义,只改变该特定实例的参数值。所以,仅仅因为我在u2中重新定义x,它在u1,u3或u4中的参数x上没有任何限制。