首页
游戏
影视
直播
广播
听书
音乐
图片
更多
看书
微视
主播
统计
友链
留言
关于
论坛
邮件
推荐
我的硬盘
我的搜索
我的记录
我的文件
我的图书
我的笔记
我的书签
我的微博
Search
1
在IC617中进行xa+vcs数模混仿
81 阅读
2
virtuoso和empyrean alps模拟仿真和混仿教程
74 阅读
3
科普:Memory Compiler生成的Register file和SRAM有何区别?
73 阅读
4
后仿中$setup,$hold与$setuphold
44 阅读
5
文档内容搜索哪家强? 15款文件搜索软件横向评测
35 阅读
默认分类
芯片市场
数字电路
芯片后端
模拟电路
芯片验证
原型与样片验证
算法与架构
DFX与量产封装
PC&Server OS设置
移动OS设置
软件方案
新浪备份
有道备份
登录
Search
标签搜索
python
Docker
vscode
linux
systemverilog
vcs
STM32
PyQT
EDA
FPGA
gvim
cadence
Alist
xilinx
UVM
uos
macos
package
MCU
risc-v
bennyhe
累计撰写
378
篇文章
累计收到
31
条评论
首页
栏目
默认分类
芯片市场
数字电路
芯片后端
模拟电路
芯片验证
原型与样片验证
算法与架构
DFX与量产封装
PC&Server OS设置
移动OS设置
软件方案
新浪备份
有道备份
页面
游戏
影视
直播
广播
听书
音乐
图片
看书
微视
主播
统计
友链
留言
关于
论坛
邮件
推荐
我的硬盘
我的搜索
我的记录
我的文件
我的图书
我的笔记
我的书签
我的微博
搜索到
378
篇与
的结果
2025-10-26
Linux自动化脚本工具——AutoKey简介
下面简介了AutoKey软件的概述、安装和使用方法。了解到这个软件的起因是在Ubuntu中想实现Windows中的自定义短语,但是Ubuntu中的Ibus输入法不是很支持该功能。搜索之后了解到espanso和AutoKey可以实现该功能。另外,AutoKey和WIndows中的AutoHotKey功能很相似,但并不是同一个软件。注:AutoKey目前不支持Wayland协议,只支持Xorg,而Ubuntu22.04默认使用的是Wayland。虽然可以切换,但也很麻烦。生成AI:Claude-3-Opus(POE)官方文档:1. https://github.com/autokey/autokey 2. Welcome to AutoKey!1 AutoKey 简介什么是 AutoKeyAutoKey 是一款开源的 Linux 桌面自动化工具,主要用于自动输入文本和执行预定义的操作。它可以帮助用户将常用的短语、句子或代码片段绑定到缩写或热键上,从而提高输入效率,节省时间。AutoKey 支持纯文本和富文本格式,可以在各种应用程序中使用,如文本编辑器、邮件客户端、IDE 等。AutoKey 的主要功能AutoKey 提供了以下主要功能:文本替换:将预定义的缩写替换为相应的文本内容,支持纯文本和富文本格式。脚本执行:可以将 Python 脚本绑定到缩写或热键上,实现更加灵活和强大的自动化操作。快捷键绑定:可以将缩写或脚本绑定到特定的热键组合,通过按键触发相应的操作。应用程序特定的缩写:可以为特定的应用程序设置专属的缩写,实现更加精准的自动化。文本模板:支持创建包含动态内容的文本模板,如日期、时间、剪贴板内容等。AutoKey 的工作原理AutoKey 的工作原理如下:用户在 AutoKey 中创建缩写,并将其绑定到相应的文本内容或 Python 脚本。AutoKey 在后台监听用户的键盘输入,当检测到与预定义缩写匹配的输入时,触发相应的替换操作。如果缩写绑定的是文本内容,AutoKey 会自动删除缩写,并将绑定的文本内容输入到当前光标所在位置。如果缩写绑定的是 Python 脚本,AutoKey 会执行该脚本,并根据脚本的逻辑执行相应的自动化操作,如模拟按键、粘贴文本、控制窗口等。AutoKey 的优势和适用场景AutoKey 的优势包括:提高输入效率:通过将常用的文本绑定到缩写,可以显著减少输入所需的时间和按键次数。自动化重复性任务:利用 Python 脚本,可以自动执行一些重复性的操作,如数据格式转换、文件处理等。减少错误:预定义的缩写和脚本可以确保输入的一致性和准确性,减少手动输入带来的错误。易于自定义:用户可以根据自己的需求,创建和管理缩写和脚本,实现个性化的自动化。AutoKey 适用于以下场景:编程:可以将常用的代码片段、函数模板绑定到缩写,提高编码效率。文案写作:可以将常用的句子、段落、签名等绑定到缩写,加快写作速度。客户服务:可以将常用的回复模板绑定到缩写,提高响应速度和一致性。数据录入:可以将常用的数据格式、表格模板绑定到缩写,简化录入过程。总之,AutoKey 是一款功能强大、灵活易用的 Linux 自动化工具,通过自定义缩写和脚本,可以显著提高工作效率,适用于各种需要重复输入和操作的场景。2 AutoKey 的安装和配置在 Ubuntu 系统中安装 AutoKey在 Ubuntu 系统中,可以通过两种方式安装 AutoKey:通过 Ubuntu 软件中心安装或使用 apt 命令安装。通过 Ubuntu 软件中心安装打开 Ubuntu 软件中心。在搜索框中输入 "AutoKey",点击搜索。在搜索结果中找到 "AutoKey" 应用,点击 "安装" 按钮。输入用户密码,等待安装完成。使用 apt 命令安装打开终端。输入以下命令,按回车执行:sudo apt updatesudo apt install autokey-gtk输入用户密码,等待安装完成。启动和配置 AutoKey启动 AutoKey安装完成后,可以通过以下方式启动 AutoKey:在 Ubuntu 的应用程序菜单中找到并点击 "AutoKey" 图标。在终端中输入 autokey-gtk 命令,按回车执行。熟悉 AutoKey 的用户界面AutoKey 的主界面由以下几个部分组成:缩写列表:显示所有已创建的缩写。缩写编辑器:用于编辑选中的缩写的内容和属性。工具栏:包含常用的操作按钮,如新建缩写、保存、删除等。菜单栏:提供访问 AutoKey 各种功能和设置的菜单项。创建和管理缩写创建新的缩写在 AutoKey 主界面中,点击工具栏上的 "新建" 按钮,或右键点击缩写列表中的 "My Phrases" 文件夹,选择 "New" > "Phrase"。在缩写编辑器中,输入缩写的名称、缩写内容以及可选的注释。点击工具栏上的 "保存" 按钮,或按 Ctrl+S 键保存缩写。编辑和删除现有缩写在缩写列表中,双击要编辑的缩写,或选中缩写后点击工具栏上的 "编辑" 按钮。在缩写编辑器中,修改缩写的内容或属性。点击工具栏上的 "保存" 按钮,或按 Ctrl+S 键保存修改。要删除缩写,在缩写列表中选中要删除的缩写,点击工具栏上的 "删除" 按钮,或按 Delete 键。设置触发方式AutoKey 支持两种触发方式:缩写触发和快捷键触发。缩写触发在缩写编辑器中,找到 "Abbreviations" 字段。输入要用作触发缩写的缩写内容,多个缩写之间用逗号分隔。保存缩写。当在任意应用程序中输入设定的缩写并按下空格、回车或标点符号时,缩写将被替换为预定义的内容。快捷键触发在缩写编辑器中,找到 "Hotkey" 字段。点击 "Set" 按钮,按下要用作触发缩写的快捷键组合。保存缩写。当在任意应用程序中按下设定的快捷键时,缩写内容将被插入到光标所在位置。通过以上步骤,你可以在 Ubuntu 系统中安装、配置 AutoKey,并创建和管理自定义的缩写。合理使用缩写触发和快捷键触发,可以显著提高输入效率和工作流程的自动化程度。3 AutoKey 的进阶使用使用 Python 脚本扩展 AutoKey 功能AutoKey 支持使用 Python 脚本来扩展其功能,使其能够执行更加复杂和灵活的自动化任务。编写 Python 脚本在 AutoKey 主界面中,右键点击 "My Scripts" 文件夹,选择 "New" > "Script"。在脚本编辑器中,输入 Python 脚本的内容。AutoKey 提供了一些内置的模块和函数,如 keyboard、mouse、system 等,可以用于模拟键盘输入、鼠标操作和执行系统命令等。保存脚本,并为其指定一个易于识别的名称。在缩写中调用 Python 脚本创建一个新的缩写或编辑现有的缩写。在缩写内容中,使用 标签来引用 Python 脚本,例如 myscript.py。保存缩写。当触发该缩写时,AutoKey 将执行指定的 Python 脚本。AutoKey 的常见问题和解决方法常见问题 1:缩写无法触发可能原因: - 缩写内容与实际输入不匹配。 - 缩写触发方式设置不正确。 - AutoKey 服务未启动或已停止。解决方法: 1. 仔细检查缩写内容,确保与实际输入完全匹配。 2. 检查缩写的触发方式设置,确保已选择正确的触发方式(缩写触发或快捷键触发)。 3. 确保 AutoKey 服务已启动并正常运行。如果服务已停止,可以在终端中输入 autokey-gtk 命令重新启动。常见问题 2:Python 脚本执行错误可能原因: - Python 脚本中存在语法错误或逻辑错误。 - 脚本中使用的模块或函数不受支持或未正确导入。解决方法: 1. 仔细检查 Python 脚本的语法和逻辑,确保没有错误。 2. 确保脚本中使用的模块和函数已正确导入,并受 AutoKey 支持。可以参考 AutoKey 的文档和示例代码。AutoKey 的使用技巧和建议使用技巧 1:创建递归缩写递归缩写是指在缩写的替换内容中包含缩写本身,从而实现多级展开。例如,创建缩写 "dt" 替换为 "$(date +%Y-%m-%d) $(date +%H:%M:%S)"。当输入 "dtdt" 时,将展开为 "2023-04-20 10:30:00 2023-04-20 10:30:00"。使用技巧 2:使用 Python 脚本实现动态内容在 Python 脚本中,可以使用变量、函数和控制结构等编程元素来生成动态内容。例如,可以编写脚本从文件或数据库中读取数据,根据条件生成不同的输出,或执行一些自动化操作后返回结果。AutoKey 的替代品和对比替代品 1:EspansoEspanso 是一款跨平台的文本扩展工具,支持 Windows、macOS 和 Linux。它使用 YAML 格式的配置文件来定义缩写和替换内容,支持 Shell 和 JavaScript 脚本,并提供了丰富的匹配选项和变量。与 AutoKey 相比,Espanso 的优势在于跨平台支持和更简洁的配置语法,但缺少图形化的用户界面。替代品 2:AutoHotkey (Windows)AutoHotkey 是一款功能强大的 Windows 自动化脚本语言和工具,可用于创建热键、宏、文本扩展等。它使用自己的脚本语言,提供了大量的内置函数和命令,可以与 Windows API 和其他应用程序交互。与 AutoKey 相比,AutoHotkey 更加灵活和功能丰富,但仅支持 Windows 平台,学习曲线也较为陡峭。总的来说,AutoKey 的进阶使用涉及 Python 脚本的编写和调用,以及一些常见问题的解决方法和使用技巧。对于有更高级需求的用户,可以考虑使用 Espanso 或 AutoHotkey 等替代工具,根据具体的使用场景和平台选择最适合的方案。
2025年10月26日
7 阅读
0 评论
0 点赞
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日
5 阅读
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日
3 阅读
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日
1 阅读
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日
3 阅读
0 评论
0 点赞
1
...
8
9
10
...
76