如何在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  


Sim: 賦值[15:0] l_m_data 到 [3:0][3:0] l_s_data的信號,仿真其對應關系。信號剝離時使用。
timeunit   1ns ;
timeprecision   1ps ;
module   top ;
logic  [ 15 : 0 ] l_m_data  =   16'habcd ;
logic  [ 3 : 0 ][ 3 : 0 ] l_s_data;
assign  l_s_data  =  l_m_data;

endmodule  
可以看到是高對高,低對低。

以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM