2. 开发环境搭建
做芯片设计,环境搭建是第一步。说实话,我见过不少新人一上来就急着写代码,结果编译报错半天找不到原因——最后发现是仿真器没装对。嗯,咱们先把地基打牢。
这一章,我会带你搞定三件事:Linux环境配置、Git版本管理、仿真工具安装。顺便聊聊Makefile,这东西能让你少敲90%的命令。
Linux环境配置——你的主战场
芯片设计基本都在Linux下进行。我个人习惯用Ubuntu 20.04 LTS,稳定,社区活跃,遇到问题好搜。
基础软件包安装
装完系统后,先跑一遍这个命令:
sudo apt-get update
sudo apt-get install -y build-essential git vim gcc g++ make
sudo apt-get install -y libncurses5-dev libssl-dev flex bison
这里有个坑——libncurses5-dev。我曾经在Ubuntu 22.04上装VCS,缺了这个库,编译报错折腾了两小时。后来发现是64位兼容库没装。所以建议你顺手装上:
sudo apt-get install -y lib32ncurses5-dev lib32z1
用户权限与目录规划
我习惯把项目放在 /home/<用户名>/projects/ 下。仿真工具装在 /opt/ 或 /tools/。别用root跑仿真,容易把系统搞乱。
mkdir -p ~/projects/soc_design
mkdir -p /tools/synopsys # 需要sudo
Git版本管理——你的后悔药
做RTL设计,没有版本管理就是裸奔。我见过有人把代码备份成 top_v1.v、top_v2.v、top_final.v……最后自己都分不清哪个是最终版。
Git基本配置
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global core.editor vim
我个人建议加两个别名:
git config --global alias.st status
git config --global alias.ci commit
RTL项目的.gitignore
仿真会生成一堆临时文件,别把它们提交上去。这是我的模板:
# 仿真生成文件
*.vcd
*.fsdb
*.log
*.dump
*.vpd
# 编译中间文件
*.o
*.so
*.a
work/
simv*
git diff 看看改了啥。我曾经手滑把没写完的代码提交了,同事拉下来编译不过……尴尬。
Verilog仿真工具安装
仿真工具有商业版和开源版。商业版用VCS(Synopsys),开源版用Iverilog。我两个都装,平时用Iverilog快速验证,上规模了再用VCS。
安装Iverilog(开源)
这个简单,一行命令搞定:
sudo apt-get install -y iverilog gtkwave
Gtkwave是波形查看器,配合使用。验证一下:
iverilog -V
# 输出类似:Icarus Verilog version 12.0
安装VCS(商业版)
VCS需要license,这里假设你已经有安装包。步骤大致如下:
# 解压安装包
tar -xzf vcs_2023.03_linux.tar.gz -C /tools/synopsys/
# 设置环境变量(加到~/.bashrc里)
export VCS_HOME=/tools/synopsys/vcs_2023.03
export PATH=$VCS_HOME/bin:$PATH
export LM_LICENSE_FILE=27000@license_server
# 验证
vcs -version
update-alternatives 管理多版本gcc。
一个简单的仿真测试
写个最小测试,验证环境是否正常:
// counter.v
module counter (
input clk,
input rst_n,
output reg [3:0] cnt
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt <= 4'b0;
else
cnt <= cnt + 1'b1;
end
endmodule
// tb_counter.v
module tb_counter;
reg clk, rst_n;
wire [3:0] cnt;
counter u0 (.clk(clk), .rst_n(rst_n), .cnt(cnt));
initial begin
clk = 0;
forever #5 clk = ~clk;
end
initial begin
rst_n = 0;
#20 rst_n = 1;
#200 $finish;
end
initial begin
$monitor("Time=%0t, cnt=%d", $time, cnt);
end
endmodule
用Iverilog跑一下:
iverilog -o counter_tb counter.v tb_counter.v
vvp counter_tb
看到计数输出,说明环境没问题。
Makefile基础——自动化你的生活
每次敲 iverilog -o ... 太累了。用Makefile,一个 make 搞定所有。
一个通用的RTL Makefile模板
# 变量定义
TOP = tb_counter
SRC = counter.v tb_counter.v
SIM = iverilog
WAVE = gtkwave
# 默认目标
all: compile run
# 编译
compile:
$(SIM) -o $(TOP) $(SRC)
# 运行仿真
run:
vvp $(TOP)
# 查看波形
wave:
$(WAVE) $(TOP).vcd
# 清理
clean:
rm -f $(TOP) *.vcd *.log
.PHONY: all compile run wave clean
用法:
make # 编译+运行
make wave # 看波形
make clean # 清理
help 目标,列出所有可用命令。这样过两个月回来,不用翻文档也能用。
知识体系总览
下面这张图,帮你理清开发环境的整体结构:
说白了,这三块是互相配合的:Linux是舞台,Git是剧本,仿真工具是演员,Makefile是导演。缺一个,戏就唱不下去。
避坑指南
- 路径不要有中文和空格——VCS遇到中文路径直接崩溃,我吃过这个亏。
- 环境变量别乱改——特别是
LD_LIBRARY_PATH,改错了连ls都可能报错。 - 仿真前先检查语法——用
iverilog -s或vlogan做语法检查,别等跑仿真才发现。 - Makefile里用Tab缩进——空格不行,这是新手最容易犯的错。
一句话总结:环境搭好了,后面90%的问题都不会出现。花半天时间把这一步做扎实,比后面花两天debug划算得多。