Verilog电路设计小技巧(1)

–不积跬步无以至千里
记录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态,所以该寄存器可以不使用复位。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值