在一个完美的世界中,我可以将localparam范围扩展到结构的内部:
typedef struct {
logic [10:0] mantissa;
localparam exponent = -10;
} my_fixed_point_type;
但唉,这不是合法的SystemVerilog . 我调查过使用const int(非法),枚举(没有作用于结构,需要“存储”) .
我可能会考虑在结构中嵌入一个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委员会?
3 回答
您可以做很多事情,但不知道为什么要这样做,很难推荐一个好的解决方案 . 以下是一些建议:
您可以为typedef定义初始值
或使用匿名枚举类型来防止任何其他值被分配给它
或者我们对用这种类型声明的变量进行连续赋值
_hidden
可以用logic signed [25:0] _hidden;
签名它可以用
always_comb var._hidden = -10;
做成半常数assign
也可以工作但不像always_comb
模拟器不需要给多个驱动程序带来错误 .另一种方法是使用
interface
而不是结构,您可以使用const
或参数(甚至函数) .我需要进行实验 . 我的猜测是
interface
,参数将使用结构更好地剥离未使用的信号 .你有没有找到解决方法?我刚开始构建一个定点库,并希望使用一个结构来保存信号的[完整,整数和小数]宽度 . 我甚至都没有尝试做任何花哨的事情,我只是想在结构中收集参数,因此很容易访问它们 . 不幸的是,无论我做什么工具都抱怨他们认为结构内容不是一成不变的 - 即使我只分配一次 .
例如:
或者即使我接受每个信号都有不同的结构,所以很明显一切都是不变的:
我现在回到直接在代码中使用参数,例如:
请注意,我没有访问代码片段中的.i和.q参数,因此它可能看起来有点无用,但在进行乘法/加法时,这些字段非常重要 .