来源:EETOP BBS 作者:yaya126
原文:
http://bbs.eetop.cn/thread-636337-1-1.html
论坛里面讨论low power RTL前端设计的帖子好像不多,许多大牛的书上来就谈工艺,半导体结构,让我高山仰止,但也只能心向往之(实在有些看不懂)。
工艺的提升带来的收益可能远比RTL深度优化高,如TSMC 40LP vs TSMC 28HPC+, 后者基本上比前者面积小一半,速度快一倍,dynamic power小40~50%,
代价是leakage高3~4倍。在老工艺上如何绞尽脑汁优化设计,可能也很难达到这种效果。
但作为前端RTL designer, 一旦工艺选定,我们只能在自己的一亩三分地里面做到最好,本帖就此抛砖迎玉,结合自己的工作经验讨论下low power RTLdesign, 挖个坑,希望坛子里的大牛一起帮忙填坑。
刚入行做design时,考虑的是Area 和 speed,近些年来,power变成了越来越重要的指标,有时候更是牺牲Area和speed来换取power的收益,毕竟有些领域, 电池容量是很难增大的。
有人做过大体统计,降低功耗的方法和收益大体如下,对于前端RTL 设计,最好用的还是clock gating, 收益最显巨,代价最小,其他方法也能有可观的收益,具体还的依靠具体应用场景分析。
Power 主要消耗在:
1) combinational logic
2) sequential logic
3) memory
4) clock network
下面我将就下面几个方面展开讨论:
1.Improve clock gating efficiency.
a.Block level clock gating.
b.RTL clock gating. (重点)
2.Reduce data toggle rate.
a.FIFO vs PIPE
b.FSM coding style
c.Unnecessary reset.
3.Refine Memory Selection.
a.Area power balance
b.I/F bitwidth selection.
c.Depth selection.
4.Reduce memory accessing
a.Address caching.
5.Reduce logic size
a.Logic sharing.
b.Logic balancing
c.Divider optimization.
d.Reduce pipe line length
e.Hardmacro vs Register
f. Reduce bitwidth
g. Async reset vs non-async-reset.
6. Misunderstanding
1.Improve clock gating efficiency
a. block level clock gating
如果某个模块或者功能可以打开或关闭,且logic相对独立,则可以在这部分logic的时钟上加手动插入一个ICG,用模块是能控制ICG的开关,这样能最大限度的提升gating效率。
1. ICG最好选取驱动能力较大的,以便于驱动足够多的DFF。
2. ICG建议加一个wrapper,这样当需要替换其他工艺时,只需要将wrapper里的instance 换掉。
3. 综合时对此类ICG设置don’t touch
b. RTL clock gating.
Lowpower RTL综合的精髓就是把本该综合在D端的enable信号,综合到CLK端,这样只有enable有效才能释放一个clk使得D端数据传递到Q端。当D超过一定bit数,通常认定>=4bit能节省power, 为了达到这种效果,寄存器的赋值一定是条件赋值,示范代码和电路如下,
Mentor有power_pro能够帮助分析RTL,提取有效的enable,并完成代码的优化,但就我看下来,它优化过的代码可读性非常差,条件有时候也有冗余,导致过多的使能ICG,而且后续如果需要ECO,还需要购买它的formal工具,不然很难再改它的code.
此处我提供一个自己写代码分析的perl脚本,可以用来查所有代码中不符合low power RTL 代码规范的code, designer可以根据它的报告来优化赋值使能条件,已经过实际项目测试。
欢迎大家使用并提意见。(后面会解释为毛要查2d arry, initial和乘法器)
power_check.pl –v –f [filelist] –d [directory] -filter [N]–b –2d –init -mul [top.v]
-v or –verbose :print verbose log for debug.
-f or –file : input file list.
-d or –dir : set searching directory, script will findVerilog file under this directory.
-b or bak : back up previous result.
-filter [N] : filter <= N bits register error.
-2d or 2d_array :report2D register array.
-initial or init :report initial block
-mul :report multiplier info
Verfilog file : input Verilog file
产生结果文件,最重要的power_check.v。
运行时报告:
power check perl script: (登录论坛可下载)
power_check.rar (7.87 KB)
Low power RTL 理想代码结构:
1 always@(posedge clk or negedge rstn) begin
2 if(!rstn)begin
3 Q<= 'h0;
4 end
5 else if (condition_1)begin
6 Q<= D_1;
7 //other condition 2, 3, 4 …
8 else begin
9 Q<= Q; //better to remove this assignment, then data willbe kept.
10 end
11 end
错误代码的示例, 如果不管在什么情况下,总有D值需要打到Q, 使得即使综合出来ICG, 该ICG也不能关断。错误远不止下面几种,if/else if/else, case/default 等等
1. 没有赋值条件
1 always@(posedge clk) begin //”if-else”hierarchy 0, default is “else” block
2 Q <= D; //Error: no condition for Dataassignment.
3 end
2 . else 赋值
1 always@(posedge clk or negedge rstn)begin //hier0
2 If(!rstn)begin //hier1 “if” block
3 Q <=’h0;
4 end else begin //hier1 “else” block
5 Q<=D; //Error: no condition for Dataassignment.
6 end
7 end
3. 多级条件中的else
1 always@(posedge clk or negedge rstn)begin //hier0
2 If(!rstn)begin //hier1 “if” block
3 Q <=’h0;
4 end else if(condition1)begin //hier1 “else if” block
5 If(condition1_1)begin //hier2“if”block
6 Q<=D1_1;
7 end else begin //hier2“else” block
8 Q<=D1_2; //not report error, as it is in “else if”block.
9 end
10 end else begin //hier1 “else” block
11 If(conditon2_1) begin //hier2“if” block
12 Q<=D2_1;
13 end else begin //hier2“else” block, in hier1 “else” block
14 Q<=D2_2; //Error: no condition for Data assignment.
15 end
16 end
17 end
4. 下面这个例子不会报错。
1 always@(posedge clk or negedge rstn)begin //hier0
2 If(!rstn)begin //hier1 “if” block
3 Q <=’h0;
4 end else if(condition1) begin //hire1 “else if” block
5 Q<=Q; //”Q<=Q”ensure ICG insertion
6 end else begin //hier1 “else” block
7 Q<=D; //Not reportERROR as “Q<=Q” in “else if”.
8 end
9 end
2. Reduce data toggle rate
a. FIFO vs PIPE
当数据需要穿过N拍delay后再使用时,我们通常有两种方法来实现, 1是讲数据打N级pipe,一级一级往传。 2是将数据存入FIFO, 到后级需要使用时直接读出来。 两种方式VLD都需要单独传递。
对比PIPE的方式,FIFO的方式有额外地址计算比较的开销,但每个数据只需要读写各一次,不像PIPE,数据需要在整个PIPE中shift一轮,FIFO 方式每个寄存器的toggle rate将大幅下降。 假设数据的toggle rate 位Tr, N级pipe的 toggle 为N*Tr, FIFO 为 Tr。
如果由于FIFO输出数据+后续计算timing不满足,可以考虑缩短一级FIFO,最后一级仍由PIPE输出。
根据我在TSMC 40nm和28nm下PTPX仿真结果分析。(具体数据可以单独找我要)
结论:
FIFOreplace PIPE for power reduction:
when ADDR >=2 bit , DATA should be >=4 bit, DATA 越宽,级数越深,FIFO power 收益越高,但有额外的面积开销。
上面脚本提供命令 power_check.pl -2d -d . 来把代码中所有的 2D array 找出来,有些同学喜欢把PIPE 赋值写成下面的样子
for( i= 1 ; i< N; i ++) begin
if(VLD[N-1])
Array[N] <= Array[N-1] ; //这个代码虽然是有条件赋值,但如果符合上面的条件,可以考虑换成FIFO.
end
b. FSM code style:
状态机常用编码有3种:
1. one-hot: 如 3'b001->3'b010->3'h100, 状态个数 = 比特位宽一样, 每次状态变化,最多只有两个bit变化。
2. 2进制编码, 如 3'b000->3'b001->3'b010->..., Nbit 能支持 2exp(N)中状态。
3. 格雷码, 3'b000->3b001->3'b011-> 3'b010-> ... 如果按照顺序变化,每次只有一个bit跳变。
总体来说,one-hot使用bit数较多,power最差,如果状态跳变有一定顺序,采用格雷码编码能降低toggle rate.
40LP下4 bit FSM, 16个状态,从4‘h0 跳转到4'hf’’的状态机, 功耗面积对比结果如下。
即使状态机不能完全按照格雷码编码,把频繁跳转的状态用格雷码编码,也能获得举手之劳的power收益。尽量少用one-hot编码。
FSM | power | area |
Gray code | 8.697e-06 | 110.95(best) |
One-hot | 1.023e-05 | 166.69 |
binary | 9.984e-06 | 108.48 |
c. Unnecessary reset:
对于控制寄存器,清理掉残余状态很多情况下是必要的, 但对于data寄存器,数据残余可以不要复位。
如果只在read_en的条件下把有效的数据写入rdata, 完全没有必要在!read_en的时候复位寄存器,这个做只是白白增加toggle rate.
If(read_en) rdata <= read_data
Elseif(!read_en) rdata <= ‘h0; //Don’t reset rdata to all 0.
如果写了这种语句,即使用power优化工具,或者上面那个脚本,都是没有办法来优化的, 总的来说,寄存器使能调件越精确(打开ICG几率越少), 越有利于power 优化。
3. Memory Selection
SRAM的选择有很多讲究,我们需要看throughput, size, width 来决定到底是选1p, 2p, spra 和 1prf,通常情况下,在满足速度要求的情况下,挑选面积小的。 在这里我提一种新的挑选方法,即在速度达到要求的前提下,挑选power, area 性价比最高的。
当我们选的面积最小的为基准时,看面积增加的百分比和power减少的百分比的差值,假设area 和power对性价比评估各占50%的权重,如面积增大10%, 但power 下降20%,则认为性价比变好了,如果只换来5%的power下降,则认为性价比变差了。
当然我们可以调整area/power的权重来改变挑选规则,极端情况下,把area权重设置为100%就是通常下挑面积最小的那种方法。
那么,我们只需要用memory生成工具,将满足尺寸的sram按照不同的rf/sram segment_option ,MUX,Width, Bits 用脚本全部生成一遍, 用上叙规则挑选最优,有些面积相差不大的sram,power差20~30%.
除了同样存储大小的sram, 位宽扩大一倍,深度减小一半的也可以考虑,如256x10,可以考虑生成128x20,位宽大一倍,不意味着每次读写power大一倍,但读写次数如果减少一半,这样也能带来可观的收益。
另外同样位宽,深度减半的也可以考虑,(这个从我做的实验看,收益不如double位宽的)
总之,挑sram不光考虑面积,可以尝试不同的选择,更多的考虑性价比。
Sram面积可以直接从生成文件里读出,但power需要手工计算:假设standby power 不考虑,只考虑read/write power, 我们可以从生成文件中得到每次读写所需要的power,Pwr, Prd, 然后根据sram使用的特性,比如在一定时间内(周期内),是多少写多少读,乘上单次读写的对应的power,就可以大体估计sram的power.
另外强烈建议在生成的sram 外面加个wrapper, 并手动插入一个ICG,只有在RD或者WR的时候才打开ICG,通常情况下,sram的clock是被gating掉的。
4. Memory Address Caching
Address caching:
当sram使用场景需要对同一地址多次查表时,可以考虑将上一轮读地址存下来,于新地址比较,如果在上次读之后没有对该地址的写操作,且新地址等于寄存的地址,则可以省略该轮读访问。
5. Reduce Logic size
Area大通常意味着power大,站在save power的角度,减少面积,减少逻辑单元,和降低功耗的方向是一致的。
Logic share:
有些逻辑的throughput要求不高,一份逻辑分时进行N次计算,等效于N份逻辑在一定时间内计算一次。复用之后计算总量一样,但静态功耗会降低。当然需要考虑1份逻辑N次计算带来的副作用,计算latency加长是否可以接受。
Multiplier:
乘法器,在这特指变量乘变量,如果是变量乘以常数,综合工具都是综合成加法器,不在考虑范围内。
同等bit数,乘法器比加法器大许多,对于每个乘法器,我们都
1) 需要仔细review它的使用是否必须,
2) 使用的时候位宽是不是可以降低,乘法器位宽严重影响综合面积和timing, 在计算的时候,即使是signed的数,也不要轻易添加N bit 最高位(符号位),建议使用verilog 2001 语法, 用 $signed(A[dw-1:0])* $signed(B[dw-1:0]), 千万别写成 {{(dw){A[dw-1]}}, A[dw-1:0]}*{{(dw){B[dw-1]}}, B[dw-1:0]}, 虽然输出位宽为 2dw。 上面提供脚本 power_check.pl –mul -d . 可以抓代码中所有的乘法器来集中review)
3)乘法器是不是前后组合逻辑很多,造成综合工具为了meet timing而产生一个超级并行(巨大)的组合逻辑(这个在logic balance也会提到),
4)“乘加”逻辑是不是可以转变成“加乘”逻辑, 这里“乘加”指的是A*mul 和B *mul 乘完后寄存后再加,还是(A+B)*mul 后再寄存, 如果在同一拍内,即使写成A*mul+B*mul, 综合工具也会优化成(A+B)*mul, 但建议在代码上体现先加后乘。
下面是4bit与15bbit “乘加” ,“加乘”面积比较, “乘加”面积几乎大一倍
ADD_before_Mul or Mul_before_ADD | Area(um2) | Multiplier number |
ADD_MUL =bit4*(bit15+bit15) | 543 | 1 |
MUL_ADD =bit4*bit15+bit4*bit15 | 919 | 2 |
Divider optimization(N/M):
乘法器通常1拍内完成,但除法器少有能1拍完成的。乘法我们可以直接在代码里面写“*”号,综合工具通常能给我们满意的结果,但除法器,极少数情况下我们直接写“/”,大部分情况我们需要单独inst 除法module.
标准除法器(N和M 都是变量):
基本的设计思路是移位减,如果每个cycle计算被除数1bit, N/M, 我们需要N拍,如果每个cycle 2bit则需要(N+1)/2 拍,这样的除法器面积都不大,但计算latency长。同时EDA公司也提供的design-ware除法器,速度更快,面积也更大。当然还有一种查LUT表的除法器,但我没用过,不好评价
特殊除法器:
1)除数是2的幂次,如2, 4, 8,很多人会想到直接移位,对于被除数是正数来说移位绝对正确,但如果被除数是负数,除法结果收敛到0,移位结果收敛到-1,
如 -5/64=0, -5 == 5B'1-1011, 右移后,变成5b'1-1111,= -1,两者结果不同。
判断高位是都全为1,如A[m,0]>>n, 需要确认A[m,n]的情况
|A[n-1:0] !=1'b0? A[m,n] + 1'b1 : A[m,n];
2)除数是常数,最好为 (2的幂次+/-1), 如5,,7,可以考虑泰勒展开,用2的幂次和来近似。
如下 用最近的2的幂去近似的除,将余数和商迭代知道其和小于除数。 Div/(2^X - K)
step1 Div/2^X = M0 ... R0 if K*M0 + R0 >=2^X - K, to step 2, else M= M0,R=R0+K*M0
step 2 (K*M0+R0)/2 …
如下
100/7 =14 ...2
step 1 100/8 = 12 .. 4 if (12+4)>= 7, to step 2
step 2 (12+4)/8 = 2 ...0 if (2 +0 )<7 . result = 12 +2 ...2.
3)除数是常数,是不是可以用近似的乘法来代替,比如先计算X= 1024/M, 再用
X*N/1024来还原成N/M. 当然这个除法会有精度损失需要考虑。
网上还有相关文档针对特殊除法器的优化,这个需要具体应用具体分析。
正因为除法器在面积和latency上的差异非常大,特别是长latency的除法器,很容易成为计算逻辑中的瓶颈,别的逻辑都在等着它的结果才能开始后面的计算。因此在选择不同除法器时,需要考虑整个data-path的开销,减少1个cycle的除法计算,是不是能缩短整个path 1 拍,可以节约多少寄存器。
当data-path不关心除法latency的时候,直接选1bit移位减的除法器area和power最优,如果能结果逻辑复用效果更佳。
Attend Mentor low power RTL design and HLS seminar
上午是powerpro 的AE讲它们如何省power,如何评估power, 稍后和大家分享。
就我看来:
Automatic power reduction: RTL is very hard to understand after modification.
power estimation: to get real data, prefer PTPX with fsdb, (saif is not accurate, especially when estimate memory)
Guilded Power estimation: 基本就毛估估了。
不过这可能是我的偏见,看看今年他们有什么更新。
hls_bluebook.pdf (14.29 MB)
mentorpaper_98423.pdf (2.42 MB)
mentorpaper_102112.pdf (1.35 MB)
mentorpaper_94085.pdf (589.09 KB)
(登录论坛可下载)
今天mentor seminar分享的一些资料, 部分资料还没收到,low power RTL design, 工具虽然能帮你查漏,但save power还的有自己基本的理解,并在设计中灵活运用,如果代码写的好,它是没有水平来优化你的code的。
powerpro 虽然功能强大,3大功能,但在我看来,
1. power estimation 不如PTPX, power sign-off还是要ptpx,也许他便宜点。总之power 估计这东西,garbage in garbage out, 要想估的准,输入就的准,前期毛估估,与最终结果随便差30%
2. automatic RTL power optimizaiton: 我是不会让他来改我的code,改了看不懂,做ECO后还要买他的formal工具slec.
3. guiilded RTL power optimization: 可以看看他的手册,白皮书,学习下理念,他提到的"shift register vs circular buffer"理念 和我的“ pipe vs FIFO ”不谋而合,具体操作中,大家还是在自己的工艺下用脚本跑一下比较,看看到底在什么深度和data-width下fifo才有收益。 一般应用,我上面提供的脚本已经能解决大部分问题。
HLS: 如果是low power RTL design, 建议还是不要用,这东西就是给软件人员写硬件code用的,估计很多情况下,你一句下去都不知道底层实现的是什么。 他举例也是 nv 的 tergra 1, 当年这个不就是高功耗的代表,发热感人吗。
如果是为了拉风投,做demo,快速出产品,可以考虑HLS, 这比写code 还是快多了。
Reduce pipe-line length:
在写RTL前,我们应该知道最基本的计算单元(*,+,>= 等)的延时和面积,这个数据可以通过对基本计算单元在SDC中约束紧和松的综合得到。在tight的情况下,我们能看到综合工具把逻辑并行展开,面积非常大,也许还不能meet timing。在loose的情况下,逻辑串行都能满足timing要求。两者面积相差3~6倍都不稀奇。
Reduce pipe-line, 要求对基本的组合逻辑delay有基本的认识,合理的排列pipe-line,同时注意关注data-path converge点,看看data-path长短的瓶颈在哪条分支上,压缩关键分支是否能带来整个path的缩短,以及这样带来的好处。
当然预估datapath的延时和面积的影响,这个要求非常高,我自己也难做的很好,一般为了timing容易meet,大家可能都会在设计是留足余量,导致path比理想状态下长不少。但我有一个想法,也许可以帮大家找到最合理的pipe-line length,我准备整个脚本来帮忙实现这个功能。(仅针对算法模块,控制少,计算多)
1.先直接照搬C code, 不考虑timing,把中间计算逻辑RTL写出来,最后输出用寄存器,建议写出参数化的方式,方面后续re-timing.
2.进行tight/loose两轮综合,这样我们得到组合逻辑的最大面积(最小delay)和最小面积(最大delay)。
3.通过最大delay/clock_period, 得到最小的pipe-line length。通过最小delay/clock_peroid,得到最大的pipe-line length
4.用re-timing的方式,从最小pipe-line length开始,调整pipe-line重新综合,不停找面积的拐点,我期待看到的结果是,中间有个面积最小的拐点,或者直到pipe-line length 最大,面积单调递减。
5.面积最小的pipe-length就是理想的结果。
如上图,纵轴Z是面积,X轴是频率, Y轴是PIPE length, 在不同的频率下(不同的截面),不同的pipe面积曲线是图上离散的点,我们求的就是面级最小解。
我们可以用这个结果来指导实践RTL design, 达不到最好可以采用次好,但总比没有准备直接上手要好。如果脚本准备妥当,只是花几轮综合的时间,我觉得可行性还是有的,反正都是机器跑,不然这种设计全凭经验,没有benchmark来check quality.
我还想是不是还可以用HLS的综合结果来当benchmark,算法c code 去综合,看看catapuls给出来的建议是多少级,再和上叙re-timing循环综合的最优结果比,差多少,如果两者接近,证明HLS的建议可
Reducebit width:
最简单的比如 4 个10 bits数相加,也许就会有人得出需要13bit的结论
C code: F= A+B+C+D
Wire [10:0] F_pre1 = A[9:0] + B[9:0];
Wire [11:0] F_pre2 = F_pre1 + C[9:0];
Wire [12:0]F = F_pre2 + D[9:0]; //sum of four10bit only need 12bit result.
特别是有些计算,如果能够通过简单推导或者合并降低位宽,那会既省面积又省power.
Hardmacrovs Register:
Tsmc 40 nm工艺下面,简单对比单个寄存器和sram的大小,
SDFCNQD1BWP 5.2u2 (Min size )
SDFCNQD2BWP 5.9 u2
For 1prf128x36=5458u2, each bit is 1.18u2
Forsparm576x32=12884, each bit is 0.69u2
Forspram 896x48=23515u2, each bit is 0.546u2
通过查手册,知道单次读写的power, 以便在大量数据需要寄存时,分析到底是用hardmaco 还是 DFF.
Logicbalancing:综合工具在时序紧的时候更多的用并行逻辑来减少计算delay, 在时序松的时候用串行逻辑来减少面积,如果我们在写code的时候能把一些不在关键路径上的逻辑拆开,这样能优化面积,同时减少power. 如下图,非关键路径第一拍逻辑多,第2拍逻辑少。
balance后的结构如下:
一个具体实例如下:两个时序很紧的加法器balance后area power的变换。 area power都有下降
Style | Power | area |
No-balance | 6.491e-06 | 729.06 |
Balance | 5.618e-06 | 373.08 |
当然,如果为了balance 逻辑需要寄存大量的中间结果也是不合适的,上面power没降这么多是因为增加寄存器hold中间结果,这个最好能有工具提供优化提示。
关注EETOP,回复关键词 芯片合集 查看相关文章:
精品课程:先进制程工艺集成电路ESD电路如何设计?
精品课程:集成电路闩锁效应与工程应用
7nm : 台积电 VS 三星
格芯成都厂为何会停摆?
半导体的过去、现在和未来
芯片制造新模式--像搭积木一样造芯片
大型IC设计中心的IT环境
芯片设计中电迁移和IR压降的挑战和技术
芯片面积太大了!三星 Exynos 9820 内核照片曝光
麒麟980内核照片:NPU在哪呢?
六家 5G 基带芯片介绍及市场剖析
SoC与5G基带分居了 原因是?
IC大牛10多年的设计分享:数字典型电路知识结构地图及代码实现
关于华为海思,这篇文章值得一看
俄国没有高端芯片,为什么却能造出一流武器?
别拦我,我要做芯片!
芯片春秋·ARM传
中国芯酸往事
印度芯酸往事
国防军工芯片行业深度报告
一位美国芯片公司华人高管对中国芯片行业的思考
学习、积累、交流-IC设计高手的成长之路
女生学微电子是一种什么体验?
MIPS架构开放了,10天设计一款完全免费的MIPS处理器(附源码)
性能之殇:从冯·诺依曼瓶颈谈起
AI芯片设计与开发概览
AI 芯片和传统芯片有何区别?
一个资深工程师老王关于AI芯片的技术感悟
隔隔壁老王:AI芯片与她怎么选?
终于有人把云计算、大数据和人工智能讲明白了!
尺寸减半、功率翻番!——氮化镓技术的现在和未来
逻辑综合 Design Compiler 资料大全
集成电路制造技术简史
半导体科普:IC芯片设计及生产流程
晶圆代工争霸战四部曲(了解各晶圆厂的前世今生,非常详细!)
非常详细的半导体工艺流程讲解
射频半导体工艺介绍
版图中Metal专题——线宽选择
有哪些只有IC工程师才能get到的梗?
为什么7nm工艺制程这么难?从7nm看芯片行业的“贫富差距”
什么是台积电的SoIC?
RISC-V打入主流市场的诸多问题
RISC-V架构有何优势?
关于RISC-V 终于有人讲明白了!
RISC-V软核+FPGA 航天军工产品设计新机遇
ASIC低功耗设计实例分析及书籍推荐
ASIC设计学习总结(包括:工具及书籍文档推荐 、软件环境搭建、RTL设计、验证、工艺库说明、形式验证、综合等共12部分)
ASIC设计学习总结之可测性设计及书籍推荐
ASIC设计学习总结之静态时序分析概要及书籍推荐
ASIC设计学习总结之工具及书籍文档
小芯片大价值 | ASIC工程师如此值钱到底为什么?
芯片面积估计方法简介
自主研发通信芯片有多难?通信行业老兵告诉你,没那么简单!
RISC-V精简到何种程度?能省的都省了!
多核CPU设计及RISC-V相关资料
时序设计与约束资料汇总
模拟版图讲义
GDSII转DEF的flow简介
机器学习将越来越依赖FPGA和SoC
Verilog基本功之:流水线设计Pipeline Design
先进封装发展趋势分析PPT
先进封装发展现状分析PPT
可测试性设计与ATPG
麒麟980是如何诞生的?敢于失败,勇于尝试!(附:华为早期型号处理器研发过程)
IC模拟版图设计讲义
Verilog CPU设计实例
CPU、GPU 和 TPU 都是如何工作的?有什么区别?TPU为什能碾压GPU?
流行数十年的主流芯片架构正在悄然巨变
与IC设计产业相比,EDA产业发展的难处有哪些?
千兆以太网 TCP, UDP协议, FPGA实现
SoC功能仿真验证技术分享
对验证的一些理解
IC Layout 脚本分享
异构整合,半导体下一个关键
用Python编写FPGA以太网MAC(附源码下载方式)
用python进行机器学习
直接产生verilog的testbench的python脚本
干货!ASIC牛人之经典总结
ASIC前后端设计经典的细节讲解
资料分享|时序分析
Verilog基本电路设计(包括:时钟域同步、无缝切换、异步FIFO、去抖滤波)
128点 FFT verilog代码分享
硬核实现 ”春节快乐” 代码分享
FPGA在人工智能时代的独特优势
什么是FPGA工程师的核心竞争力
从芯片到系统:FPGA加速卡的发展历程与展望
基于FPGA的深度学习加速器的挑战与机遇
FPGA正变成“瑞士军刀”, 越来越像SoC
数字前端及FPGA设计相关书目泛读及点评
数字IC设计学习流程
防止毛刺的时钟切换电路的设计思想
函数发生器实现方法简述
用FPGA实现简单的UDP/IP通信(采用纯硬件语言,非软核)
数字集成电路设计入门 --从HDL到版图
同步器的设计
数字IC工程师的技能树
微电子树
IC设计完整流程及工具简述
IC芯片设计及生产流程
IC 芯片的成本从哪里来?
说说芯片设计这点事
关于IC设计的想法
数字IC设计的完整流程(非常详细!)
数字IC Design技术全局观(110页PPT!)
ASIC设计中各个阶段需要注意的问题
深入浅出谈谈Setup和Hold
大话setup time与hold time
静态时序分析中的setup和hold存在负值的问题
关于静态时序分析STA的切入点及方法
静态时序分析(STA)基础与应用
组合逻辑设计中的毛刺现象
数字IC设计工程师的发展前景如何?
一个合格数字IC设计工程师的知识结构
RS编解码Verilog代码RS(255,247)
RS(255,239)编解码算法,verilog代码以及详细讲解
非常详细的Verilog讲义教程,共472页
一个简单的8位处理器完整设计过程及verilog代码
网友经验分享: Verilog设计注意
关于同步与异步时序的Verilog一例
半导体、微电子专业英语词汇汇总
以DAC为例介绍SpectreVerilog数模混合电路仿真方法
IC设计与验证工程师友谊的小船说翻就翻
数字IC设计基本流程和所使用的工具
国外的数字IC面试题(非常详细,有答案)
读懂用好TimingReport
异步FIFO设计(非常详细,图文并茂,值得一看!)
平行宇宙的追逐--异步FIFO控制器的设计
异步FIFO为什么使用格雷码
数字IC设计工程师笔试面试经典100题(1~50)
数字IC设计工程师笔试面试经典100题(51~100)
同步/异步设计及metastability
全球顶尖芯片专家揭秘【低功耗芯片设计】真相
关于低功耗、低电压的bandgap电路
两篇关于RF PA 的博士论文
PLL经典讲义
神作:带宽!
功率谱密度
SerDes概述
深入浅出聊抖动(Jitter)
动态失调消除的方法(模拟IC设计黑科技!)
先进制程工艺集成电路ESD电路如何设计?
ESD讲义
成为一个资深Analog/RF IC Designer 需要怎样的经历?
功率半导体(VDMOS,IGBT,TVS)讲义
相比CPU,高性能模拟器件更担心被禁运,那么研发难点在哪儿?
RF PA 那些事
AACD 2017 Hybrid ADCs 资料大全
拉扎维16年写的-TSPC Logic
功率半导体器件基础(Baliga)(1085页)
模拟数字产品开发流程
SPICE简史
干货分享:测量自己的心电图(从理论到电路)
好的模拟IC工程师应该具有的素养
模拟IC设计领域的经典之作
是否需要模拟后仿真?
极点零点之我见
六本经典模拟IC书籍精彩评论及总结
模拟设计的100条圣经
模拟电路学习入门的建议
模拟IC流片经验分享
模拟IC年薪几十万师兄的模电学习经历
想成为一名模拟ic设计师在本科期间应该做哪些准备?
模拟电路设计的九重进阶
AnalogIC难在哪里,结构?参数?版图?系统?
模拟集成电路设计第二讲:传输函数,零极点的形成及时域响应
我还要不要继续学习模拟设计--一个跨行硕士的疑问
如何学习模拟IC设计
模拟大牛谈模拟工程师身价及发展方向
模拟电路应知应会200问
模拟后仿真的几种做法以及优缺点
关于模拟地与数字地很意思的解释
干货!深入浅出射频模拟电路设计经典讲义
伏模之路--模拟电路学习感悟
模拟IC设计真的很难学吗?
模拟IC正向设计流程总结
模拟学习感悟与总结
模拟滤波设计讲义
拉扎维模拟CMOS集成电路设计讲义Part3
拉扎维模拟CMOS集成电路设计讲义Part2
模拟学习感悟与总结
点击阅读原文前往论坛查看更多讨论