–不积跬步无以至千里
记录Verilog电路设计中的点点滴滴
1)乘法器一定谨慎使用!FPGA中可以调用DSP单元,但芯片中是用累加器搭建起来的,非常费资源!推荐使用位拼接的形式。我之前做的一个小项目就修改了下面几行代码,综合面积直接节省了1000um2!收益非常明显!
优化前使用乘法器实现
assign pkt_data0 = {128'd0,pkt_data_mask[128*2-1:128*1]} << 128*pkt_bitmap[0];
assign pkt_data1 = {128'd0,pkt_data_mask[128*4-1:128*3]} << 128*pkt_bitmap[2];
assign pkt_data2 = {128'd0,pkt_data_mask[128*6-1:128*5]} << 128*pkt_bitmap[4];
assign pkt_data3 = {128'd0,pkt_data_mask[128*8-1:128*7]} << 128*pkt_bitmap[6];
优化后使用位拼接的形式实现
assign pkt_data0 = {128'd0,pkt_data_mask[128*2-1:128*1]} << {pkt_bitmap[0],7'd0};
assign pkt_data1 = {128'd0,pkt_data_mask[128*4-1:128*3]} << {pkt_bitmap[2],7'd0};
assign pkt_data2 = {128'd0,pkt_data_mask[128*6-1:128*5]} << {pkt_bitmap[4],7'd0};
assign pkt_data3 = {128'd0,pkt_data_mask[128*8-1:128*7]} << {pkt_bitmap[6],7'd0};
2)刚开始我们学习Verilog的时候大家都是这样告诉你写always块的
always@(posedge clk or negedge rst_n) begin
if(rst_n)
cnt <= 3'd0;
else
cnt <= cnt + 1'd1;
end
但是请注意,在综合时不带复位的寄存器要比带复位的寄存器更节省资源。我在使用7nm相关工艺库时,不带复位的寄存器可以节省20%的面积。一般控制流逻辑寄存器建议带复位,这样防止在初始化过程中x态带来控制上的功能问题,而数据流逻辑寄存器有时可以不带复位,因为数据源保证了寄存器输出不会为x态。
module DATA_MUX(
input vld,
inpu data,
input clk,
input rst_n
)
//main code
reg vld_d;
reg data_d;
always@(posedge clk or negedge rst_n) begin
if(rst_n)
vld_d <= 1'd0;
else
vld_d <= vld;
end
always@(posedge clk) begin
if(vld_d)
data_d <= data;
end
endmodule
上面代码中在输入vld有效时需要保证data是有效的,在模块内部使用vld_d进行采样时,寄存器data_d输出Q端一定不为x态,所以该寄存器可以不使用复位。