开发环境搭建:工欲善其事,必先利其器

做芯片设计,环境搭建是第一步。说实话,我见过不少新人一上来就急着写代码,结果编译报错半天找不到原因——最后发现是仿真器没装对。嗯,咱们先把地基打牢。

这一章,我会带你搞定三件事: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
注意:如果你用的是CentOS/RHEL,包名会不一样。比如ncurses-devel、libstdc++-static。别直接复制Ubuntu的命令。

用户权限与目录规划

我习惯把项目放在 /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
注意:VCS对gcc版本有要求。我遇到过gcc 11编译VCS报错,降级到gcc 9就好了。建议用 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  # 清理
我的习惯:Makefile里加一个 help 目标,列出所有可用命令。这样过两个月回来,不用翻文档也能用。

知识体系总览

下面这张图,帮你理清开发环境的整体结构:

开发环境搭建知识体系 Linux环境配置 Git版本管理 仿真工具安装 基础软件包安装 用户权限与目录规划 Git基本配置 RTL项目的.gitignore Iverilog(开源) VCS(商业版) Makefile自动化构建

说白了,这三块是互相配合的:Linux是舞台,Git是剧本,仿真工具是演员,Makefile是导演。缺一个,戏就唱不下去。

避坑指南

  • 路径不要有中文和空格——VCS遇到中文路径直接崩溃,我吃过这个亏。
  • 环境变量别乱改——特别是 LD_LIBRARY_PATH,改错了连ls都可能报错。
  • 仿真前先检查语法——用 iverilog -s 或 vlogan 做语法检查,别等跑仿真才发现。
  • Makefile里用Tab缩进——空格不行,这是新手最容易犯的错。

一句话总结:环境搭好了,后面90%的问题都不会出现。花半天时间把这一步做扎实,比后面花两天debug划算得多。

可可精品资料库