Verilog 微优化案例:256bit 数据分段累加的两种实现与工程权衡

Verilog 微优化案例:256bit 数据分段累加的两种实现与工程权衡
1. 问题提出在FPGA上实现一个简单但很常见的数据路径操作输入din[255:0]输出sum[11:0]目标将输入的256比特数据按照每4bit进行累加64个周期后输出运算结果。这类“按小片段顺序提取并做累加/计算”的写法在FPGA上会出现很典型的综合差异用计数器做变量位选选择器vs让数据自己流动循环移位。2. 两种 RTL 方案方案 A计数器 变量位选test1核心代码生成多路复用器对不同位置进行选择sum sum r_data[4*cnt:4];完整代码moduletest1(clk,rst_n,start,din,sum);input clk;input rst_n;input start;input[255:0]din;output reg[11:0]sum;reg en;reg[5:0]cnt;reg[255:0]r_data;always(posedge clk or negedge rst_n)if(!rst_n)en1b0;elseif(start)en1b1;elseif(cnt6d63)en1b0;always(posedge clk or negedge rst_n)if(!rst_n)cnt6d0;elseif(en)cntcnt6d1;elsecnt6d0;always(posedge clk or negedge rst_n)if(!rst_n)r_data256d0;elseif(start)r_datadin;always(posedge clk or negedge rst_n)if(!rst_n)sum12d0;elseif(start)sum12d0;elseif(en)sumsumr_data[4*cnt:4];//选择r_data中的不同位置endmodule方案 B循环移位 固定取低4bittest2核心代码只选择固定位置让数据自己动起来r_data {r_data[3:0], r_data[255:4]};sum sum r_data[3:0];完整代码moduletest2(clk,rst_n,start,din,sum);input clk;input rst_n;input start;input[255:0]din;output reg[11:0]sum;reg en;reg[5:0]cnt;reg[255:0]r_data;always(posedge clk or negedge rst_n)if(!rst_n)en1b0;elseif(start)en1b1;elseif(cnt6d63)en1b0;always(posedge clk or negedge rst_n)if(!rst_n)cnt6d0;elseif(en)cntcnt6d1;elsecnt6d0;always(posedge clk or negedge rst_n)if(!rst_n)r_data256d0;elseif(start)r_datadin;elseif(en)r_data{r_data[3:0],r_data[255:4]};//数据循环移位always(posedge clk or negedge rst_n)if(!rst_n)sum12d0;elseif(start)sum12d0;elseif(en)sumsumr_data[3:0];endmodule3. 仿真代码和结果将两种设计放在一起进行仿真并进行仿真结果分析对比。仿真代码module test_tb;parameter clk_period10;reg clk;reg rst_n;reg start;reg[255:0]din;wire[11:0]sum1,sum2;test1test1_inst0(.clk(clk),.rst_n(rst_n),.start(start),.din(din),.sum(sum1));test2test2_inst0(.clk(clk),.rst_n(rst_n),.start(start),.din(din),.sum(sum2));initial clk1b1;always #(clk_period/2)clk~clk;initial begin rst_n0;start0;din0;#10;rst_n1;#100.1;start1;din256h0123456789abcdef;#10;start0;#1000;$stop;end endmodule仿真结果从仿真结果上看两种设计的仿真结果相同关键信号的时序相同。4. 综合实现面积和性能给定相同的时钟约束400MHzcreate_clock -name clk -period 2.500 -waveform {0.000 1.250} [get_ports clk]面积和性能方案LUTFFWNSWHSTotal Power方案A912750.3590.0582.510方案B1482750.6140.0522.525从实验结果来看方案A位选择的资源消耗更小但关键路径较长最差建立时间余量较小从而限制了整体设计的频率方案B循环移位的资源消耗较大但拥有较高的频率。此外方案B由于对寄存器进行不断地移位寄存器翻转次数多导致动态功耗较大。两种方案在FPGA平台上各有优劣实际设计中需根据需求来抉择。