具有参数宽度的 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);

但如果您这样做并覆盖参数,数据类型将成为覆盖值类型的宽度。