【问题标题】:Verilog - increment local parameter in generate blockVerilog - 在生成块中增加本地参数
【发布时间】:2019-03-29 19:07:51
【问题描述】:

我在我的 Verilog 生成块中遇到错误,它显示 j = j+1;声明 `j 是未知类型'

genvar i;
generate
    localparam integer j = 0;
    for (i = 0; i < BUFFER; i=i+1) begin
        if((i%DATA_WIDTH) < (KERNEL_SIZE-1)) begin
            assign o_input_matrix[((j+1)*DATA_WIDTH)-1:j*DATA_WIDTH] = 
buffer[((i+1)*DATA_WIDTH)-1:i*DATA_WIDTH];
            j = j+1;
        end
    end
endgenerate

BUFFER、DATA_WIDTH 和 KERNEL_SIZE 是我的模块中的本地参数。

我一直在寻找可以在生成块中使用第二个参数的方法,我发现我只能在 for 循环中使用 genvar 变量,所以我无法为 j 创建第二个 genvar 变量。

我遇到了这个问题: Incrementing Multiple Genvars in Verilog Generate Statement

我尝试基于我的第二个答案的代码,但我的情况略有不同,因为我只是在 if 语句中递增它。

任何帮助将不胜感激。

【问题讨论】:

    标签: parameters verilog increment


    【解决方案1】:

    您将不得不创建一个函数来定义j 的值。

    genvar i;
    for (i = 0; i < BUFFER; i=i+1)
       if((i%DATA_WIDTH) < (KERNEL_SIZE-1)) begin
          localparam j = func(i);
          assign o_input_matrix[((j+1)*DATA_WIDTH)-1:j*DATA_WIDTH] = 
    buffer[((i+1)*DATA_WIDTH)-1:i*DATA_WIDTH];
            end
        end
    function integer func(integer ii);
       for (ii = 0;ii < BUFFER; ii++)
         if ((ii %DATA_WIDTH) < (KERNEL_SIZE-1)) ii++;
    endfunction
    

    没试过这个,但希望它能让你接近你想要的。

    【讨论】:

    • 谢谢@dave_59,我想我设法使用了一个函数来完成我需要的映射。我很难测试这个解决方案是否有效,因为我遇到运行时错误,有没有办法在生成块中显示参数?我尝试使用 $display,但我认为我不能在生成块中使用它。
    • 我不知道生成块会如何给您带来运行时错误?它说什么?您可以将initial $display(parameters) 放在生成中,假设它出现在您的运行时错误之前。 (SystemVerilog 允许您将 $info 作为详细信息)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多