如果我理解了事物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);
答案 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。