IC每日一题
- 1 八股题:低功耗设计方法
- 1.1 功耗类型
- 1.1.1 动态功耗
- 1.1.2 静态功耗
- 1.2 SoC低功耗设计方法
- 1.2.1 基于时钟clock的低功耗设计
- 1.2.2 基于电压域voltage的低功耗设计
- 1.2.3 多阈值库
- 1.2.4 RTL低功耗设计
- 2 手撕题:序列检测
- 2.1 移位寄存器写法
- 2.2 状态机写法
Less Is More.
1 八股题:低功耗设计方法
芯片最经常考虑的trade off: PPA;
概念背景:为什么需要低功耗设计,以手机为例,功耗越低,手机电池越耐用;功耗越低,意味着越环保、系统系统越稳定、系统越可靠、散热成本越低等;
1.1 功耗类型
1.1.1 动态功耗
动态功耗 = 翻转功耗 + 短路功耗;
翻转功耗即传输数据(0–>1; 1–>0的变化);
短路功耗即由短路电流引起的功耗;
1.1.2 静态功耗
静态功耗是由 漏电流引起的功耗;
漏电流的几部分组成:PN结反向电流;源级和漏极之间的亚阈值电流;栅极漏级漏电流;栅极和衬底之间的隧道电流;
1.2 SoC低功耗设计方法
SOC中主要功耗:时钟树、处理器和存储器;
以下这张图能够给予设计指导;
低功耗设计一般方法主要有以下:
1.2.1 基于时钟clock的低功耗设计
----思想:门控时钟:当某子系统不工作时,进行时钟门控掉,减少翻转;
可以使用DC工具自动添加时钟;
1.2.2 基于电压域voltage的低功耗设计
电压与功耗有密切的关系;通过设置多电压区域技术;
1.2.3 多阈值库
在进行工艺替换时,考虑选择多种阈值的cell;
1.2.4 RTL低功耗设计
- 并行处理和流水线Pipline:通过将任务分解为多个并行的子任务,并在子任务之间插入寄存器,可以减少关键路径上的延迟,从而降低功耗。
- 优化编码:格雷码代替二进制,减少翻转;
- 资源共享复用: 比如存储资源;总线资源复用等;
- 操作数隔离: APB总线在下一次传输来临之前,地址/控制信号可以不变,以此来降低功耗;
2 手撕题:序列检测
题目:检测序列比如: 1100_1101;主要有以下两种写法;
2.1 移位寄存器写法
//=======================================
//--Author : colonel
//--Date :10—25
//--Module : sequence_check_det
//--Function: check a sequence
//=======================================
module sequen_check_det(
//==========================< 端口 >=========================
input wire clk,
input wire rst_n,
input wire din,
output wire det
);
//==========================< 参数 >=========================
parameter SEQUENCE_DET = 8'b1100_1101;
//==========================< 信号 >=========================
reg [8 -1:0] data;
//=========================================================
//-- 寄存器来确定
//=========================================================
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
data <= 8'b0000_0000;
end else begin
data <= {data[6:0],din};
end
end
assign det = (data==SEQUENCE_DET) ? 1'b1 : 1'b0;
endmodule
);
endmodule
2.2 状态机写法
题目:做序列检测1011;
状态机写法:
状态机图:
//=======================================
//--Author : colonel
//--Date :10—25
//--Module : sequence_check_det
//--Function: check a sequence using FSM
//=======================================
module sequen_check_det_fsm(
//==========================< 端口 >=========================
input wire clk,
input wire rst_n,
input wire din,
output wire det
);
//==========================< 参数 >==========================
localparam SEQUENCE_DET = 4'b1011;
localparam IDLE = 4'b0000;
localparam S1 = 4'b0001;
localparam S2 = 4'b0010;
localparam S3 = 4'b0100;
localparam S4 = 4'b1000;
//==========================< 信号 >==========================
reg [3:0] sta_cur;
reg [3:0] sta_nxt;
//===========================================================
//--FSM-1:fsm transition
//===========================================================
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
sta_cur <= IDLE;
end else begin
sta_cur <= sta_nxt;
end
end
//===========================================================
//--FSM-2:fsm jumb condition
//===========================================================
always @(*) begin
case (sta_cur)
IDLE: begin
if(din==1'b1) begin
sta_nxt <= S1;
end else begin
sta_nxt <= IDLE;
end
end
S1: begin
if(din==1'b0) begin
sta_nxt <= S2;
end else begin
sta_nxt <= S1;
end
end
S2: begin
if(din==1'b1) begin
sta_nxt <= S3;
end else begin
sta_nxt <= IDLE;
end
end
S3: begin
if(din==1'b1) begin
sta_nxt <= S4;
end else begin
sta_nxt <= S2;
end
end
S4: begin
if(din==1'b1) begin
sta_nxt <= S1;
end else begin
sta_nxt <= S2;
end
end
default: begin
sta_nxt <= IDLE;
end
endcase
end
//===========================================================
//--FSM-3:fsm action
//--det logic
//===========================================================
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
det <= 1'b0;
end else begin
case (sta_cur)
IDLE: det <= 1'b0;
S0 : det <= 1'b0;
S1 : det <= 1'b0;
S2 : det <= 1'b0;
S3 : det <= 1'b0;
S4 : det <= 1'b1;
default: det <= 1'b0;
endcase
end
end
endmodule
以上是序列检测器的两种写法;
[REF]
1.https://blog.csdn.net/wangkai_2019/article/details/106854081
2.https://blog.csdn.net/qq_57502075/article/details/127084530