Verilog RTL优化策略(一):推荐使用assign语法替代if-else和case语法
参考
《手把手教你设计CPU——RISC-V处理器篇》
先给出不用if-else和case的原因
- 不能传播不定态X;
- 会产生优先级的选择电路而非并行选择电路,从而不利于时序和面积;
情况一
Verilog 的if-else 不能传播不定态,以如下代码片段为例。假设 a 的值为X不定态,按照Verilog语法会将其等效于 a == 0,从而让 out 输出值等于in2 最终没有将X不定态传播出去。这种情况可能会在仿真阶段掩盖某些致命的 bug,造成芯片功能错误:
if(a)
out = in1;
else
out = in2;
而使用功能等效的 assign 语法,如下所示,假设 a 的值为X不定态,按照 Verilog 语法,则会将X不定态传播出去,从而让out 输出值也等于X。通过X不定态的传播,可以在仿真阶段将 bug彻底暴露出来
assign out = a ? inl : in2;
虽然现在有的 EDA 工具提供专有选项(例如 Synopsys VCS 提供 xprop 选项)可以将 Verilog 原始语法中定 义的"不传播不定态"的情形强行传播出来,但是一方面不是所有的 EDA 工具均支持此功能;另一方面在操作中此选项也时常被忽视,从而造成疏漏。
情况二
Verilog 的 case 语法也不能传播不定态,与情况一中的if-else 同理。而使用等效的 assign 语法即可规避此缺陷。
情况三
verilog 的 if-else 语法会被综合成为优先级选择的电路,面积和时序均不够优化,如下所示∶
if(sel1)
out = in1 [3:0];
else if (sel2)
out = in2 [3:0];
else if (sel3)
out = in3[3:0];
else
out = 4'b0;
如果此处确实是希望生成一种优先级选择的逻辑,则推荐使用 assign 语法等效地编写成如下形式,以规避 X 不定态传播的问题∶
assign out = sel1 ? in1 [3:0]:
sel2 ? in2 [3:0]:
sel3 ? in3 [3:0]:
4' b0;
而如果此处本来是希望生成一种并行选择的逻辑,则推荐使用 assign 语法明确地使用"与"-"或"逻辑,编写如下∶
assign out = ({4{sel1}} & in1[3:0])
| ({4{sel2}} & in2[3:0])
| ({4{sel3}} & in3[3:0]);
使用明确的 assign 语法编写的"与"-"或"逻辑一定能够保证综合生成并行选择的电路
情况四
与情况三同理,verilog 的 case 语法也会被综合成为优先级选择的电路,面积和时序均不够优化。有的EDA综合工具可以提供指引注释(例如 synopsys parallel case 和 full case)来使得综合工具能够综合出并行选择逻辑,但是这样可能会造成前后仿真不一致的严重问题,从而产生重大的bug。因此,在实际的工程开发中∶
● 应该明令禁止使用 EDA 综合工具提供的指引注释(例如 synopsys parallel case 和 full case)。
● 应该使用情况三推荐的等效 assign 语法编写电路。
Verilog RTL优化策略(一):推荐使用assign语法替代if-else和case语法的更多相关文章
- PHP中的数据库一、MySQL优化策略综述
前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身,而在于数据库.我们都知道,PHP开发中,数据的增删改查是核心.为了提升PHP的运行效率,程序员不光需要写出逻辑清晰,效率很高的代码,还要能对 ...
- Hibernate查询以及优化策略04
一. HQL查询 1. HQL(hibernate query language)单表查询 1.1 准备项目 创建项目: hinernate-03-query 引入jar,同前一个项目 复制实体(订单 ...
- 90 % Java 程序员被误导的一个性能优化策略
我们经常看到一些 Java 性能优化的书或者理念,说不要在循环内定义变量,这样会占用过多的内存影响性能,而要在循环外面定义.接触 Java 这么久以来,相信很多 Java 程序员都被这种代码性能优化策 ...
- Day7:掌握APICloud应用管理相关服务的配置使用和相关API,包括:应用发布、版本管理、云修复、闪屏广告等。理解APICloud APP优化策略和编码规范;了解APICloud多Widget管理机制和SuperWebview的使用
主要内容: 1. 应用发布 1.1 云编译 1.2 全包加密 网页全包加密:对网页中全包的html,css,javascript代码进行加密,加密后的网友代码都是不可读的,并且不能通过常用的格式化工具 ...
- Hive(六)hive执行过程实例分析与hive优化策略
一.Hive 执行过程实例分析 1.join 对于 join 操作:SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.useri ...
- hive作业的优化策略
Mapreduce自身的特点: 1.IO和网络负载大:优化策略:减少IO和网络负载. 2.内存负载不大.优化策略:增大内存使用率: 3.CPU负载不大.优化策略:增大CPU使用率: (hive的优化应 ...
- 详解服务器性能测试的全生命周期?——从测试、结果分析到优化策略(转载)
服务器性能测试是一项非常重要而且必要的工作,本文是作者Micheal在对服务器进行性能测试的过程中不断摸索出来的一些实用策略,通过定位问题,分析原因以及解决问题,实现对服务器进行更有针对性的优化,提升 ...
- Vue项目上线环境部署,项目优化策略,生成打包报告,及上线相关配置
Node.js简介 Node.js是一个基于Chrome V8引擎的JavaScript运行环境,用来方便快速地搭建易于扩展的网络应用.Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量 ...
- 52 条 SQL 语句性能优化策略,建议收藏
本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...
随机推荐
- 攻防世界pwn高手区——pwn1
攻防世界 -- pwn1 攻防世界的一道pwn题,也有一段时间没有做pwn了,找了一道栈题热身,发现还是有些生疏了. 题目流程 拖入IDA中,题目流程如图所示,当v0为1时,存在栈溢出漏洞.在gdb中 ...
- C++ 二进制文件 读 写文件
1 #include <iostream> 2 #include <string> 3 #include<fstream> 4 using namespace st ...
- 跟Waf斗智斗勇的一天
差点心态爆炸 幸亏整出来了... 最近快放寒假了..临近高考不到最后一星期绝对不学习.. 挖下SRC 这家自带的waf头疼死我了 想几次Fuzz全都撞壁了 然后发现了这家waf的规则 信息搜集不说了 ...
- Linux远程访问控制
目录 一.SSH远程管理 1.1.定义 1.2.配置OpenSSH服务端 二.sshd服务支持两种验证方式 2.1.密码验证 2.2.使用SSH客户端程序 ssh远程登录 scp远程复制 sftp安全 ...
- 授予mysql的其他用户数据库的使用权限
场景:不同的开发人员有不同的数据库的权限:也可适用于外包公司不同的开发权限. root用户登录数据库,命令行执行下面语句即可. grant select,delete,update,create,dr ...
- MongoDB-04-备份和恢复
mongodb备份和恢复 常用的备份恢复工具 1 ** mongoexport/mongoimport 2 ***** mongodump/mongorestore 备份工具区别在哪里 应用场景总结: ...
- docker容器dockerfile详解
docker公司在容器技术发展中提出了镜像分层的理念,可以说也是这个革命性的理念让原本只不过是整合linux内核特性的容器,开始野蛮生长. docker通过UnionFS联合文件系统将镜像的分层实现合 ...
- 快速上手CH340N电路设计(CH340N USB转串口模块 USB Type-C接口 CH340系列芯片讲解)
一.上模块 二.功能分析 l 芯片:CH340N l 输入接口:USB.TYPE-C l 输出接口:TTL(5V\3.3V\GND\TX\RX) l 指示灯:电源.TX.RX ...
- Go的Channel发送和接收
先来看一道面试题: 对已经关闭的 chan 进行读写,会怎么样?为什么? 在上一篇学习 Go 协程的文章中,知道 go 关键字可以用来开启一个 goroutine 进行任务处理,但多个任务之间如果需要 ...
- msp432搭建平衡小车(二)
前言 上一节掌握了使用pwm驱动电机,接下来介绍如何使用msp432读取mpu6050数据 正文 首先我们得知道mpu6050通信方式,由于mpu6050只能用i2c通信,所以学会使用msp432的i ...