对RTL进行综合与评估
梳理下仿真、综合、验证的含义
信息来源:ChatGPT-4o
1. RTL仿真 (Simulation)
仿真的目标是验证RTL代码(硬件描述语言编写的电路逻辑)的行为是否符合设计预期。
- RTL代码:使用Verilog、VHDL或SystemVerilog等语言描述电路功能。
- 工具:使用仿真器(如ModelSim、VCS等)加载RTL代码和测试用例。
- 过程:
- 编写测试用例:提供输入信号、时序和期望输出。
- 运行仿真:观察输出波形(例如通过VCD文件)。
- 分析结果:验证设计是否正确。
场景:
- 检查设计是否逻辑正确。
- 在正式综合前修复问题。
2. RTL综合 (Synthesis)
综合的目标是将RTL代码转化为目标硬件(FPGA或ASIC)可以实现的门级网表(gate-level netlist)。
- 输入:RTL代码。
- 输出:基于工艺库的门级网表。
- 工具:Yosys、Design Compiler等。
- 过程:
- RTL代码解析和优化。
- 转换为逻辑单元(例如与门、或门、触发器)。
- 生成网表和报告(时序、面积等)。
场景:
- 准备设计文件供后续流程使用。
- 评估设计的硬件性能(时延、面积、功耗等)。
3. RTL验证 (Verification)
验证的目标是确保整个设计功能在不同角度均满足规格要求(比仿真范围更广)。
-
方法:
-
功能验证
:检查设计逻辑是否符合规格书。
- 使用约束随机验证(Constrained Random Verification)。
- 借助验证环境如UVM(Universal Verification Methodology)。
-
形式验证:使用数学方法检查RTL和门级网表等是否一致。
-
代码覆盖率:确保测试用例触发了设计的所有功能路径。
-
-
工具:JasperGold、Questa等。
场景:
- 确保设计在各种边界条件下都能正常运行。
- 确保没有未被检测到的设计缺陷。
使用Yosys等工具对Verilog代码进行综合与评估
ysyx提供的方法如下:

经过一下午的功夫(以及chatgpt的努力),我修改了makefile文件,使得用起来比较方便。
//makefile
#跑自己的project,添加了show电路图命令
PROJ_PATH = $(shell pwd)
DESIGN ?= mux41b
SDC_FILE ?= $(PROJ_PATH)/example/top.sdc
RTL_FILES ?= $(shell find $(PROJ_PATH)/example -name $(DESIGN).v)
export CLK_FREQ_MHZ ?= 500
RESULT_DIR = $(PROJ_PATH)/result/$(DESIGN)-$(CLK_FREQ_MHZ)MHz
SCRIPT_DIR = $(PROJ_PATH)/scripts
NETLIST_SYN_V = $(RESULT_DIR)/$(DESIGN).netlist.syn.v
NETLIST_FIXED_V = $(RESULT_DIR)/$(DESIGN).netlist.fixed.v
TIMING_RPT = $(RESULT_DIR)/$(DESIGN).rpt
DIAGRAM_PNG = $(RESULT_DIR)/$(DESIGN).png
init:
bash -c "$$(wget -O - https://ysyx.oscc.cc/slides/resources/scripts/init-yosys-sta.sh)"
syn: $(NETLIST_SYN_V)
$(NETLIST_SYN_V): $(RTL_FILES) $(SCRIPT_DIR)/yosys.tcl
mkdir -p $(@D)
echo tcl $(SCRIPT_DIR)/yosys.tcl $(DESIGN) \"$(RTL_FILES)\" $@ | yosys -l $(@D)/yosys.log -s -
fix-fanout: $(NETLIST_FIXED_V)
$(NETLIST_FIXED_V): $(SCRIPT_DIR)/fix-fanout.tcl $(SDC_FILE) $(NETLIST_SYN_V)
./bin/iEDA -script $^ $(DESIGN) $@ 2>&1 | tee $(RESULT_DIR)/fix-fanout.log
sta: $(TIMING_RPT)
$(TIMING_RPT): $(SCRIPT_DIR)/sta.tcl $(SDC_FILE) $(NETLIST_FIXED_V)
./bin/iEDA -script $^ $(DESIGN) 2>&1 | tee $(RESULT_DIR)/sta.log
show: $(NETLIST_SYN_V)
mkdir -p $(RESULT_DIR)
echo "read_verilog $(NETLIST_SYN_V); hierarchy -top $(DESIGN); show -format png -prefix $(RESULT_DIR)/$(DESIGN) $(DESIGN)" | yosys
xdot $(RESULT_DIR)/$(DESIGN).dot
clean:
-rm -rf result/
.PHONY: init syn fix-fanout sta show clean
快速了解:

以上就是这个yosys根目录下的文件夹,nangate45就是那个“开源工艺库”,使用时只需关注两个:example和result
example:存放.v文件以及一个top.sdc(用于描述设计约束,这个还没有详细学习。但是暂时不用动,可以用)

result:存放生成的评估文件以及电路图(.dot和.png,这俩是同一个东西),那个带时间戳后缀的是空文件夹,暂时不知道咋来的

result文件夹可以通过”make clean“清除

上面就是生成的评估文件啥的,还没有系统地学习如何阅读。
目前需要知道的就是:.netlist.syn.v和.netlist.fixed.v分别是基于你的v文件直接生成的网表文件和一个由yosys提升过的网表文件(貌似是)。这两个文件都可以转成电路图(可视化)
使用:
1、把你的.v文件拷贝一份到”example“文件夹下,不用改名,包括模块的名字也不用改
2、修改makefile最上面的名字,和.v一致
DESIGN ?= myDUTname
3、开终端:
make show //生成、打开电路图
生成的文件在result下,会根据dut的名字开一个目录
这个是我自己添加的命令,直接生成网表文件与电路图,没有那些评估文件。会自动打开电路图(使用xdot工具打开),也有对应的png图片

make sta //生成网表文件、评估文件
生成的文件在result下,会根据dut的名字开一个目录(和上面”show的“在同一个目录下)
思考
虽然现在还不知道评估文件怎么看,但是电路图还是很直观的,发现之前存在的一些问题:
就是电路设计和软件开发还是很不一样,要考虑硬件的效率问题,不能用做算法题的思想去写RTL代码
拿一个NJU Homework的实验1 mux41来说,我又重新写了一遍,电路图的面积明显减小:

其实对应chisel上的改动就是把 “直观易想” 的switch语句换成Mux的嵌套,虽然可读性降低了,但是提高了硬件上的效率:

生成的Verilog如下(乍一看没太大区别)


3204

被折叠的 条评论
为什么被折叠?



