【 IC每日一题】

IC每日一题

  • [1 八股题:低功耗设计方法](#1 八股题:低功耗设计方法)
    • [1.1 功耗类型](#1.1 功耗类型)
      • [1.1.1 动态功耗](#1.1.1 动态功耗)
      • [1.1.2 静态功耗](#1.1.2 静态功耗)
    • [1.2 SoC低功耗设计方法](#1.2 SoC低功耗设计方法)
      • [1.2.1 基于时钟clock的低功耗设计](#1.2.1 基于时钟clock的低功耗设计)
      • [1.2.2 基于电压域voltage的低功耗设计](#1.2.2 基于电压域voltage的低功耗设计)
      • [1.2.3 多阈值库](#1.2.3 多阈值库)
      • [1.2.4 RTL低功耗设计](#1.2.4 RTL低功耗设计)
  • [2 手撕题:序列检测](#2 手撕题:序列检测)
    • [2.1 移位寄存器写法](#2.1 移位寄存器写法)
    • [2.2 状态机写法](#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 移位寄存器写法

verilog 复制代码
//=======================================
//--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;

状态机写法:

状态机图:

verilog 复制代码
//=======================================
//--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

相关推荐
中古传奇18 天前
【IC每日一题--单bitCDC跨时钟和同步FIFO】
ic
中古传奇25 天前
【IC每日一题】
ic
Lambor_Ma1 个月前
【ARM】v8架构programmer guide(6)_MMU内存管理模块
arm开发·架构·硬件架构·ic·soc
这是我581 个月前
C++版iwanna1
c++·其他·游戏·ic·visual studio·iwanna·坑爹
Carol06303 个月前
20240829版图的层次
ic
Lambor_Ma3 个月前
【数字时序】时钟树延迟偏差——CPPR adjustment
ic·芯片设计·soc
Lambor_Ma3 个月前
【ARM】Cortex-A72技术手册(1)
arm开发·架构·硬件架构·ic·soc
Lambor_Ma3 个月前
【ARM】v8架构programmer guide(3)_ARMv8的寄存器
arm开发·架构·硬件架构·ic·fpga·soc·芯片