Verilog:如何优雅地编写等效于struct表的内容

时间:2019-03-01 18:16:59

标签: verilog fpga

我有以下C代码:

typedef struct label {
    uint16_t first;
    uint8_t second;
} label;
label labelsr[2][64];

labelsr[1][3].second = 0;

我想以最优雅的方式将其翻译为Verilog。到目前为止,我提供了以下内容。有什么更好的吗?

//(16 + 8) * 64 * 2 = 3072
`define LABELSR_STRUCT_SIZE 3072:0
`define ADVL 24
`define ADVLS 1536
`define FIRSTSTART 0
`define FIRSTEND 15
`define SECONDSTART 16
`define SECONDEND 23
`define FIRST(i, j) `FIRSTEND + i * `ADVLS + j * `ADVL : `FIRSTSTART + i * `ADVLS + j * `ADVL
`define SECOND(i, j) `SECONDEND + i * `ADVLS + j * `ADVL : `SECONDSTART + i * `ADVLS + j * `ADVL
reg [`LABELSR_STRUCT_SIZE] labelsr;

labelsr[`SECOND(1, 3)] <= 0;

3 个答案:

答案 0 :(得分:2)

好吧...它永远不会优雅,但是您可以稍微整理一下。我假设您想要经典的Verilog,而不是SystemVerilog。

您需要使用“索引零件选择”。如果要从myvec开始降8位,并且MSB为msb,则写入myvec[msb -: 8]。因此myvec[20 -: 8]myvec[20:13]。这将消除您一半的代码。

也不要低估您的合成器-即使您不费心去分解它,它也可能会以最佳的方式完成这种事情。

还请注意,3072:0应该是3071:0

答案 1 :(得分:1)

我建议您删除verilog中的结构符号。可能会大大简化一切

`define INDEX(i, j) (i * 64 + j)
module A;
  parameter SSIZE = 2 * 64; 
  reg [15:0] first[SSIZE];
  reg [7:0] second[SSIZE];

  always @*
      second[`INDEX(1,3)] = 0; 
endmodule

,如果您有权访问系统Verilog编译器,请使用struct:

typedef struct packed { 
  logic [15:0] first;
  logic [7:0] second;
} label_t;

module A;
 label_t label[2][64]; 
 always @*
   label[1][3].second = 0;
endmodule

好吧,icarus 0.10不会编译最后一个示例。

答案 2 :(得分:0)

最优雅的方法是使用SystemVerilog,它具有完全相同的C语法。所有现代工具都支持此功能。