前言
在信号处理实现过程中,对于多通道的数据定义,采用常规的方式就得定义多个通道变量。
verilog不支持二维端口数组定义,但SV可以,所以可以省点代码量。
流程
对于verilog 的代码:可以看到代码类似冗长。
reg
[
31
:
0
] r_value_add_ch0
=
32’d0
;
[
31
:
0
] r_value_add_ch0
=
32’d0
;
reg
[
31
:
0
] r_value_add_ch1
=
32’d0
;
[
31
:
0
] r_value_add_ch1
=
32’d0
;
reg
[
31
:
0
] r_value_add_ch2
=
32’d0
;
[
31
:
0
] r_value_add_ch2
=
32’d0
;
reg
[
31
:
0
] r_value_add_ch3
=
32’d0
;
[
31
:
0
] r_value_add_ch3
=
32’d0
;
always
@
(
posedge
i_clk)
@
(
posedge
i_clk)
begin
if
(r_cal_remain_edge
==
2’b10
)
//下降沿重新启动校正流程
(r_cal_remain_edge
==
2’b10
)
//下降沿重新启动校正流程
r_value_add_ch0
<=
32’d0
;
<=
32’d0
;
else
if
(r_calibration_en)
if
(r_calibration_en)
r_value_add_ch0
<=
r_value_add_ch0
+
{
{
16
{
i_din_ch0[
15
]
}}
,i_din_ch0
}
;
<=
r_value_add_ch0
+
{
{
16
{
i_din_ch0[
15
]
}}
,i_din_ch0
}
;
end
always
@
(
posedge
i_clk)
@
(
posedge
i_clk)
begin
if
(r_cal_remain_edge
==
2’b10
)
//上升沿
(r_cal_remain_edge
==
2’b10
)
//上升沿
r_value_add_ch1
<=
32’d0
;
<=
32’d0
;
else
if
(r_calibration_en)
if
(r_calibration_en)
r_value_add_ch1
<=
r_value_add_ch1
+
{
{
16
{
i_din_ch1[
15
]
}}
,i_din_ch1
}
;
<=
r_value_add_ch1
+
{
{
16
{
i_din_ch1[
15
]
}}
,i_din_ch1
}
;
end
always
@
(
posedge
i_clk)
@
(
posedge
i_clk)
begin
if
(r_cal_remain_edge
==
2’b10
)
//上升沿
(r_cal_remain_edge
==
2’b10
)
//上升沿
r_value_add_ch2
<=
32’d0
;
<=
32’d0
;
else
if
(r_calibration_en)
if
(r_calibration_en)
r_value_add_ch2
<=
r_value_add_ch2
+
{
{
16
{
i_din_ch2[
15
]
}}
,i_din_ch2
}
;
<=
r_value_add_ch2
+
{
{
16
{
i_din_ch2[
15
]
}}
,i_din_ch2
}
;
end
always
@
(
posedge
i_clk)
@
(
posedge
i_clk)
begin
if
(r_cal_remain_edge
==
2’b10
)
//上升沿
(r_cal_remain_edge
==
2’b10
)
//上升沿
r_value_add_ch3
<=
32’d0
;
<=
32’d0
;
else
if
(r_calibration_en)
if
(r_calibration_en)
r_value_add_ch3
<=
r_value_add_ch3
+
{
{
16
{
i_din_ch3[
15
]
}}
,i_din_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
;
[
3
:
0
][
31
:
0
] r_value_add
=
32’d0
;
genvar
i;
i;
generate
for
(i
=
0
;i
<
4
;i
++
)
(i
=
0
;i
<
4
;i
++
)
begin
always_ff
@
(
posedge
i_clk)
@
(
posedge
i_clk)
begin
if
(r_cal_remain_edge
==
2’b10
)
//下降沿重新启动校正流程
(r_cal_remain_edge
==
2’b10
)
//下降沿重新启动校正流程
r_value_add[i][
15
:
0
]
<=
32’d0
;
15
:
0
]
<=
32’d0
;
else
if
(r_calibration_en)
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
]
}
;
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 版权协议,转载请附上原文出处链接和本声明。