首页
游戏
影视
直播
广播
听书
音乐
图片
更多
看书
微视
主播
统计
友链
留言
关于
论坛
邮件
推荐
我的云盘
我的搜索
我的记录
我的图片
我的图书
我的笔记
我的音乐
我的影视
我的邮件
我的游戏
Search
1
virtuoso和empyrean alps模拟仿真和混仿教程
359 阅读
2
在IC617中进行xa+vcs数模混仿
300 阅读
3
文档内容搜索哪家强? 15款文件搜索软件横向评测
264 阅读
4
科普:Memory Compiler生成的Register file和SRAM有何区别?
257 阅读
5
通俗易懂的AI知识体系图及其产业链全景图
198 阅读
默认分类
芯片市场
数字电路
芯片后端
模拟电路
芯片验证
原型与样片验证
算法与架构
DFX与量产封装
PC&Server OS设置
移动OS设置
软件方案
新浪备份
有道备份
登录
Search
标签搜索
AI
python
Docker
vcs
PyQT
STM32
cadence
linux
systemverilog
EDA
Alist
vscode
uos
package
MCU
C
QT
CXL
sed
sv
bennyhe
累计撰写
387
篇文章
累计收到
33
条评论
首页
栏目
默认分类
芯片市场
数字电路
芯片后端
模拟电路
芯片验证
原型与样片验证
算法与架构
DFX与量产封装
PC&Server OS设置
移动OS设置
软件方案
新浪备份
有道备份
页面
游戏
影视
直播
广播
听书
音乐
图片
看书
微视
主播
统计
友链
留言
关于
论坛
邮件
推荐
我的云盘
我的搜索
我的记录
我的图片
我的图书
我的笔记
我的音乐
我的影视
我的邮件
我的游戏
搜索到
387
篇与
的结果
2025-10-22
在verilog或者systemverilog中通过systemverilog获得环境变量setenv,getenv
在芯片验证的仿真中,有时候需要从文件中加载一些数据,比如激励、初始化数据、code等等,这些文件路径可以用绝对路径,当然为了其他人也可以用,最好用相对路径,这就需要用到环境变量来做路径的前半段。在module中得到或设置系统环境变量需要用到systemverilog的DPI-C,import C函数,然后在module中的块语句中调用C函数。步骤如下:在要获得环境变量的文件中 import setenv和getenv如下所示,把这两个函数import进去,不需要定义对应的C函数import "DPI-C" function int setenv(input string env_name, input string env_value, input int overwrite);import "DPI-C" function string getenv (input string env_name);直接使用getenv, setenv来获得和设置环境变量module mem read( input [8*200-1: O] mem_file ); initial begin $display("mem_file is %Os", mem_file); end endmodule module dut ( input clk, input wire [31:0]addr, output [31:0] rdata, input [31:0] wdata, input wire wr ); string path; initial begin setenv("PRJDIR", "/project/uart", 1); path = getenv( "PRJDIR"); $display("PRJDIR is %Os", path); setenv( "PRJDIR", "/project/sp", 1); path = getenv( "PRJDIR"); $display("PRJDIR is %0s", path); end mem_read u_mem_rd(.mem_file(path)); endmodule————————————————版权声明:本文为CSDN博主「甲六乙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/m0_38037810/article/details/126136552
2025年10月22日
45 阅读
0 评论
0 点赞
2025-10-10
gvim+tmux 和vscode+neovim 的ide 模式
vscode 界面安装的插件:vscode+neovim 设置参考这篇文档:http://bennyhe.cn/index.php/archives/327/gvim 的界面:常用功能都有,文件浏览、语法高亮、彩虹括号、括号自动补齐、输入关键词提示,ctag 函数跳转、文档状态、多terminal(tmux)集成等等常用功能。terminal界面采用tmux,配合clipper 工具可以和gvim 文本窗口互相粘贴,可以分页多个terminal。gvim 按照的插件~/.vim/ 下文件夹结构~/.vim/ 下文件(插件)acp.vim auto-pairs.vim grep.vim mark.vim NERD_tree.vim scala.vim Tabular.vim verilog_systemverilog.vim vtreeexplorer.vimairline.vim ctrlp.vim marksbrowser.vim matchit.vim rainbow_parentheses.vim showmarks.vim taglist.vim visual-increment.vim~/.vimrc 文件如下:if v:version >= 900 set scroll=1 let g:airline_scroll_size = 1 " 覆盖插件默认值 endif set number syntax on set showmode set showcmd set hlsearch set autoindent set smartindent set cindent set ts=4 set softtabstop=4 set shiftwidth=4 set noexpandtab set tabstop=4 set cursorline set cursorcolumn set lines=35 columns=100 set ruler set showmatch set wrap noremap <C-S-A> gggH<C-O>G inoremap <C-S-A> <C-O>gg<C-O>gH<C-O>G cnoremap <C-S-A> <C-C>gggH<C-O>G onoremap <C-S-A> <C-C>gggH<C-O>G snoremap <C-S-A> <C-C>gggH<C-O>G xnoremap <C-S-A> <C-C>ggVG noremap <C-S> :update<CR> vnoremap <C-S> <C-C>:update<CR> inoremap <C-S> <Esc>:update<CR>gi if has("clipboard") " CTRL-X and SHIFT-Del are Cut vnoremap <C-A-X> "+x vnoremap <S-Del> "+x " CTRL-C and CTRL-Insert are Copy vnoremap <C-A-C> "+y vnoremap <C-Insert> "+y " CTRL-V and SHIFT-Insert are Paste map <C-A-V> "+gP map <S-Insert> "+gP cmap <C-A-V> <C-R>+ cmap <S-Insert> <C-R>+ endif "source $VIMRUNTIME/mswin.vim behave mswin set guifont=Monospace\ 14 set linespace=4 colorscheme evening "unmap <C-V> "unmap <C-A> "unmap <C-C> "unmap <C-X> " copy paste map <C-Insert> "+y map <S-Insert> "+gP "Mouse could be controled when INSERT model set mouse=a set selection=exclusive set selectmode=mouse,key "============================= " showmarks setting "============================= " Enable ShowMarks let showmarks_enable = 1 " Show which marks let showmarks_include = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" " Ignore help, quickfix, non-modifiable buffers let showmarks_ignore_type = "hqm" " Hilight lower & upper marks let showmarks_hlline_lower = 1 let showmarks_hlline_upper = 1 hi ShowMarksHLl ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black hi ShowMarksHLu ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black "============================= " markbrowser setting "============================= nmap <silent> <leader>mk :MarksBrowser<cr> "Config for treeExplorer plugin let g:treeExplVertical=0 let g:treeExplDirSort=1 let g:treeExplWinSize=20 nmap vt :VSTreeExplore<cr> set autoread nmap <S-F> :call Verilog_format()<cr> function! Verilog_format() :w :silent execute '!~/.vim/tool/verible-verilog-format --column_limit=120 --indentation_spaces=4 --assignment_statement_alignment=align --named_port_alignment=align --port_declarations_alignment=align --module_net_variable_alignment=align --distribution_items_alignment=align --formal_parameters_indentation=indent --port_declarations_right_align_packed_dimensions=true --port_declarations_right_align_unpacked_dimensions=true --inplace=true --verify_convergence=true' expand('%:p') endfunction "ctrlp let g:ctrlp_map = '<c-p>' let g:ctrlp_cmd = 'CtrlP' "Grep hot key nnoremap <silent><C-F> :Grep -r<CR> "filetype, 'indent on' is necessary for smartindent filetype on filetype plugin on filetype indent on "header nmap <C-H> :call AddHeader()<cr> function! AddHeader() call append(0, '///////////////////////////////////////////////////////////////////') call append(1, '//copyright : Copyright © 2019-2023 INNOSTAR. All rights reserved') call append(2, '//project name: demo') call append(3, '//file name : '.expand('%:t')) call append(4, '//author : bennyhe') call append(5, '//abstraction : ') call append(6, '//date : '.strftime('%Y-%m-%d %H:%M:%S')) call append(7, '//version : 2.0') call append(8, '//platform : SuperBench 2.0') call append(9, '//history : created by bennyhe @'.strftime('%Y-%m-%d %H:%M:%S').expand(' v2.0')) call append(10, '///////////////////////////////////////////////////////////////////') endfunction "function nmap <C-L> :call AddFunction()<cr> function! AddFunction() call append(line(".")-1, ' /*****************************************************************') call append(line(".")-1, ' *') call append(line(".")-1, ' *****************************************************************/') endfunction set tags=tags; set tags+=~/.vim/tags/tags; set tags+=~/.vim/tags/tags_uvm; set tags+=~/.vim/tags/tags_vip; set autochdir "config for tlist plugin let Tlist_Ctags_Cmd = '/usr/bin/ctags' let Tlist_Use_Right_Window=0 let Tlist_Max_Tag_Length=1 let g:Tlist_Compact_Format=1 "let g:Tlist_WinHeight=5 let g:Tlist_WinWidth=15 let g:Tlist_Use_Horiz_Window=0 let g:Tlist_Show_One_File=1 "let g:Tlist_Exit_OnlyWindow=1 nmap tl :Tlist<cr> "terminal noremap <F8> :close!<cr> noremap <S-M-p> :sp<cr> noremap <S-M-q> :vs<cr> "noremap <F3> :belowright term ++rows=5 d:\msys64\msys2_shell.cmd -msys -defterm -no-start <cr> noremap <F3> :belowright term ++rows=5 powershell ubuntu2204.exe<cr> noremap <F4> :belowright term ++rows=5 powershell<cr> let b:match_words='\<begin\>:\<end\>' let g:rbpt_colorpairs = [ \ ['brown', 'RoyalBlue3'], \ ['Darkblue', 'SeaGreen3'], \ ['darkgray', 'DarkOrchid3'], \ ['darkgreen', 'firebrick3'], \ ['darkcyan', 'RoyalBlue3'], \ ['darkred', 'SeaGreen3'], \ ['darkmagenta', 'DarkOrchid3'], \ ['brown', 'firebrick3'], \ ['gray', 'RoyalBlue3'], \ ['black', 'SeaGreen3'], \ ['darkmagenta', 'DarkOrchid3'], \ ['Darkblue', 'firebrick3'], \ ['darkgreen', 'RoyalBlue3'], \ ['darkcyan', 'SeaGreen3'], \ ['darkred', 'DarkOrchid3'], \ ['red', 'firebrick3'], \ ] let g:rbpt_max = 16 let g:rbpt_loadcmd_toggle = 0 ""update ctags nmap <F10> :call UpdateCtags()<CR> function! UpdateCtags() let curdir=getcwd() while !filereadable("./tags") cd .. if getcwd() == "/" break endif endwhile if filewritable("./tags") silent !ctags -R --file-scope=yes --languages=systemverilog --links=yes --fields=+iaS --extra=+q TlistUpdate endif execute ":cd " . curdir endfunction nmap <F11> :call UpdateCtags_vip()<CR> function! UpdateCtags_vip() silent !ctags -R --languages=systemverilog -f ~/.vim/tags/tags_vip /data/ver/powervip/v2_0/ endfunction "autocmd BufWritePost *.sv,*.svh,*.v call UpdateCtags() "auto exce "set lines=999 columns=999 augroup initial autocmd! "autocmd VimEnter * VSTreeExplore "autocmd VimEnter * bo terminal ++rows=5 autocmd VimEnter * wincmd k autocmd VimEnter * Tlist autocmd VimEnter * wincmd h autocmd VimEnter * sp autocmd VimEnter * VSTreeExplore autocmd VimEnter * wincmd l autocmd VimEnter * q autocmd VimEnter * wincmd l au VimEnter * RainbowParenthesesToggleAll au Syntax * RainbowParenthesesLoadRound au Syntax * RainbowParenthesesLoadSquare au Syntax * RainbowParenthesesLoadBraces augroup END ":autocmd GUIEnter * VSTreeExplore "let g:airline_powerline_fonts = 1 let g:airline_theme = 'dark' let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#show_splits = 1 let g:airline#extensions#tabline#buffer_nr_show = 0 let g:airline#extensions#tabline#buffer_idx_mode = 3 let g:airline#extensions#tabline#show_tab_nr = 1 let g:airline#extensions#tabline#tab_nr_type = 1 let g:airline#extensions#branch#format =2 let g:airline_left_sep='>' let g:airline_inactive_collapse=0 let g:airline#extensions#tabline#formatter = 'unique_tail' let g:airline#extensions#tabline#buffer_idx_format = { \ '0': '0', \ '1': '1', \ '2': '2', \ '3': '3', \ '4': '4', \ '5': '5', \ '6': '6', \ '7': '7', \ '8': '8', \ '9': '9', \ ' ': ' ' \} let mapleader = "\<space>" let g:mapleader = "\<space>" set foldenable set foldmethod=marker set foldlevel=99 "" 代码折叠自定义快捷键 <leader>zz let g:FoldMethod = 0 map <leader>zz :call ToggleFold()<cr> fun! ToggleFold() if g:FoldMethod == 0 exe "normal! zM" let g:FoldMethod = 1 else exe "normal! zR" let g:FoldMethod = 0 endif endfun "set nocompatible "autocmd! bufwritepost .vimrc source % nmap <tab> :bn<cr> nmap <S-Tab> :bp<CR> "nmap <leader>1 :b 1<CR> nmap <leader>1 <Plug>AirlineSelectTab1 "{{{ nmap <leader>2 <Plug>AirlineSelectTab2 nmap <leader>3 <Plug>AirlineSelectTab3 nmap <leader>4 <Plug>AirlineSelectTab4 nmap <leader>5 <Plug>AirlineSelectTab5 nmap <leader>6 <Plug>AirlineSelectTab6 nmap <leader>7 <Plug>AirlineSelectTab7 nmap <leader>8 <Plug>AirlineSelectTab8 nmap <leader>9 <Plug>AirlineSelectTab9 nmap <leader>10 <Plug>AirlineSelectTab10 nmap <leader>11 <Plug>AirlineSelectTab11 nmap <leader>12 <Plug>AirlineSelectTab12 nmap <leader>13 <Plug>AirlineSelectTab13 nmap <leader>14 <Plug>AirlineSelectTab14 nmap <leader>15 <Plug>AirlineSelectTab15 nmap <leader>16 <Plug>AirlineSelectTab16 nmap <leader>17 <Plug>AirlineSelectTab17 nmap <leader>18 <Plug>AirlineSelectTab18 nmap <leader>19 <Plug>AirlineSelectTab19 nmap <leader>20 <Plug>AirlineSelectTab20 nmap <leader>21 <Plug>AirlineSelectTab21 nmap <leader>22 <Plug>AirlineSelectTab22 nmap <leader>23 <Plug>AirlineSelectTab23 nmap <leader>24 <Plug>AirlineSelectTab24 nmap <leader>25 <Plug>AirlineSelectTab25 nmap <leader>26 <Plug>AirlineSelectTab26 nmap <leader>27 <Plug>AirlineSelectTab27 nmap <leader>28 <Plug>AirlineSelectTab28 nmap <leader>29 <Plug>AirlineSelectTab29 nmap <leader>30 <Plug>AirlineSelectTab30 nmap <leader>31 <Plug>AirlineSelectTab31 nmap <leader>32 <Plug>AirlineSelectTab32 nmap <leader>33 <Plug>AirlineSelectTab33 nmap <leader>34 <Plug>AirlineSelectTab34 nmap <leader>35 <Plug>AirlineSelectTab35 nmap <leader>36 <Plug>AirlineSelectTab36 nmap <leader>37 <Plug>AirlineSelectTab37 nmap <leader>38 <Plug>AirlineSelectTab38 nmap <leader>39 <Plug>AirlineSelectTab39 nmap <leader>40 <Plug>AirlineSelectTab40 nmap <leader>41 <Plug>AirlineSelectTab41 nmap <leader>42 <Plug>AirlineSelectTab42 nmap <leader>43 <Plug>AirlineSelectTab43 nmap <leader>44 <Plug>AirlineSelectTab44 nmap <leader>45 <Plug>AirlineSelectTab45 nmap <leader>46 <Plug>AirlineSelectTab46 nmap <leader>47 <Plug>AirlineSelectTab47 nmap <leader>48 <Plug>AirlineSelectTab48 nmap <leader>49 <Plug>AirlineSelectTab49 nmap <leader>50 <Plug>AirlineSelectTab50 nmap <leader>51 <Plug>AirlineSelectTab51 nmap <leader>52 <Plug>AirlineSelectTab52 nmap <leader>53 <Plug>AirlineSelectTab53 nmap <leader>54 <Plug>AirlineSelectTab54 nmap <leader>55 <Plug>AirlineSelectTab55 nmap <leader>56 <Plug>AirlineSelectTab56 nmap <leader>57 <Plug>AirlineSelectTab57 nmap <leader>58 <Plug>AirlineSelectTab58 nmap <leader>59 <Plug>AirlineSelectTab59 nmap <leader>60 <Plug>AirlineSelectTab60 nmap <leader>61 <Plug>AirlineSelectTab61 nmap <leader>62 <Plug>AirlineSelectTab62 nmap <leader>63 <Plug>AirlineSelectTab63 nmap <leader>64 <Plug>AirlineSelectTab64 nmap <leader>65 <Plug>AirlineSelectTab65 nmap <leader>66 <Plug>AirlineSelectTab66 nmap <leader>67 <Plug>AirlineSelectTab67 nmap <leader>68 <Plug>AirlineSelectTab68 nmap <leader>69 <Plug>AirlineSelectTab69 nmap <leader>70 <Plug>AirlineSelectTab70 nmap <leader>71 <Plug>AirlineSelectTab71 nmap <leader>72 <Plug>AirlineSelectTab72 nmap <leader>73 <Plug>AirlineSelectTab73 nmap <leader>74 <Plug>AirlineSelectTab74 nmap <leader>75 <Plug>AirlineSelectTab75 nmap <leader>76 <Plug>AirlineSelectTab76 nmap <leader>77 <Plug>AirlineSelectTab77 nmap <leader>78 <Plug>AirlineSelectTab78 nmap <leader>79 <Plug>AirlineSelectTab79 nmap <leader>80 <Plug>AirlineSelectTab80 nmap <leader>81 <Plug>AirlineSelectTab81 nmap <leader>82 <Plug>AirlineSelectTab82 nmap <leader>83 <Plug>AirlineSelectTab83 nmap <leader>84 <Plug>AirlineSelectTab84 nmap <leader>85 <Plug>AirlineSelectTab85 nmap <leader>86 <Plug>AirlineSelectTab86 nmap <leader>87 <Plug>AirlineSelectTab87 nmap <leader>88 <Plug>AirlineSelectTab88 nmap <leader>89 <Plug>AirlineSelectTab89 nmap <leader>90 <Plug>AirlineSelectTab90 nmap <leader>91 <Plug>AirlineSelectTab91 nmap <leader>92 <Plug>AirlineSelectTab92 nmap <leader>93 <Plug>AirlineSelectTab93 nmap <leader>94 <Plug>AirlineSelectTab94 nmap <leader>95 <Plug>AirlineSelectTab95 nmap <leader>96 <Plug>AirlineSelectTab96 nmap <leader>97 <Plug>AirlineSelectTab97 nmap <leader>98 <Plug>AirlineSelectTab98 nmap <leader>99 <Plug>AirlineSelectTab99 "nmap <leader>- <Plug>AirlineSelectPrevTab "nmap <leader>+ <Plug>AirlineSelectNextTab "}}}
2025年10月10日
41 阅读
1 评论
0 点赞
2025-09-21
C语言枚举end是做什么用的?
最近在知乎上看到一个问题:C语言枚举end是做什么用的?刚开始,我也有一些疑惑,后面查了一些资料,对于这个问题,简单地说一下我的看法。枚举有多大?枚举类型到底有多大,占多少空间呢?这个要具体情况具体分析,编译器会视情况而定。下面是我测试用的编译器版本:gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0Copyright (C) 2017 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.当我写下这段代码的时候,实际的输出会是多少呢?有人会说是 1,有人会说是 4,我最终运行的确实是4;▲输出结果但是,这个结果并不是唯一的,它取决于你的编译器,另外还取决于编译器参数,gcc这里有个编译器参数 -fshort-enums,如果我们在编译的时候加上这个,那么编译出来是什么呢?▲短枚举的输出结果最终结果变成了1现在我在原先的代码中,加入CMD_MAX_16BIT = 0xFFFF,下面看看输出结果是多少。▲增带值范围运行输出结果如下:▲输出结果是的,它变成了2。因此,我们可以得出结论就是:编译器将为枚举分配足够的内存大小,来保存我们所声明的任何值。所以,如果我们的代码中只使用低于 256(8位的范围是0~255) 的值,我们的枚举应该是 8 位宽,也就是一个字节,而后面的0xFFFF显然是16位,两个字节,所以最终输出为2为此,我参考了一下gcc user manual,如下;https ://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html-fshort-enumsAllocate to an enum type only as many bytes as it needs for the declared range of possible values. Specifically, the enum type is equivalent to the smallest integer type that has enough room.Warning: the -fshort-enums switch causes GCC to generate code that is not binary compatible with code generated without that switch. Use it to conform to a non-default application binary interface.所以,我们需要明确的是编译器是否会默认执行 -fshort-enums这个命令,大多数是不会的,这里我还测试了一些clang,具体结果和gcc相同。但是,在嵌入式编程中需要注意,这里我查了一下,IAR的编译器默认会执行 -fshort-enums 。电脑上没有IAR,这里我参考了IAR 的 ARM C 编译器的文档IAR C/C++ Development Guide。可以看到enum类型默认的规定,如果要强制为int类型的话,需要编译的时候提那就--enum_is_int的编译参数,如下所示:▲枚举类型所以,这里为了避免编译器的优化,以及不同的硬件平台和不同编译器,从而导致枚举分配内存空间的变化,所以上述增加了一个0xFFFFFFFF,强制编译器为枚举分配4个字节的空间。▲设置最大范围为4字节最终的输出结果都是4,如下图所示:▲输出结果比较看来虽然是一个很小的知识点,但这中间的坑还真不少!好了,本期的文章就到这里了,我们下期再见。
2025年09月21日
45 阅读
0 评论
0 点赞
2025-09-21
芯片封装简史
为什么封装现在很重要封装曾经是半导体制造过程中的事后想法,不被大家重视。当你创造了这一小块神奇的硅片之后,然后把他用某种方法封装起来,同时引出管脚,一颗芯片就诞生了。但是随着摩尔定律的延伸,工程师们意识到,他们可以利用对芯片的所有部分,包括封装在内进行优化和创新,来制造出最好的产品。更令人惊讶的是,过去没有一家封装公司被认为像传统的前端制造工艺那样重要。封装供应链通常被认为是"后端",并被视为成本中心,类似于银行业的前台和后台。但现在,随着前端难以更好的缩小芯片尺寸,一个全新的关注领域已经出现,这就是对先进封装的重视。接下来我们讨论一下封装的发展简史,从简单的DIP封装一直到先进的2.5D或3D封装。封装发展简介这是我从这个精彩的视频座中发现的封装技术的简要层次结构。如果你有一些时间,可以看一下。(视频发表于2012年,但是当时已经提到了现在最新的3D封装技术,所以并不过时) 芯片封装简史@eetop@创芯大讲堂 #封装#芯片#3D封装封装介绍 封装技术一个简化的演变过程是:DIP>QFP>BGA>POP/SiP>WLP 显然,有很多不同的封装技术,但我们要讨论的是大致能代表每种类型的简单技术,然后慢慢将其带到现在。我也非常喜欢下图这个高层次的概述(不过它已经过时了,但仍然正确)。在封装的最初阶段,裸片通常采用陶瓷或金属罐封(气密),以实现最大的可靠性。这主要适用于航空航天和军事应用,这些功能需要最高水平的可靠性。然而,对于我们的大多数日常用例来说,这并不是真正可行的,所以我们开始使用塑料封装和双列直插封装(DIP)。DIP封装(1964-1980年代)最早的DIP包装元件是由仙童半导体司的Bryant Buck Rogers在1964年时发明,在表面贴装技术问世之前的十年里,它被广泛应用。DIP在实际的裸片周围使用塑料封装外壳(编辑注:实际上陶瓷封装的军品芯片也大批采用了DIP封装),并有两排平行的突出的引脚,称为引线框架,与下面的PCB(印刷电路板)相连。实际的芯片通过键合线连接到两个引线框架,两个引线框架可以连接到印刷电路板(PCB)。DIP封装以复古的方式具有标志性,设计选择是可以理解的。实际的裸片将完全密封在树脂中,因此它带来了高可靠性和低成本,并且许多首批标志性的半导体都是以这种方式封装的。请注意,芯片通过导线连接到外部引线框架,这使其成为一种"引线键合"封装方法。稍后将对此进行详细介绍。下面是英特尔8008--实际上是第一批现代微处理器之一。注意它的标志性DIP封装。因此,如果你看到那些看起来像小蜘蛛的半导体的时髦照片,这只是一个DIP封装类的半导体。英特尔的原始微处理器,8008 家族然后,这些小金插针中的每一个都被焊接到PCB上,在那里它与其他电气元件和系统的其余部分接触。以下是封装如何焊接到PCB板上。PCB本身通常是由铜或其他电气元件由非导电材料层压而成。然后,PCB板可以将电信号从一个地方输送到另一个地方,并让个元件相互连接和通信。虽然DIP还有其他演绎版,但实际上是时候转向始于20世纪80年代的下一个封装技术范式或表面贴装封装了。表面贴装封装(1980-1990年代)下一步的变化不是通过DIP安装产品,而是引入表面贴装技术(SMT)。正如所暗示的那样,封装直接安装在PCB的表面上,并允许在一块基板上使用更多的元件并降低成本。下图是典型的表面贴装封装。这种封装有许多变体,在半导体创新的鼎盛时期,这一直是很长一段时间的主力。值得注意的是,大部分芯片都是4个侧面都有引脚。这遵循了封装的一般愿望,即占用更少的空间并增加连接带宽或I / O。每一项额外的进步都会考虑到这一点,并且是一种值得关注的模式。这个过程曾经是手动的,但现在是高度自动化的。此外,这实际上为PCB创造了相当多的问题,如popcorning。封装爆裂是指在焊接过程中,塑料封装内的水分被加热,由于快速加热和冷却,水分在PCB上造成问题。另一件需要注意的事情是,随着封装工艺的每一次提升,复杂性和故障也会随之增加球栅封装和芯片级封装(1990年代至2000年代)随着对半导体速度的需求不断提高,对更好封装的需求也在不断增加。虽然出现了QFN(四方扁平无引线)和其他表面贴装技术,但我想向你介绍一种我们在未来必须了解的封装设计的开端,这就是广泛使用的球栅阵列(BGA)封装的开始。这些焊球或凸起被称为焊料凸起/球这就是球栅阵列的外观,可以从下面直接将一块硅片安装到PCB或基板上,而不是像以前的表面贴装技术那样简单地将所有4端的角落贴上胶带。因此,这只是我上面列出的趋势的另一个延续,占用更少的空间,有更多的连接。现在,我们不再是用电线细细地连接每一侧的封装,而是直接将一个封装连接到另一个。这导致了密度的增加,更好的I/O性能,以及现在增加的复杂性,即你如何检查BGA封装是否工作。在这之前,封装主要是通过视觉检查和测试。现在我们无法看到封装,所以没有办法进行测试。我们可以X射线进行检查,以及更复杂的技术。现代封装(2000-2010年代)我们现在走进了现代封装的时代。上面描述的许多封装方案今天仍在使用,但是,您将开始看到越来越多的封装类型,并且这些封装类型将来会变得更加相关。公平地说,许多这些即将到来的技术是在过去几十年中发明的,但由于成本原因,直到后来才被广泛使用。倒装芯片这是你可能会读到或听到的最常见的封装之一。我很高兴能为你定义它,因为到目前为止,我读过的入门书中还没有一个令人满意的解释。倒装芯片是IBM很早就发明的,通常会被缩写为C4。就倒装芯片而言,它确实不是一种独立的封装形式,而是一种封装风格。它几乎就是只要在芯片上有一个焊接凸点就可以了。芯片不是用线粘合互连,而是翻转过来面对另一个芯片,中间有一个连接基板,所以叫 "倒装芯片"。从维基百科上的解释内容可以更好的理解什么是倒装芯片:在晶圆上创建集成电路芯片表面的焊盘被金属化每个焊盘上都沉积一个焊点芯片被切割芯片被翻转和定位,以便焊球面向电路然后将焊球重新熔化安装好的芯片用电绝缘胶进行底部填充引线键合请注意倒装芯片与引线键合有何不同。上面介绍的DIP封装这就是引线键合,其中芯片使用导线键合到另一种金属上,然后焊接到PCB上。引线键合不是一种特定的技术,而是一套较旧的技术,涵盖了许多不同类型的封装。引线键合是倒装芯片的前身。先进封装(2010年代至今)我们一直在缓慢地进入"先进封装"半导体时代,我现在想谈谈一些更高级的概念。实际上,有各种层次的"封装"适合这个思维过程。我们之前讲过的大多数封装,都集中在芯片封装到PCB上,但先进封装的开始其实是从手机开始的。手机在很多方面都是先进封装诸多方面的巨大前奏。这是有道理的!对于手机需要在尽可能小的空间内集成大量的芯片,比笔记本电脑或台式电脑密度大得多。所有东西都必须被动冷却,当然也要尽可能薄。这将封装推向了新的极限。我们讨论的许多概念都是从智能手机封装开始的,现在已经将自己推向了半导体行业的其他部分。芯片级封装(CSP)芯片级封装实际上比听起来要宽一些,最初意味着芯片大小的封装。技术定义是封装尺寸不超过芯片本身的1.2倍,并且必须是单芯片且可连接的。实际上,我已经向您介绍了CSP的概念,那就是通过倒装芯片。但CSP确实通过智能手机提升到了一个新的水平。这张照片中的所有东西都是芯片芯片的1.2倍大小,并且专注于节省尽可能多的空间。CSP时代有很多不同的风格,包括倒装芯片、右基板和其他技术,都属于这一类。晶圆级封装(WLP)但还有一个更小的级别--这就是 "终极 "芯片规模的封装尺寸,或在晶圆级封装。这几乎就是把封装放在实际的硅片本身。封装的就是硅片。它更薄,具有最高水平的I/O,而且显然会非常热,很难制造。先进的封装革命目前是在CSP的规模上,但未来将集中在晶圆上。这是一个有趣的演变,封装被实际的硅本身所包含。芯片是封装,反之亦然。与仅仅将一些球焊接到芯片上相比,这真的很昂贵,那么我们为什么要这样做呢?为什么现在对先进封装如此痴迷?先进封装:未来这是我长期以来一直在描述的趋势的一个顶峰。异构计算不仅是专业化要做的事,而且是我们如何将所有这些专业化的碎片放在一起的事。先进的封装是使这一切发挥作用的关键推动因素。让我们来看看苹果M1 - 一种经典的异构计算配置,特别是其统一的内存结构。对我来说,M1的诞生不是一个 "哗众取宠 "的时刻,而是异构计算即将爆发的一个奇特时刻。M1正在敲响未来的样子,许多人很快就会效仿苹果的做法。请注意,实际的SOC(片上系统)不是异构的--但是将内存靠近SOC的定制封装是异构的。M1采用2.5D封装将内存直接封装到处理旁边,不需要PCB连线,另一个非常好的高级封装的好例子是Nvidia的新款A100。再次注意到PCB上没有电线。HBM2 不像传统的 GDDR5 GPU 板设计那样需要围绕 GPU 的大量离散内存芯片,而是包括一个或多个多个内存芯片的垂直堆栈。存储芯片使用微小的导线进行连接,这些导线由硅通孔和微凸起形成。一个 8 Gb HBM2 芯片包含 5,000 多个硅通孔。然后使用无源硅中介层连接内存堆栈和GPU芯片。HBM2 堆栈、GPU 芯片和硅中介层的组合封装在单个 55mm x 55mm BGA 封装中。有关 GP100 和两个 HBM2 堆栈的图示,请参见图 9;有关具有 GPU 和内存的实际 P100 的显微照片,请参见图 10。这里的结论是,世界上最好的芯片都是用一种方式制造出来的,而且这种革命不会停止。接下来介绍高级封装的两个主要类别,2.5D和3D封装。2.5D封装2.5D有点像我们上面提到的倒装芯片的turbo版,但不是将单个裸片堆叠到PCB上,而是将裸片堆叠在单个中介层的顶部。我想这张图很好地说明了这一点。2.5D就像有一个地下室的门进入你邻居的房子,物理上是一个凸点或TSV(通过硅通孔)进入你下面的硅插板,这就把你和你的邻居连接起来。这并不比你实际的片上通信快,但由于你的净输出是由总的封装性能决定的,降低的距离和增加的两个硅片之间的互连超过了没有在一个单一的SOC上的所有缺点。这样做的好处是你可以使用 设计好的“小芯片”来快速拼凑更大更复杂的封装。如果能在一块硅片上完成就更好了,但这种工艺使制造变得更容易,特别是在较小的尺寸上。“小芯片”和2.5D封装可能会使用很长时间,它比3D封装更容易制造,也便宜得多。此外,它可以很好地扩展,并且可以与新的小芯片一起重复使用,从而通过更换小芯片来制造相同封装格式的新芯片。AMD的新的Zen3改进就是这样的,其中封装相似,但一些小芯片得到了升级。3D封装3D封装是一个“圣杯”圣杯,是封装的终极终结。可以这样比喻,现在,与其在地面上拥有所有1层楼高并由地下室连接的独立小房子,不如拥有一座巨大的摩天大楼,该摩天大楼是用适合功能所需的任何工艺定制的。这是3D封装 - 现在所有的封装都是在硅片本身上完成的。它是驱动更大、更复杂结构的最快、最节能的方法,这些结构是为任务而构建的,并将显著延长摩尔定律。未来我们可能无法获得更多的芯片尺寸收缩,但现在有了3D封装,我们仍然可以在未来改进我们的芯片,类似于以前的摩尔定律。而有趣的是,我们有一个整个半导体市场走向3D的明显例子--内存。存储器向3D结构的推进是对未来发展的一个很好的说明。NAND不得不采用3D结构的部分原因是它们在较小的几何尺寸上难以扩展。想象一下,内存是一座大型的3D摩天大楼,每一层都由一个电梯连接起来。这些被称为 "TSV "或通硅孔。这就是未来的样子,我们甚至有可能将GPU / CPU芯片堆叠在彼此上或在CPU上堆叠内存。这是最后的边疆,而现在我们正在迅速接近的边疆。在接下来的5年里,你可能会开始看到3D封装一遍又一遍地出现。2.5D/3D 封装解决方案快速概述我认为,与其进一步了解3D和2.5D封装,不如直接介绍一些正在使用的、你可能已经听说过的工艺。我想在这里重点谈谈晶圆厂所做的工艺,这些工艺是推动了3D/2.5D集成发展的。台积电的CoWoS这似乎是 2.5D 集成工艺的主力,由 Xilinx 率先推出。该过程主要集中在将所有逻辑芯片放入硅中介层上,然后放到封装基板上。一切都通过微凸起或球连接。这是一个经典的2.5D结构。台积电SOIC这个台积电的3D封装平台, 是一个相对较新的技术。。注意这个关于凸点密度和接合间距的惊人图表,SoIC在尺寸上甚至没有接近Flipchip或2.5D,而是在密度和特征尺寸方面几乎是一个前端工艺。这是对他们技术的一个很好的比较,但请注意,SoIC实际上有一个类似于3D堆叠的芯片堆叠,而不是中阶层2.5D集成。三星 XCube近年来,三星已成为更重要的代工厂合作伙伴,当然,为了不被超越,三星拥有了新的3D封装方案。在下面查看他们的XCube的视频。这里没有太多的信息,但我想强调的是,A100是在三星工艺上制造的,所以这可能是为Nvidia最近的芯片提供动力的技术。此外,在这里所有的公司中,三星可能有最丰富的tsv经验。英特尔 Foveros最后是英特尔的Foveros 3D封装。我们可能会看到英特尔在未来7nm及以后的"混合CPU"工艺中实现更多。他们在架构日已经非常明确地表示,这是他们前进的重点。有趣的是,在3D封装过程中,三星,台积电或英特尔之间并没有太大的区别。原文:https://semiwiki.com/semiconductor-services/308968-semiconductor-packaging-history-primer/
2025年09月21日
29 阅读
0 评论
0 点赞
2025-09-21
用Python设计芯片?开源设计语言PyGears亮相!
近日,加州大学洛杉矶分校引入了一种新的硬件描述语言PyGears,以实现基于可重用组件和高级 Python 构造的敏捷芯片设计理念。PyGears 是对快速发展的软件世界的回应,这要求硬件设计与可扩展和智能未来的需求保持同步。据官网介绍PyGears 是一种免费的开源硬件描述语言 (HDL),该门语言可作为 Python 库实现,专注于函数式编程、模块组合和同步。按照他们的说法,PyGears 的出现旨在将芯片设计的复杂性转变为简单、灵活且具有成本效益的开发过程,该过程遵循可扩展和智能的方式来构建未来。该框架允许您使用 Python 结构设计硬件并将其编译为可综合的 SystemVerilog 或 Verilog 代码。内置模拟器允许您使用任意 Python 代码及其大量库来验证您的硬件模块。PyGears 使连接模块 得容易 ,并具有内置的同步机制,可帮助您构建正确的并行系统。PYGEAR 的创造者Bogdan Vukobratovic表示:“PyGears 的诞生是为了捕捉我在职业生涯中发现的所有有用的良好实践,该工具可以显着加快复杂架构的硬件实现,尤其是当它们与 AI 范式相关时。这应该是创建下一代芯片设计的一个良好开端,但这个目标需要我们所有人为硬件开发做出贡献并确定其方向。否则,未来的人工智能世界将不可持续。”据报道,通过在 VLSI 信号处理课程中采用它, 加州大学洛杉矶分校 Samueli 工程学院 开始建立一个通过软件范式观察硬件的社区,目标是通过使用更灵活和可组合的模块来加速硬件设计和验证。“芯片设计变得越来越复杂,成本越来越高,开发周期越来越长,”加州大学洛杉矶分校电气和计算机工程教授 Dejan Markovic博士说。“PyGears 通过采用由志同道合的贡献者社区构建的可重用组件的模块化硬件构建来解决这些挑战。这对于小型和大型工程团队都非常有效。硬件设计和验证基于Python环境,减少了软硬件领域的壁垒。我们的愿景是让软件人员能够编写硬件代码。”“软件的最大限制是硬件发展速度相对较慢,” Lux Capital 的合伙人Shahin Farshchi说。“PyGears 站在巨人的肩膀上,将硬件设计加速到接近‘编码’的速度,这将带来神奇的新用例,为定义市场的产品和公司提供支持。”PyGears的创建者兼 Anari AI 研发负责人Bogdan Vukobratovic博士表示,当前的工具行业倾向于对硬件开发中的所有组件进行低级优化和低级控制。另一方面,PyGears 提供对所有方面直至最低层的控制,使流程效率提高数倍。他还强调,构建复杂的架构需要具有更高开发敏捷性的系统。根据斯坦福大学教授 Boris Murmann博士的说法。,“新硬件设计工具的开发可以极大地受益于开源解决方案。为了让硬件行业摆脱石器时代并使其更加敏捷,我们需要社区塑造的新概念。”除了 UCLA 学生和其他大学,PyGears 团队已经 向硬件团队和有兴趣改进 HDL 的个人开放社区,使硬件设计更加高效和以结果为导向。附部分说明截图
2025年09月21日
41 阅读
0 评论
0 点赞
1
...
10
11
12
...
78