【芯片设计- RTL 数字逻辑设计入门 5 -- RTL 全加器实现及验证】

news2024/12/23 8:35:38

文章目录

    • 1.1
      • 1.1.1 DUT Code
      • 1.1.2 Testbench
      • 1.1.3 自动化编译:Makefile
      • 1.1.4 Debug 方法
    • 1.2 逻辑综合工具 - Design Compile
      • 1.2.1 逻辑综合流程
      • 1.2.2 逻辑综合方法

1.1

1.1.1 DUT Code

以实现一个全加器为例子,

  • 功能

    • 真值表
      在这里插入图片描述
  • 验证

    • 功能完整性
    • 穷举法
    • 代码覆盖率
  • lab01

    • 编译
    • 仿真
    • 产看波形
//-------------------------------------------------------------
// FileName: full_adder.v
// Creator: demo
// E-mail: demo@demo.com
// Function: one bit full adder
// Update:
// Copyright: www.demo.demo.com
//--------------------------------------------------------------

module full_adder (
// module head: verillog-2001 format
input wire a_in, 
input wire b_in, 
input wire c_in,     //carry in
output wire sum_out, 
output wire c_out   //carry out, 
);

// mehtod 1 Gate Level describe
assign sum_out = a_in ^ b_in ^ c_in;
assign c_out = (a_in & b_in) | (b_in & c_in) | (a_in & c_in);

// method 2 RTL design for Adder with the keyword "assign"
// behaviro of the adder can be synthesizable
// "assign" means connectivity, which is used to describe a combinational circuit
// assign  {c_out, sum_out} = a_in + b_in + c_in;

// method 3 RTL design for Adder wiht the keyword "always"
//reg c_o, sum_o;
//always @ (a_in, b_in, c_in) begin
// {c_o, sum_o} = a_in + b_in + c_in; // the reg type variable is required in the always blocks
//end
// assign {c_out, sum_out} = {c_O, sum_o};
endmoudle
  • 方式1: 使用门级网表的方式来描述;
  • 方式2:使用 RTL 设计, assign 表示用金属线连接,主要用于组合电路;其中的花括号可以认为是拼接符号,将高位放在前面,将低位放在后面;一位的全加器会形成两位的输出,所以花括号里是两位的。可以看到使用 “+” 来描述比门级网表的方式要清晰。
  • 方式3:使用RTL 设计,使用“always”语句来定义输出,注意always 语句左侧必须是 reg 类型,

1.1.2 Testbench

如何验证一个全加器呢?

//-------------------------------------------------------------
// File header
//-------------------------------------------------------------

module full_adder_tb;
// driver the input port with the reg type
reg ain, bin, cin;  //给 DUT 输出驱动,驱动的类型要是 reg 类型;

// sample the output port with the wire type
wire sumout, cout;

full_adder u_full_addr(   // instance, 实列化,真正的物理电路是实例化以后,课可以例化很多加法器。
// task 1. how to create an instance
// moudle head: verillog-2001 format 
/* input wire */ .a_in (ain),   //testbench 的信号和 DUT的信号通过显示方式进行连接   
/* input wire */ .a_in (bin),
/* input wire */ .a_in (cin),  
/* output wire */ .sumout (sumout), //carry in
/* output wire */ .c_out (cout)     //carry out
);

// behavior of the adder can ben synthesizeable
// "assign" means connectivity
// assign {c_out, sum_out} = a_in + b_in + c_in;

// task 2. clock and reset generator
parameter CLK_PERIOD = 20;
reg clk, reset_n; // reset_n: active low

initial begin
	clk = 0;
	forever begin
		#(CLK_PERIOD/2) clk = ~clk;
	end
end

initial begin
	reset_n = 0;
	#100
	reset_n = 1;
end

// task 3. driver the stimulus and caputre the response
// here is a testcase
initial begin
	#110 ain = 0; bin = 0 ; cin = 0; //00
	#20 ain = 0; bin = 1 ; cin = 0;  //01
	#20 ain = 1; bin = 0 ; cin = 0;  //01
	#20 ain = 1; bin = 1 ; cin = 0;  //10
	#20 ain = 0; bin = 0 ; cin = 1;  //01
	#20 ain = 0; bin = 1 ; cin = 1;  //10
	#20 ain = 1; bin = 0 ; cin = 1;  //10
	//#20 ain = 1; bin = 1 ; cin = 1;  //11
	#20 ain = 1; bin = 1 ; cin = 0;  //10
	#50 $finish; // here is a system task which can stop the simulation
end

// task 4. check the result
always @ {possedge clk} begin
	if (!reset_n) begin
		$dispaly("%t: %m: resetting..., $time")// counter5 clock
	end
	else begin
		$dispaly("%t: %m: resetting finish!, $time")// the 6th clock
	end
end

initial begin
	#115 if({count, sumout}!=2'b00) $display("Error:{count, sumout}=%b,ain=%b,bin=%b,cin=%b",{count,sumout},ain,bin,cin);
	#20 if({count, sumout}!=2'b01) $display("Error:{count, sumout}=%b,ain=%b,bin=%b,cin=%b",{count,sumout},ain,bin,cin);
	#20 if({count, sumout}!=2'b01) $display("Error:{count, sumout}=%b,ain=%b,bin=%b,cin=%b",{count,sumout},ain,bin,cin);
	#20 if({count, sumout}!=2'b10) $display("Error:{count, sumout}=%b,ain=%b,bin=%b,cin=%b",{count,sumout},ain,bin,cin);
	#20 if({count, sumout}!=2'b01) $display("Error:{count, sumout}=%b,ain=%b,bin=%b,cin=%b",{count,sumout},ain,bin,cin);
	#20 if({count, sumout}!=2'b10) $display("Error:{count, sumout}=%b,ain=%b,bin=%b,cin=%b",{count,sumout},ain,bin,cin);
	#20 if({count, sumout}!=2'b10) $display("Error:{count, sumout}=%b,ain=%b,bin=%b,cin=%b",{count,sumout},ain,bin,cin);
	#20 if({count, sumout}!=2'b11) $display("Error:{count, sumout}=%b,ain=%b,bin=%b,cin=%b",{count,sumout},ain,bin,cin);
	#20 if({count, sumout}!=2'b11) $display("Error:{count, sumout}=%b,ain=%b,bin=%b,cin=%b",{count,sumout},ain,bin,cin);
end

// task 5. dump waveform with the compile opton -debug_all
inital begin
	$vcdplusson;
end
endmoudle

initial begin 表示初始化,也即只执行一次:

  • clk 逻辑: 设置时钟周期 CLK_PERIOD =20 ns, 也即时钟为50M, 开始时刻 clk 为0, 然后 进行 延时10ns(CLK_PERIOD/2)后再将 clk 信号取反,这样时钟就会反复循环10ns 高 和 10ns低的效果。
  • reset 逻辑:reset_n 先拉低,然后延时 100ns 后再拉高

1.1.3 自动化编译:Makefile

# Makefile for simulate the full_adder.v with the simulator VCS

#-----------------------------------------------------------------
# Macro variables
RTL		:= ./full_addder.v
TB		+= ./full_adder_tb.v
SEED	?= $(shell data +%s)

# Target: Dependency
all: compile simulate

compile:
	vcs -sverilog -debug_all timescale.v $(RTL) $(TB) -l com.log  #编译文件

simulate:
	./simv +ntb_random_seed=$(SEED) -l sim.log  # 执行仿真

run_dev:
	dev -vpd vcdplus.vpd  # 查看仿真波形

clean: rm -rf *.log csrc simv* *.key *.vpd DVEfiles coverage *.vdb

首先了解下上面 Makefile 中的 三种赋值方式:

  • := 属于强制赋值;
  • += 属于追加赋值,如果TB已经有值,会在其后追加当前的值;
  • ?= 属于判断赋值方式,如果SEED已经有值,这个赋值就不会执行;

其次了解下编译参数

  • -sverilog 用于识别 SystemVerlog 语法;
  • -debug_all 可以将 debug 的信息全部保存下来,比如波形文件;
  • -l com.log 将百衲衣过程生成的日志全部写入 com.log 文件。

vcs 编译完成后会生成一个simv的可执行文件。

在 terminal 中输入 make 命令:

  1. make; 回到当前目录找Makefile 文件,并all 开始执行;
  2. make all
  3. make compile; make simulate 相当于执行了 make all
  4. make run_dev
  5. make clean; make all

用户可以指定要 make 的 target, 即要做哪件事情,如:make clean,那么就会执行 Makefile 文件中的 删除文件操作。

1.1.4 Debug 方法

1.2 逻辑综合工具 - Design Compile

逻辑综合(Synthesis)工具主要用于检查 RTL 代码是否可以综合成电路(与门、非门、或门、FF),具体来说的化就是在 RTL Code freeze 之后将前端设计工程师写的RTL code,映射到特定工艺库上(TSMC/UMC/SMIC),通过添加约束信息,对RTL 代码进行逻辑优化,形成门级网表。

其中约束信息包含(PPA):

  • 时序,比如设计100M;
  • 功耗;
  • 面积;
    PPA 信息添加完成后 工具就会进行优化,优化完成后会形成门级网表。

主要包括下面三部:
Trannslation + mapping + optimized

逻辑综合只做了解

1.2.1 逻辑综合流程

  • Load library and design
  • Apply timing constraints and design rules constraints
  • Synthesis the design
  • Analyze the results
  • Write out the design data(netlist)

逻辑综合完成后需要将 netlist + SDC 给到 backend,做物理版图(layout)

1.2.2 逻辑综合方法

一、启动 DC 工具

  • 方式1:使用GUI方式;
  • 方式2:involve DC, dc_shell
  • 方式3:工程上常用 dc_shell 吃入一个 *.tcl(tool command language) 脚本,很多工具都支持 tcl 语言,
    dc_shell -f syn.tcl | tee -i syn.log

二、设置搜索路径(search_patch)

set_app_var search_patch "$search_patch" ./rtl ./scripts ./libs"

三、libray setup(mapping)

  • target libray
  • link libray

四、read_verilog

  • read_verilog "TOP.v A.v B.v"

五、current_design

  • current_design TOP //设置顶层文件

六、timing constrain

  • clock period;

  • clock skew 时钟上升或者下降的坡度;

  • clock transition 时钟从0->1 或者从 1->0 需要的时间;

  • clock latency 时钟从源发出到接收点的时间;

  • Input delay
    set_input_delay

  • output delay
    set_out_delay -max 0.8 -clock Clk [get_ports B]

七、environment constraint

  • set_input_transition
  • set_load

八、compile/compile_ultra

  • compile
  • compile_ultra

九、report qor

  • Timing
  • Cell count
  • Area:组合电路的面积,非组合电路的面积,线网的面积

十、report_timing
report_timing 静态时序分析

十一、output

推荐阅读:
https://www.bilibili.com/video/BV1WY411D7So?p=9&spm_id_from=pageDriver&vd_source=a354e64412a97e828c2f4b7ebe7c3606

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1072609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哈希应用 : 位图和布隆过滤器

位图 在这里我们可以用一种哈希的新方法 -- 又快又节省内存(位图) -------------------------------------------------------------------------------------------------------------------------------- 对我们的位进行标记 位图的应用 1.给定100亿…

SVV,PPV算法开发记录

定义 刘大为-血液动力学 Getinge 链接:高级监测参数: SVV, PPV 数据集 计算SVV和PPV使用的动脉血压曲线,在此选用了Kaggle上的Cuff-Less Blood Pressure Estimation数据集,该数据集包含PPG,ABP,ECG三条曲线&…

Godot 脚本外置参数设置

文章目录 添加脚本设置参数bulid 一下 Godot Engine 4.2 简体中文文档 C# exports 添加脚本 设置参数 Godot 添加脚本后,设置参数。两种形式都可以 [Export]public int Speed { get; set; } 10;[Export]public string Name ;bulid 一下 私有变量也可以

【网络安全 ---- 靶场搭建】凡诺企业网站管理系统靶场详细搭建过程(asp网站,练习sql注入)

一,资源下载 百度网盘资源下载链接:百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com…

Flink---14、Flink SQL(SQL-Client准备、流处理中的表、时间属性、DDL)

星光下的赶路人star的个人主页 你生而真实,而非完美 文章目录 1、Flink SQL1.1 SQL-Client准备1.1.1 基于yarn-session模式1.1.2 常用配置 1.2 流处理中的表1.2.1 动态表和持续查询1.2.2 将流转换为动态表1.2.3 用SQL持续查询1.2.4 将动态表转换为流 1.3 时间属性1.…

影剧院音乐厅微信小程序源码

音乐厅小程序,包括资讯动态,演出信息,艺术教育,经典 剧目,商务合作,关于我们,公益演出预约,商业演出预约,演出日历,我的今日预约,我的预约码&…

TypeScript 笔记:基础类型

1 any类型(任意值类型) 声明为 any 的变量可以赋予任意类型的值。 any类型是Typescript 针对编程时类型不明确的变量使用的一种数据类型,常用于: 变量的值会动态改变 ——>任意值类型可以让这些变量跳过编译阶段的类型检查 let x: any …

顺序栈与链式栈

目录 栈的定义与结构 栈的实现 顺序栈的实现 初始化空栈 销毁栈 压栈 获取栈顶元素 出栈 判断栈是否为空 获取栈中有效数据的个数 链式栈的实现 初始化空栈 销毁栈 压栈 获取栈顶元素 出栈 判断栈是否为空 获取栈中有效数据的个数 顺序栈与链栈的对比 栈的定义…

32个uniapp项目源码 涵盖商城团购等

IT之家小程序版客户端(使用 Mpvue 开发,兼容 Web)ithome-lite-master.zip mpvue 仿网易严选mpvue-shop-master.zip mpvue-音乐播放器mpvue-music-master.zip mpvue性能测试与体验miniweibo-master.zip mpvue改造的日历.zip mpvue框架仿滴滴出行didi-master.zip mpVu…

华为云云耀云服务器L实例评测使用 | 云耀云服务器L实例Docker可视化Portainer容器管理

一、使用背景 之前一直在用阿里云或者腾讯云的服务器,现在接触了一下华为云的服务器实例,点开产品列表发现有弹性云服务器ECS、云耀云服务器HECS等,本文主要使用云耀云服务器,看到官方简介: 华为云耀云服务器&#x…

TensorFlow入门(十三、动态图Eager)

一个图(Graph)代表一个计算任务,且在模型运行时,需要把图放入会话(session)里被启动。一旦模型开始运行,图就无法修改了。TensorFlow把这种图一般称为静态图。 动态图是指在Python中代码被调用后,其操作立即被执行的计算。 它与静态图最大的区别是不需要使用session来建立会话…

从创作到表演的全方位改变,数字时代中的和声之音

随着ChatGPT的现象级走红,AIGC在全球范围内掀起热潮。 所谓AIGC(Al-Generated Content),是指利用人工智能来根据用户需求,借助已有的材料库生成对应的内容。事实上,除了强大的文本能力之外,图像…

【Linux】工具:Bundle 库的安装和简单使用

文章目录 1. 下载 buddle 库2. 从 Win 传输文件到 Linux3. 解压缩 Bundle 库压缩解压缩 1. 下载 buddle 库 要求联网,笔者使用云服务器,在 Xshell 7 上完成的虚拟机操作。 安装 git 工具,通过代码 clone (大概率连接不上&#x…

CVE-2021-4034 polkit提权漏洞复现

CVE-2021-4034 polkit提权漏洞复现 1.前期准备2.复现 1.前期准备 Github地址: https://github.com/berdav/CVE-2021-4034polkit是一个授权管理器,其系统架构由授权和身份验证代理组成,pkexec是其中polkit的其中一个工具,他的作用…

UML简介

UML,全称为Unified Modeling Language(统一建模语言),是一种用于软件工程和系统设计的标准化建模语言。它提供了一套图形化的符号和标记,用于描述和表示软件系统、系统架构、流程、数据结构、行为和交互。UML的设计旨在…

docker安装wiki

1.docker pull mediawiki 2.docker run -d --name mywiki -p 8666:80 mediawiki 访问ip:8666,就可以看到配置页面了 3.docker pull mysql docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD123456 -p 3307:3306 mysql 4.在配置页面链接ip:3307,连接数据库,接下…

Excel 快速填充

文章目录 利用快速填充进行提取数据利用快速填充进行拆分重组 2013 及以上版本才有的功能. 利用快速填充进行提取数据 有一列的数据已有, 需要提取部分数据到另一列, 只需要输入部分内容, 后面内容可以自动显示, 按下回车即可快速填充. 只要前面手动输入的内容没有错得太离谱…

迅为龙芯开发板开发板系统烧写-启动系统

上面所有的步骤我们都做完以后,输入命令 sync 确保我们之前的步骤都可以保存到 ssd,接着拔下 U盘,最后输入命令 reboot 重启开发板,如下图所示: 如果启动成功,我们会看到 pmon 从硬盘加载 linux 内核和文件…

视频怎么压缩?这样做视频变小还清晰

在我们的日常生活和工作中,视频已经成为了不可或缺的一部分。然而,随着视频文件的增大,如何有效地压缩视频以方便存储和传输成了一个重要的问题,如果你还不知道怎么压缩视频大小,不妨试试下面的方法吧~ 方法一&#xf…

1.3 Linux目录操作

文章目录 零、学习目标一、导入新课二、新课讲解(一)常用权限操作1、常用权限操作(1)chgrp命令(2)chown命令(3)chmod命令 2、权限操作实战任务1、创建文件,设置其用户组任…