【发布时间】:2021-01-27 03:56:55
【问题描述】:
在一个完美的世界中,我可以将 localparam 范围限定为结构内部:
typedef struct {
logic [10:0] mantissa;
localparam exponent = -10;
} my_fixed_point_type;
但是很可惜,这不是合法的 SystemVerilog。我已经使用 const ints(非法)、枚举(不限于结构,并且需要“存储”)进行了调查。
我可能会考虑只将一个 int 嵌入到结构中,并相信综合工具会注意到这些值只会被初始化,然后将它们剥离,但一些综合工具同样可能会忽略初始化。
到目前为止,我发现的唯一一种实际用词的方法就是这种可憎的:
typedef struct {
logic [10:0] mantissa;
logic [25:0] _hidden;
} my_fixed_point_type;
`define FP_EXPONENT(var) $bits(var._hidden)
由于从未读取过_hidden,因此我很有信心它会在详细说明时被剥离,而_hidden 的位宽可用于隐藏(无符号)整数常量。丑!
当然,必须有一种更好的方法来将常量范围限定为结构,这种方式在综合中保留,但不占用任何实际位。或者,我是否必须向 SystemVerilog 2016 委员会提出这个问题?
【问题讨论】:
-
我试图弄清楚为什么你不能只使用模块范围的参数。你想做什么?
-
我正在尝试在 systemverilog 中构建一个定点库,其中指数被视为常量并由合成器编译掉。模块范围的参数不起作用,我需要一个范围为 typedef 的常量。