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