首页 文章

隐式重新定义参数

提问于
浏览
0

#token有时会出现在verilog模块的参数列表之前 . 据说这表明隐含的参数重新定义 . 在this示例中,"(2)"在#标记后面,没有给出任何解释:

//implicit parameter redefine

dff#(2)u4(q 3 ,, d 3,clock);

解释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 回答

  • 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上没有任何限制 .

相关问题