#token有时会出现在verilog模块的参数列表之前 . 据说这表明隐含的参数重新定义 . 在this示例中,"(2)"在#标记后面,没有给出任何解释:
//implicit parameter redefine
解释here更有意义,重新定义的值遵循#令牌:
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 回答
看来你将模块定义与模块实例化以及与这两者相关的语法混淆 . 前两个示例是模块实例化,即放下D触发器或模块foo,并为该单个实例隐式定义参数 . 因此,只有dff u4的参数设置为2,只有u1(模块foo的实例)将其参数设置为value和value . 如果我要实例化另一个dff或foo,它可能有也可能没有与u4和u1相同的参数 . 例如,假设我有一个带有1个参数的dff模块:
我为该参数实例化了两个具有不同值的dff,但是我在u1中将参数更改为2,在u2中将参数更改为4只影响这些实例,而不是彼此,而不是我后来可能声明的任何其他dff .
相比之下,当声明一个模块,即定义foo是什么时,这就是我在第三个例子中使用语法的时候:
在这里,我定义了模块foo具有的参数,在本例中为参数x和y . 我提供的值是这些参数的默认值 . 因此,如果我在某处实例化foo并且不重新定义参数,它们将采用这些值:
与上面的dff一样,这里我实例化foo很多次(u1..u4),重新定义了该实例的参数值 . 我没有改变foo的定义,只改变该特定实例的参数值 . 因此,仅仅因为我在u2中重新定义x,它在u1,u3或u4中的参数x上没有任何限制 .