我有以下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;
答案 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语法。所有现代工具都支持此功能。