对RTL进行综合与评估

对RTL进行综合与评估

梳理下仿真、综合、验证的含义

信息来源:ChatGPT-4o

1. RTL仿真 (Simulation)

仿真的目标是验证RTL代码(硬件描述语言编写的电路逻辑)的行为是否符合设计预期。

  • RTL代码:使用Verilog、VHDL或SystemVerilog等语言描述电路功能。
  • 工具:使用仿真器(如ModelSim、VCS等)加载RTL代码和测试用例。
  • 过程:
    1. 编写测试用例:提供输入信号、时序和期望输出。
    2. 运行仿真:观察输出波形(例如通过VCD文件)。
    3. 分析结果:验证设计是否正确。

场景

  • 检查设计是否逻辑正确。
  • 在正式综合前修复问题。

2. RTL综合 (Synthesis)

综合的目标是将RTL代码转化为目标硬件(FPGA或ASIC)可以实现的门级网表(gate-level netlist)。

  • 输入:RTL代码。
  • 输出:基于工艺库的门级网表。
  • 工具:Yosys、Design Compiler等。
  • 过程:
    1. RTL代码解析和优化。
    2. 转换为逻辑单元(例如与门、或门、触发器)。
    3. 生成网表和报告(时序、面积等)。

场景

  • 准备设计文件供后续流程使用。
  • 评估设计的硬件性能(时延、面积、功耗等)。

3. RTL验证 (Verification)

验证的目标是确保整个设计功能在不同角度均满足规格要求(比仿真范围更广)。

  • 方法

    1. 功能验证

      :检查设计逻辑是否符合规格书。

      • 使用约束随机验证(Constrained Random Verification)。
      • 借助验证环境如UVM(Universal Verification Methodology)。
    2. 形式验证:使用数学方法检查RTL和门级网表等是否一致。

    3. 代码覆盖率:确保测试用例触发了设计的所有功能路径。

  • 工具: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如下(乍一看没太大区别)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值