背景:想学习for循环能不能综合出电路,这样提高可以写代码灵活性。网上说可以,于是简单做了实验。
实验:用for写可变长度的移位寄存器。默认为3级移位寄存器(depth=3),宽度为2bit(width=2)。
代码:
module shift_reg_M_N
#( parameter width = 2,
parameter depth = 3
)
(
input rstn,
input clk,
input [width -1 : 0] data_in,
output reg [width -1 : 0] data_out
);
reg [width -1 : 0] data_reg [0 : depth - 1 ];
reg [$clog2(depth):0] i ;//more 1 bit width
always@(posedge clk or negedge rstn)begin
if(!rstn) begin
for( i = 0; i < depth ; i = i + 1) begin
data_reg[i] <= 0;
end
data_out <= 0;
end
else begin
data_reg [0] <= data_in ;
for(i = 1; i < depth ; i = i + 1) begin :shift
data_reg[i] <= data_reg[i - 1] ;
end
data_out <= data_reg[depth - 1] ;
end
end
endmodule
RTL 电路
综合后的电路
testbench仿真
在testbench中把移位寄存器设置4级(depth=4),位宽设置为5bit。
module tb_shift_M_N();
reg clk;
reg rstn;
initial begin
clk <= 0;
rstn <= 0;
end
localparam width_data = 5;
localparam depth_shft = 4;
always # 1 clk = ~ clk;
always begin
#10 rstn <= 1;
#1000 rstn <= 0;
end
reg [width_data-1 : 0] data_in;
wire [width_data-1 : 0] data_out;
always @(posedge clk or negedge rstn)begin
if(!rstn) begin
data_in <= 0;
end
else begin
data_in <= data_in + 1;
end
end
shift_reg_M_N
#(
.width (width_data ),
.depth (depth_shft )
)
u_shift_reg_M_N(
.rstn (rstn ),
.clk (clk ),
.data_in (data_in ),
.data_out (data_out )
);
endmodule
初步结论:
for循环可以综合电路,我理解就是把for符合条件表达式的各个项并行展开执行。