You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Verilog数组内部访问优化求助:Quartus综合组合逻辑资源过高

优化Verilog内存访问以减少组合逻辑LC资源

这个问题我之前在FPGA项目里也碰到过——你现在的写法相当于给每一个p都生成了一个独立的37选1多路选择器(MUX),用来从x_vector的37个元素里挑选对应x_sample[p]的那个。512个这样的MUX堆在一起,组合逻辑LC不爆才怪😅。

下面是几个针对性的优化方案,你可以根据系统的时序要求选择:

方案1:串行化处理(最推荐,资源节省最多)

把原来并行的512个采样操作改成串行循环处理,只保留一个MUX来读取x_vector,大幅削减组合逻辑。

wire [WIDTH_PIXEL-1:0] x_vector [0:36];
wire [5:0] x_sample [0:511]; // 修正位宽:6-1=5,所以是[5:0]
reg [WIDTH_PIXEL-1:0] rx_512 [0:511];
reg [8:0] p_cnt; // 0~511的计数器,位宽9bit

always@(posedge clk) begin
    // 循环计数器:从0到511循环
    if(p_cnt == 511) begin
        p_cnt <= 0;
    end else begin
        p_cnt <= p_cnt + 1;
    end

    // 每次只处理一个p的采样逻辑
    if(x_sample[p_cnt] == counter2) begin
        rx_512[p_cnt] <= x_vector[x_sample[p_cnt]];
    end
end

核心优化点:原来的512个37选1 MUX被合并成1个,LC数量会直接降到原来的1/500左右。代价是需要512个时钟周期完成一轮全部采样,只要你的系统时序允许这个延迟,这就是最优解。

方案2:提前预取当前目标值,再批量写入

先把counter2对应的x_vector元素预取出来,再遍历所有p进行匹配写入,同样能大幅减少MUX的数量。

wire [WIDTH_PIXEL-1:0] x_vector [0:36];
wire [5:0] x_sample [0:511];
reg [WIDTH_PIXEL-1:0] rx_512 [0:511];
reg [WIDTH_PIXEL-1:0] current_x_val;
reg [8:0] p_cnt;

always@(posedge clk) begin
    // 预取当前counter2对应的x_vector元素(只需要1个37选1 MUX)
    current_x_val <= x_vector[counter2];

    // 循环计数器
    if(p_cnt == 511) begin
        p_cnt <= 0;
    end else begin
        p_cnt <= p_cnt + 1;
    end

    // 匹配x_sample[p_cnt]与counter2,写入预取的值
    if(x_sample[p_cnt] == counter2) begin
        rx_512[p_cnt] <= current_x_val;
    end
end

优化逻辑:current_x_val只需要计算一次,后续只需要做512次简单的相等比较,比较器的LC消耗远低于MUX,同样能大幅降低总资源。

方案3:将x_sample改为常量数组(如果适用)

如果x_sample的值是编译时固定的(不是运行时动态变化的),可以把它定义成parameter数组,让综合器自动做常量折叠优化:

wire [WIDTH_PIXEL-1:0] x_vector [0:36];
parameter [5:0] x_sample [0:511] = '{0,1,2,...,36,...}; // 初始化常量列表
reg [WIDTH_PIXEL-1:0] rx_512 [0:511];
genvar p;

generate
for(p=0;p<=511;p=p+1) begin: PPP
    always@(posedge clk) begin
        if(x_sample[p] == counter2) begin
            rx_512[p] <= x_vector[x_sample[p]];
        end
    end
endgenerate

优化效果:综合器会提前知道每个p对应的x_vector索引,直接把x_vector的对应元素连到rx_512[p]的写入端,不需要动态MUX,只保留条件写入的比较逻辑,LC数量也会显著下降。


内容的提问来源于stack exchange,提问作者John T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:48:07