#token有时会出现在verilog模块的参数列表之前。据说这表明隐含的参数重新定义。在this示例"(2)"在没有给出任何解释的情况下跟随#令牌:
//implicit parameter redefine
解释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)"我在这里寻求建议。感谢。
答案 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上没有任何限制。