【发布时间】:2015-06-23 17:58:03
【问题描述】:
我目前正在努力解决 Verilog 模块仅接受一维打包向量作为输入/输出的问题。例如:
wire [bitWidth-1:0] data;
我想要做的是输入一个包含一维压缩的二维向量(想想数字数组)。例如:
wire [bitWidth-1:0] data [0:numData-1];
我目前有几个方便的宏,它们可以展平二维矢量和展平一维矢量。它们是:
`define PACK_ARRAY(PK_WIDTH,PK_LEN,PK_SRC,PK_DEST) \
genvar pk_idx; \
generate \
for (pk_idx=0; pk_idx<(PK_LEN); pk_idx=pk_idx+1) begin : packLoop \
assign PK_DEST[((PK_WIDTH)*pk_idx+((PK_WIDTH)-1)):((PK_WIDTH)*pk_idx)] = PK_SRC[pk_idx][((PK_WIDTH)-1):0]; \
end \
endgenerate
`define UNPACK_ARRAY(PK_WIDTH,PK_LEN,PK_DEST,PK_SRC) \
genvar unpk_idx; \
generate \
for (unpk_idx=0; unpk_idx<(PK_LEN); unpk_idx=unpk_idx+1) begin : unpackLoop \
assign PK_DEST[unpk_idx][((PK_WIDTH)-1):0] = PK_SRC[((PK_WIDTH)*unpk_idx+(PK_WIDTH-1)):((PK_WIDTH)*unpk_idx)]; \
end \
endgenerate
如果我只使用它们来处理我正在工作的模块的一个输出和一个输入,这些效果很好。问题是,如果我在给定模块中多次使用这些宏中的任何一个,则会出现以下错误发生:
1) genvars 已经被声明。
2) 循环标签已被使用。
我可以通过不在宏中声明它并在其他地方声明它来解决genvar 问题,但我不知道如何解决循环标签问题并且仍然能够使用宏来保持干净的代码.
欢迎提出任何建议(“切换到系统 verilog”:P 除外)!谢谢。
【问题讨论】:
标签: arrays vector macros verilog