无法使用"生成"为了记忆

时间:2017-09-23 13:38:03

标签: verilog vivado

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

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

如果我没有使用&#34;生成&#34;一切都很好。例如:

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 

实施过程中没有错误。

1 个答案:

答案 0 :(得分:0)

这似乎是一个工具限制。您应该能够从不同的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