原则一:数据总线打拍建议使用无复位寄存器,可以减少静态功耗。
使用数据总线须在控制总线有效,因此数据总线需要打拍使用的情况下,无需复位。
原则二:控制总线打拍严禁使用无复位寄存器。
总线使用冗余代码:
module bus_power #(
parameter WIDTH = 8
)
(
input clk ,
input rst_n ,
input vld_in ,
input [WIDTH-1:0] data_in ,
output reg [WIDTH-1:0] data_out
);
reg [WIDTH-1:0] data_in_ff;
reg vld_in_ff ;
/*data_in_ff复位时冗余的,会带来多余的静态功耗*/
always @ (posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
vld_in_ff <= 1'b0;
data_in_ff <= {WIDTH{1'b0}};
end
else begin
vld_in_ff <= vld_in;
data_in_ff <= data_in;
end
end
always @ (posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
data_out <= {WIDTH{1'b0}};
end
else if (vld_in_ff == 1'b1) begin
data_out <= data_in_ff;
end
else;
end
endmodule
优化后代码:
module bus_power #(
parameter WIDTH = 8
)
(
input clk ,
input rst_n ,
input vld_in ,
input [WIDTH-1:0] data_in ,
output reg [WIDTH-1:0] data_out
);
reg [WIDTH-1:0] data_in_ff;
reg vld_in_ff ;
/*原则1:数据总线打拍建议使用无复位寄存器,可以减少静态功耗*/
always @ (posedge clk) begin
data_in_ff <= data_in;
end
/*原则2:控制总线打拍严禁使用无复位寄存器*/
always @ (posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
vld_in_ff <= 1'b0;
end
else begin
vld_in_ff <= vld_in;
end
end
always @ (posedge clk or negedge rst_n) begin
if (rst_n == 1'b0) begin
data_out <= {WIDTH{1'b0}};
end
else if (vld_in_ff == 1'b1) begin
data_out <= data_in_ff;
end
else;
end
endmodule
使用Vivado以上两段代码综合,查看二者功耗。
优化前功耗
优化后功耗
二者功耗比较,静态功耗没有差异,动态功耗有差异且优化后功耗降低。
静态功耗结果不符合预期,可能是由于工具的原因。
有知道的朋友可以帮忙解答一下原因......