【问题标题】:Verilog Vector Packing/Unpacking MacroVerilog 向量打包/解包宏
【发布时间】: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


    【解决方案1】:

    对于纯 verilog 解决方案,您需要为 genvar 标识符再添加一个参数。示例(注意:为简单起见,将((PK_WIDTH)*unpk_idx+(PK_WIDTH-1)):((PK_WIDTH)*unpk_idx) 替换为(PK_WIDTH)*unpk_idx +: PK_WIDTH,参见herehere):

    `define UNPACK_ARRAY(PK_WIDTH,PK_LEN,PK_DEST,PK_SRC,UNPK_IDX) \
    genvar UNPK_IDX; \
    generate \
      for (UNPK_IDX=0; UNPK_IDX<(PK_LEN); UNPK_IDX=UNPK_IDX+1) begin //: unpackLoop <-- remove label\
        assign PK_DEST[UNPK_IDX][((PK_WIDTH)-1):0] = PK_SRC[(PK_WIDTH)*unpk_idx +: PK_WIDTH]; \
      end \
    endgenerate
    

    如果 SystemVerilog 是使用流式运算符的选项,则有一个更简单的解决方案。请参阅IEEE Std 1800-2012 § 11.4.14 流式操作符(打包/解包)。示例:

    // packing
    assign packed_array = {>>{unpacked_array}};
    // unpacking
    assign unpacked_array = {<<PK_WIDTH{packed_array}};
    

    【讨论】:

    • 感谢您的帮助。肯定会实现genvar 参数。您对如何解决generate 循环标签问题有什么建议吗?
    • 虽然我喜欢流操作符做一些事情(特别是位重新排序),但许多合成工具还不支持它:(
    • @mitch 你不能也为标签使用宏参数吗?
    • 您也可以删除标签名称。让它自动命名
    • 如果你可以为标签使用参数,我想不通。另外,你怎么能去掉标签?我认为我正在使用 Quartus 13.0sp1 和 verilog 2001。
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2016-03-07
    • 2013-03-01
    相关资源
    最近更新 更多