1. DESIGNWARE的使用
环境变量
# 设置DesignWare库路径
export SYNOPSYS_DW_HOME=.../synopsys/syn/R-2020.12
export DW_PATH=$SYNOPSYS_DW_HOME/dw/sim_ver
export VCS_HOME=/path/to/vcs //指向VCS的安装目录。
export LD_LIBRARY_PATH=$SYNOPSYS_DW_HOME/lib:$VCS_HOME/lib:$LD_LIBRARY_PATH //确保VCS能够找到DesignWare库的动态链接库。
# 检查环境变量
echo "SYNOPSYS_DW_HOME: $SYNOPSYS_DW_HOME"
echo "DW_PATH: $DW_PATH"
echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH"
# 编译Verilog代码并链接DesignWare库
vcs -full64 -sverilog -debug_all \
-y $DW_PATH +libext+.v+.sv \ # 指定DesignWare库路径和文件扩展名
-v $DW_PATH/DW_foundation.sver \ # 显式指定DesignWare库文件
your_design.v tb.v
# 运行仿真
./simv
- DESIGNWARE_HOME
作用: 这是Synopsys DesignWare库的根目录,通常包含DesignWare IP核的源代码、仿真模型、综合脚本等。
内容:
sim_ver: Verilog仿真模型。
synthesis: 综合脚本和约束文件。
docs: 文档。
用途: 用于仿真和综合过程中调用DesignWare IP核。
- DW_PATH
作用: 这是DesignWare库的仿真模型目录,专门用于仿真。通常包含Verilog或SystemVerilog的仿真模型文件。
内容:
DW_foundation.sv: DesignWare基础库的SystemVerilog文件。
其他IP核的仿真模型(如乘法器、加法器等)。
用途: 在VCS仿真中,通过-y和+libext+选项指定该路径,以链接DesignWare仿真模型。
- VIP_PATH
作用: 这是Synopsys Verification IP(VIP)库的路径,用于验证复杂的协议或标准接口(如AMBA、PCIe、USB等)。
内容:
协议验证模型(如AXI、AHB、APB等)。
测试用例和验证环境。
用途: 在验证环境中调用VIP库,用于验证设计是否符合协议规范。
使用LSF
如何使用Makefile管理VCS编译和仿真,并通过bsub提交任务到LSF批处理系统。
两种方式:直接在Makefile中添加submit目标,或者创建单独的bash脚本。
以下是执行上述脚本和命令的具体步骤:
1. 编写Makefile
假设你的 Makefile
包含以下规则(如上述示例):
compile:
vcs -full64 -sverilog -o simv +incdir+./include ./src/*.v
simulate: compile
./simv +ntb_opts=ucli
# 清理规则
clean:
rm -rf simv csrc simv.daidir *.log
submit:
bsub -J VCS_SIM -o ./logs/sim_%J.out -eo ./logs/sim_%J.err -n 4 -M 16GB -W 2:00 -R "span[hosts=1]" "make simulate"
假设项目目录结构如下:
project/
├── src/ # Verilog 源码
├── include/ # 头文件
├── testbench/ # 测试平台
├── scripts/ # 提交脚本
├── logs/ # 日志文件
└── Makefile # 编译和仿真控制
# VCS 编译选项
VCS_OPTS = -full64 -sverilog -debug_acc+all -timescale=1ns/1ps
INC_DIR = +incdir+./include +incdir+./testbench
VCS_SIM_OPTS = +ntb_opts=uvm-1.2 +UVM_TESTNAME=base_test
# 源码路径
SRC_FILES = ./src/*.v ./testbench/tb_top.sv
# 默认目标
all: compile simulate
# 编译规则
compile:
vcs $(VCS_OPTS) $(INC_DIR) -o simv $(SRC_FILES)
# 仿真规则
simulate:
./simv $(VCS_SIM_OPTS) | tee simulation.log
# 清理规则
clean:
rm -rf simv csrc simv.daidir *.log *.vpd *.fsdb *.key
# 提交到 LSF
submit:
bsub -J VCS_SIM -o ./logs/sim_%J.out -eo ./logs/sim_%J.err -n 4 -M 16GB -W 2:00 -R "span[hosts=1]" "make simulate"
1.1 直接编译和仿真
-
编译代码:
make compile
-
运行仿真:
make simulate
2. 提交作业到 LSF
2.1 通过 Makefile 提交
如果 Makefile
中定义了 submit
规则:
submit:
bsub -J VCS_SIM -o ./logs/sim_%J.out -eo ./logs/sim_%J.err -n 4 -M 16GB -W 2:00 -R "span[hosts=1]" "make simulate"
直接运行:
make submit
2.2 通过独立脚本提交
如果创建了独立的提交脚本(如 scripts/run_sim.sh
):
#!/bin/bash
# 提交到 LSF(直接命令行)
bsub -J VCS_SIM \
-o ./logs/sim_%J.out \
-eo ./logs/sim_%J.err \
-n 8 \ # 请求 8 个 CPU 核
-M 32GB \ # 请求 32GB 内存
-W 4:00 \ # 超时时间 4 小时
-R "span[hosts=1]" \ # 所有核在同一个节点
"make clean && make simulate"
执行步骤:
- 赋予脚本执行权限:
chmod +x scripts/run_sim.sh
- 运行脚本:
./scripts/run_sim.sh
2.3 高级功能
- 依赖任务:如果仿真依赖编译完成,分步提交:
# 先提交编译任务
COMPILE_JOB_ID=$(bsub -J COMPILE -o compile.log "make compile" | awk '{print $2}' | tr -d '<>' )
# 提交仿真任务,依赖编译任务
bsub -J SIMULATE -w "done($COMPILE_JOB_ID)" -o sim.log "make simulate"
并行仿真:若 VCS 支持多线程(如 -j 选项),需与 LSF 资源匹配:
# Makefile 中启用并行仿真
simulate:
./simv +ntb_opts=uvm +UVM_TESTNAME=stress_test -j 8
# 提交时请求 8 核
bsub -n 8 -R "span[ptile=8]" "make simulate"
3. 关键命令总结
场景 | 命令 |
---|---|
本地编译 | make compile |
本地仿真 | make simulate |
提交到 LSF(通过 Makefile) | make submit |
提交到 LSF(通过脚本) | ./scripts/run_sim.sh |
查看作业状态 | bjobs 或 bjobs -l <jobID> |
终止作业 | bkill <jobID> |
查看日志 | tail -f ./logs/sim_12345.out |
4. 注意事项
- 路径一致性:确保
Makefile
和脚本中的路径(如./src/*.v
和./logs/
)与实际目录匹配。 - 资源请求:根据项目需求调整
-n
(CPU 核数)、-M
(内存)、-W
(超时时间)。 - 依赖管理:如果仿真依赖编译,使用
make clean && make simulate
确保重新编译。
通过以上命令,你可以完成从本地编译到 LSF 集群提交的全流程操作。