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 ...
随机推荐
- c++ 跨平台线程同步对象那些事儿——基于 ace
前言 ACE (Adaptive Communication Environment) 是早年间很火的一个 c++ 开源通讯框架,当时 c++ 的库比较少,以至于谈 c++ 网络通讯就绕不开 ACE, ...
- 线程的分离状态(detached state)
说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的. 我们知道,进程中的线程可以调用: [cpp] view plaincopyprint? int pt ...
- springboot项目打包docker镜像maven插件
<!-- profile docker config --> <profiles> <profile> <id>docker</id> &l ...
- tomcat服务监控分析及自启
#! /bin/bash # process-monitor.sh serverName="/usr/local/apache-tomcat-7.0.72-8080" #获取进程i ...
- 深入理解HTTP请求流程
以前写过一篇博客,叫做HTTP的报文分析:https://blog.csdn.net/ZripenYe/article/details/119593269但是感觉还是不太深入.不够全面,顶多了解个大概 ...
- Linux系统启动初始化
文章目录 一.BIOS 加载启动引导程序 二.MBR 主引导扇区 三.GRUB引导内核 3.1运行 boot.img 3.2加载 core.img 3.3切换到保护模式 3.4kernel.img 引 ...
- NOIP 模拟 7 回家
题解 题目 第一眼,板子题,不就是一个缩点吗?后来一想不对,哪有这么傻的出题人呢,出个这水题. 一想,不对,不仅要求割点,还要判断这个割点是否在搜索树 \(n\) 的祖先上.想到这后,我哈哈大笑,还想 ...
- NOIP 模拟 $13\; \text{玄学题}$
题解 题如其名,是挺玄学的. 我们发现每个值是 \(-1\) 还是 \(1\) 只与它的次数是奇是偶有关,而 \(\sum_j^{j\le m}d(i×j)\) 又只与其中有多少个奇数有关 对于 \( ...
- flutter捕获应用退出弹出对话框
使用WillPopScope组件,它会检测到子组件的Navigation的pop事件,并拦截下来.我们需要在它的onWillPop属性中返回一个新的组件(一般是一个Dialog)处理是否真的pop该页 ...
- flutter中存储键值对简单数据(相当于前端localstorage概念)
首先需要安装一个官方推荐包: 1 dependencies: 2 flutter: 3 sdk: flutter 4 shared_preferences: any // 先获取 shared pre ...