如何在SV中使用二维数组精简代码

前言
在信号处理实现过程中,对于多通道的数据定义,采用常规的方式就得定义多个通道变量。
verilog不支持二维端口数组定义,但SV可以,所以可以省点代码量。

流程
对于verilog 的代码:可以看到代码类似冗长。
reg  [ 31 : 0 ] r_value_add_ch0  =   32'd0 ;
reg  [ 31 : 0 ] r_value_add_ch1  =   32'd0 ;
reg  [ 31 : 0 ] r_value_add_ch2  =   32'd0 ;
reg  [ 31 : 0 ] r_value_add_ch3  =   32'd0 ;
always   @ ( posedge  i_clk)
begin
     if  (r_cal_remain_edge  ==   2'b10 )  //下降沿重新启动校正流程
        r_value_add_ch0  <=   32'd0 ;
     else   if  (r_calibration_en)
        r_value_add_ch0  <=  r_value_add_ch0  +   {{ 16 { i_din_ch0[ 15 ] }} ,i_din_ch0 } ;
end
always   @ ( posedge  i_clk)
begin
     if  (r_cal_remain_edge  ==   2'b10 )  //上升沿
        r_value_add_ch1  <=   32'd0 ;
     else   if  (r_calibration_en)
        r_value_add_ch1  <=  r_value_add_ch1  +   {{ 16 { i_din_ch1[ 15 ] }} ,i_din_ch1 } ;
end
always   @ ( posedge  i_clk)
begin
     if  (r_cal_remain_edge  ==   2'b10 )  //上升沿
        r_value_add_ch2  <=   32'd0 ;
     else   if  (r_calibration_en)
        r_value_add_ch2  <=  r_value_add_ch2  +   {{ 16 { i_din_ch2[ 15 ] }} ,i_din_ch2 } ;
end
always   @ ( posedge  i_clk)
begin
     if  (r_cal_remain_edge  ==   2'b10 )  //上升沿
        r_value_add_ch3  <=   32'd0 ;
     else   if  (r_calibration_en)
        r_value_add_ch3  <=  r_value_add_ch3  +   {{ 16 { i_din_ch3[ 15 ] }} ,i_din_ch3 } ;
end
对其用SV进行二维数组合并及generate语句改写:极大的精简了代码量,同时方便调试修改。
logic  [ 3 : 0 ][ 31 : 0 ] r_value_add =   32'd0 ;
genvar  i;
generate  
     for  (i = 0 ;i < 4 ;i ++ )
     begin
         always_ff   @ ( posedge  i_clk)
         begin
             if  (r_cal_remain_edge  ==   2'b10 )  //下降沿重新启动校正流程
                r_value_add[i][ 15 : 0 ]  <=   32'd0 ;
             else   if  (r_calibration_en)
                r_value_add[i][ 15 : 0 ]  <=  r_value_add[i][ 15 : 0 ]  +   {{ 16 { i_din[i][ 15 ] }} ,i_din[i][ 15 : 0 ] } ;
         end
     end
endgenerate  

以上。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值