首页 > 解决方案 > 具有参数宽度的 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*

什么是正确的语法 - 如果有的话?

标签: verilogsystem-verilog

解决方案


这是 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);

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


推荐阅读