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

  • Post author:
  • Post category:其他


前言
在信号处理实现过程中,对于多通道的数据定义,采用常规的方式就得定义多个通道变量。
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

以上。



版权声明:本文为chuoshumi7080原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。