我有以下C代码:
typedef struct label { uint16_t第一; uint8_t秒;} 标签;label labelsr [2] [64];
labelsr [1] [3] .second = 0;我想把它翻译成Verilog,最…
最优雅的方法是使用SystemVerilog,它具有完全相同的C语法。所有现代工具都支持这一点
我建议在verilog中删除struct符号。它可能会显着简化所有
`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呢 的 不 强> 编译最后一个例子。
嗯......它永远不会优雅,但你可以清理一下。我假设你想要经典的Verilog,而不是SystemVerilog。
您需要使用“索引部分选择”。如果你想要8个降序位 myvec ,MSB是 msb , 然后写 myvec[msb -: 8] 。所以 myvec[20 -: 8] 是 myvec[20:13] 。这将消除你的一半代码。
myvec
msb
myvec[msb -: 8]
myvec[20 -: 8]
myvec[20:13]
并且不要低估你的合成器 - 它可能会以最佳的方式做这种事情,即使你不打算为它打破一切。
另请注意 3072:0 应该 3071:0 。
3072:0
3071:0