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

Hid*_*ida 0 parameters system-verilog

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

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

localparam BAR = '1;
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

testModule #(BAR, BAR) u_testModule1(a, b);
Run Code Online (Sandbox Code Playgroud)

dav*_*_59 5

在没有任何类型上下文(自我确定)的情况下,文字'1等同于1'b1.对此的赋值localparam BAR是自定义的,因此BAR是带有值的一位参数1'b1

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

testModule #('1, '1) u_testModule0(a, b);
Run Code Online (Sandbox Code Playgroud)

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

testModule #(BAR, BAR) u_testModule1(a, b);
Run Code Online (Sandbox Code Playgroud)

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