在生成块内使用外部计数器时,Verilog无法合成

在生成块内使用外部计数器时,Verilog无法合成,verilog,vivado,synthesis,generate,Verilog,Vivado,Synthesis,Generate,我无法在Vivado中合成Verilog代码,模拟运行正常。我声明一个数组localparam,在一个generate块中使用一个外部计数变量cnt1来获取参数所需的地址。当我移除module1中的cnt1变量时,它可以被合成。请大家给我一些建议来解决这个问题。我真的很感激 module multiply_s1( input clk, input rst, input [9:0]in, input ena, output [9:0]out); localparam [0:24] pi_val

我无法在Vivado中合成Verilog代码,模拟运行正常。我声明一个数组localparam,在一个generate块中使用一个外部计数变量cnt1来获取参数所需的地址。当我移除module1中的cnt1变量时,它可以被合成。请大家给我一些建议来解决这个问题。我真的很感激

module multiply_s1(
input clk,
input rst,
input [9:0]in,
input ena,

output [9:0]out);

localparam [0:24] pi_values = {5'h4, 5'h5, 5'h6, 5'h7, 5'h8};
reg [1:0] cnt1;//count CC times of GG coeffcient

always@(posedge clk or negedge rst) begin
    if(rst == 0) begin
        cnt1 <= 0;
    end
    else if(ena == 0) begin
        cnt1 <= 0;
    end
    else begin
        if (cnt1 == 3)
            cnt1 <= 0;
        else            
            cnt1 <= cnt1 + 1;
    end
end

genvar i; 
generate
    for (i=0; i<2; i=i+1) 
    begin: mod1          
        module1 mod1(.clk(clk),
                     .rst(rst),
                     .multiplier(in[i*5 +: 5]),
                     .multiplicand(pi_values[(i + cnt1)*5 +: 5]),                        
                     .result(out[i*5 +: 5]));    
   end 
endgenerate
module multiply\u s1(
输入时钟,
输入rst,
在中输入[9:0],
输入ena,
输出[9:0]输出);
localparam[0:24]pi_值={5'h4,5'h5,5'h6,5'h7,5'h8};
reg[1:0]cnt1//计算GG系数的CC次数
始终@(posedge clk或negedge rst)开始
如果(rst==0)开始
cnt1注意这里:

    else begin
        if (cnt1 == 3)
            cnt1 <= 0;
        else            
            cnt1 <= cnt1 + 1;
    end
否则开始
如果(cnt1==3)

cnt1不知道Vivado告诉了你什么,我猜错误可能在这里:

[(i + cnt1)*5 +: 5]
cnt1是一个寄存器,其值仅在“运行时”时已知,因此Vivado无法知道使用哪个值对pi_值向量进行位切片

你需要这样的东西:

localparam [0:24] pi_values = {5'h4, 5'h5, 5'h6, 5'h7, 5'h8};
reg [1:0] cnt1;//count CC times of GG coeffcient

always@(posedge clk or negedge rst) begin
    if(rst == 0)
        cnt1 <= 0;
    else if(ena == 0)
        cnt1 <= 0;
    else
        cnt1 <= cnt1 + 1;
end

reg [0:24] pi_values_rotated;
always @* begin
  case (cnt1)
    0: pi_values_rotated = pi_values;
    1: pi_values_rotated = {pi_values[5:24], pi_values[0:4]};
    2: pi_values_rotated = {pi_values[10:24], pi_values[0:9]};
    3: pi_values_rotated = {pi_values[15:24], pi_values[0:14]};
    default: pi_values_rotated = pi_values;
  endcase
end

genvar i; 
generate
    for (i=0; i<2; i=i+1) 
    begin: mod1          
        module1 mod1(.clk(clk),
                     .rst(rst),
                     .multiplier(in[i]),
                     .multiplicand(pi_values_rotated[i*5 +: 5]),
                     .result(out[i]));
   end 
endgenerate
localparam[0:24]pi_值={5'h4,5'h5,5'h6,5'h7,5'h8};
reg[1:0]cnt1//计算GG系数的CC次数
始终@(posedge clk或negedge rst)开始
如果(rst==0)

cnt1请提供有关Vivado提供的错误消息的更多详细信息,以及我们可以测试和验证的最小完整示例。你发布的内容是一个模块的一部分,这个模块又实例化了另一个模块,这里没有详细说明。我也编辑了我的代码,模块1只是一个5位的模乘器。哦,我的错误,抱歉,我会编辑这个帖子。推理类似于@mcleod_ideafix。是的,我的问题是由于在generate block中更改变量cnt1引起的。我完全同意你的观点,合成不能停止。我不知道如何使用预先声明的localparam计算pi_值的索引,它依赖于I和cnt1变量。非常感谢。它起作用了。对于更大范围的pi_值和输入,您认为通用方法如何?该模块现在很容易修改,以适应更大范围(如位数)的输入。最棘手的是当你有更多的射程时。在这种情况下,必须修改case语句以添加新案例。我不确定是否可以用for-generate参数化。按照你的解决方案,我尝试展开较大的参数和输入,如果它可以合成或不。再次感谢你的帮助。