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
相关产品推荐
相关产品推荐

