具有参数宽度的 Verilog 参数
Verilog parameters with parametric width
不难同意参数化模块设计是一个很好的实践,数据宽度是一个很好的起点。
多年来我一直在定义所需总线或操作数宽度的常量 0 和 1。那是为了避免编译器警告并明确传达意图。通常使用类似的东西:
parameter WIDTH = 16;
// ...
parameter ZERO = {WIDTH{1'b0}}; // all zeroes
parameter UNO = {{WIDTH-1{1'b0}}, 1'b1}; // all zeroes except LSB
这一切都很好,直到我想定义一个具有给定参数化 WIDTH 的任意常量。
我当然可以写一个固定宽度的常量——但这不是我想要的:
parameter FULL = 16'd57;
但是,使用参数 WIDTH 的类似构造因语法错误而失败:
parameter LEVEL = WIDTH'd57; // <== *ERROR*
正确的语法是什么 - 如果有的话?
这是 Verilog 中的一个问题,因为参数分配的 RHS 被用作参数的自定宽度。 SystemVerilog 通过允许您将数据类型指定为 parameter
声明
的一部分来解决此问题
parameter WIDTH = 16;
// ...
parameter bit [WIDTH-1:0] ZERO = '0; // all zeroes
parameter bit [WIDTH-1:0] UNO = 1; // all zeroes except LSB
parameter bit [WIDTH-1:0] LEVEL = 57;
覆盖时数据类型不会改变。
另一种方法是使用大小调整
参数 LEVEL = WIDTH'(56);
但如果您这样做并覆盖参数,数据类型将成为覆盖值类型的宽度。
不难同意参数化模块设计是一个很好的实践,数据宽度是一个很好的起点。
多年来我一直在定义所需总线或操作数宽度的常量 0 和 1。那是为了避免编译器警告并明确传达意图。通常使用类似的东西:
parameter WIDTH = 16;
// ...
parameter ZERO = {WIDTH{1'b0}}; // all zeroes
parameter UNO = {{WIDTH-1{1'b0}}, 1'b1}; // all zeroes except LSB
这一切都很好,直到我想定义一个具有给定参数化 WIDTH 的任意常量。 我当然可以写一个固定宽度的常量——但这不是我想要的:
parameter FULL = 16'd57;
但是,使用参数 WIDTH 的类似构造因语法错误而失败:
parameter LEVEL = WIDTH'd57; // <== *ERROR*
正确的语法是什么 - 如果有的话?
这是 Verilog 中的一个问题,因为参数分配的 RHS 被用作参数的自定宽度。 SystemVerilog 通过允许您将数据类型指定为 parameter
声明
parameter WIDTH = 16;
// ...
parameter bit [WIDTH-1:0] ZERO = '0; // all zeroes
parameter bit [WIDTH-1:0] UNO = 1; // all zeroes except LSB
parameter bit [WIDTH-1:0] LEVEL = 57;
覆盖时数据类型不会改变。
另一种方法是使用大小调整
参数 LEVEL = WIDTH'(56);
但如果您这样做并覆盖参数,数据类型将成为覆盖值类型的宽度。