verilog - 具有参数宽度的 Verilog 参数
问题描述
不难同意参数化模块设计是一种很好的做法,数据宽度是一个很好的起点。
多年来,我一直在定义所需总线或操作数宽度的常量 0 和 1。这是为了避免编译器警告并明确传达意图。通常使用类似的东西:
parameter WIDTH = 16;
// ...
parameter ZERO = {WIDTH{1'b0}}; // all zeroes
parameter UNO = {{WIDTH-1{1'b0}}, 1'b1}; // all zeroes except LSB
这一切都很好,直到我想用给定的参数化宽度定义一个任意常数。我当然可以写一个固定宽度的常数——但这不是我想要的:
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);
但是,如果您这样做并覆盖参数,则数据类型将成为覆盖值类型的宽度。