Home Articles

有没有办法在SystemVerilog中的结构中嵌入常量?

Asked
Viewed 1957 times
0

在一个完美的世界中,我可以将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 Answers

  • 1

    你有没有找到解决方法?我刚开始构建一个定点库,并希望使用一个结构来保存信号的[完整,整数和小数]宽度 . 我甚至都没有尝试做任何花哨的事情,我只是想在结构中收集参数,因此很容易访问它们 . 不幸的是,无论我做什么工具都抱怨他们认为结构内容不是一成不变的 - 即使我只分配一次 .

    例如:

    typedef struct { int w, i, q; } fxpt;
    fxpt dw = '{16, 1, 15}; 
    wire signed [dw.w-1:0] din;
    

    或者即使我接受每个信号都有不同的结构,所以很明显一切都是不变的:

    typedef struct { int w=18, i=1, q=17; }  dw_constant;
    dw_constant dw; 
    wire signed [dw.w-1:0] din;
    

    我现在回到直接在代码中使用参数,例如:

    parameter integer dw[0:2] = '{16, 1, 15};
    wire signed [dw[0]-1:0] din;
    

    请注意,我没有访问代码片段中的.i和.q参数,因此它可能看起来有点无用,但在进行乘法/加法时,这些字段非常重要 .

  • 0

    您可以做很多事情,但不知道为什么要这样做,很难推荐一个好的解决方案 . 以下是一些建议:

    您可以为typedef定义初始值

    typedef struct {
      logic [10:0] mantissa;
      int exponent = -10;
    } my_fixed_point_type;
    

    或使用匿名枚举类型来防止任何其他值被分配给它

    typedef struct {
          logic [10:0] mantissa;
          enum {value=-10} exponent = value;
        } my_fixed_point_type;
    

    或者我们对用这种类型声明的变量进行连续赋值

    typedef struct {
          logic [10:0] mantissa;
          int exponent;
        } my_fixed_point_type; 
    
    my_fixed_point_type fpv;
    assign fpv.exponent = -10;
    
  • 0

    _hidden 可以用 logic signed [25:0] _hidden; 签名

    它可以用 always_comb var._hidden = -10; 做成半常数
    assign 也可以工作但不像 always_comb 模拟器不需要给多个驱动程序带来错误 .

    另一种方法是使用 interface 而不是结构,您可以使用 const 或参数(甚至函数) .

    我需要进行实验 . 我的猜测是 interface ,参数将使用结构更好地剥离未使用的信号 .

Related