未能使用 "generate" 作为内存

Failed to use "generate" for memory

我在 Vivado 2015.4 中使用 Verilog-2001。有我的代码:

parameter SHIFT = 16;

wire                           integrators_reset;
reg [INTEGRATOR_WIDTH - 1 : 0] sum_mem [SHIFT - 1 : 0];
reg [SHIFT - 1 : 0]            full_mem;

wire [SHIFT - 1 : 0]    equal;   

genvar i; 
generate
    for(i = 0; i < SHIFT; i = i + 1) begin
        always @(negedge equal[i]) begin
            if(integrators_reset) begin
                sum_mem[i] <= 0;
                full_mem[i] <= 0;
            end
            else begin
                if(sum_mem[i] == INTEGRATOR_MAX) 
                    full_mem[i] <= 1;
                else 
                    sum_mem[i] <= sum_mem[i] + 1;
            end
        end            
    end
endgenerate 

出现错误:

ERROR: [DRC 23-20] Rule violation (MDRV-1) Multiple Driver Nets- Net sum_mem[0][0] has multiple drivers

如果我不使用 "generate" 一切都很好。例如:

always @(negedge equal[0]) begin
    if(integrators_reset) begin
        sum_mem[0] <= 0;
        full_mem[0] <= 0;
    end
    else begin
        if(sum_mem[0] == INTEGRATOR_MAX) 
            full_mem[0] <= 1;
        else 
            sum_mem[0] <= sum_mem[0] + 1;
    end
end 

执行过程中没有错误。

这似乎是一个工具限制。您应该能够从不同的 always 块中分配解压缩数组的不同固定元素。一种解决方法是将 sum_mem 的声明移到生成块中。

for(I = 0; I < SHIFT; i = i + 1) begin : block_name
        reg [INTEGRATOR_WIDTH - 1 : 0] sum_mem;
        always @(negedge equal[I]) begin 
            if(integrators_reset) begin
                sum_mem <= 0;
                full_mem[i] <= 0;
            end
            else begin
                if(sum_mem[i] == INTEGRATOR_MAX) 
                    full_mem[i] <= 1;
                else 
                    sum_mem <= sum_mem + 1;
            end
        end            
    end

现在您有 block_name[0].sum_memblock_name[1].sum_mem,但您无法使用可变索引访问 block_name