参数,localparams和左边填充单个位值('1)

时间:2016-08-31 12:44:07

标签: parameters system-verilog

如果我理解了事物correctly,则SystemVerilog参数不具有固有类型,但会采用分配给它的值的类型。类似地,'1表示法应该适应变量的类型。当我们将两者合并时会发生什么?

也就是说,这些片段中的参数实例化会产生什么结果?

localparam BAR = '1;

module testModule #(parameter BAR = 0, parameter [3:0] LONGBAR = 0)
(input logic a, output logic b);
  assign b = a;
endmodule

testModule #('1, '1) u_testModule0(a, b);

testModule #(BAR, BAR) u_testModule1(a, b);

1 个答案:

答案 0 :(得分:5)

在没有任何类型上下文(自我确定)的情况下,文字'1等同于1'b1。对localparam BAR的分配是自行确定的,因此BAR是一位参数,其值为1'b1

因为testModule定义BAR没有类型,所以用于覆盖它的任何表达式都将在自定义的上下文中进行评估。用于覆盖LONGBAR的表达式将在4位整数类型的上下文中进行计算。

testModule #('1, '1) u_testModule0(a, b);

因此,在上面的实例化中,第一个覆盖评估为1'b1,第二个覆盖评估为4' b1111。 testModule的BAR类型解析为1位类型,LONGBAR的类型固定为4位。

testModule #(BAR, BAR) u_testModule1(a, b);

在第二个实例中,第一个覆盖采用localparam BAR的类型,因此testModule的BAR类型解析为值为1'b1的1位类型。但是在第二个覆盖中,这是在4位类型的上下文中的赋值。由于localparam BAR的值为1&b; b1,因此填充0' s,LONGBAR获取值4' b0001。