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