参考

  《手把手教你设计CPU——RISC-V处理器篇》

先给出不用if-else和case的原因

  Verilog中的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语法的更多相关文章

  1. PHP中的数据库一、MySQL优化策略综述

    前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身,而在于数据库.我们都知道,PHP开发中,数据的增删改查是核心.为了提升PHP的运行效率,程序员不光需要写出逻辑清晰,效率很高的代码,还要能对 ...

  2. Hibernate查询以及优化策略04

    一. HQL查询 1. HQL(hibernate query language)单表查询 1.1 准备项目 创建项目: hinernate-03-query 引入jar,同前一个项目 复制实体(订单 ...

  3. 90 % Java 程序员被误导的一个性能优化策略

    我们经常看到一些 Java 性能优化的书或者理念,说不要在循环内定义变量,这样会占用过多的内存影响性能,而要在循环外面定义.接触 Java 这么久以来,相信很多 Java 程序员都被这种代码性能优化策 ...

  4. Day7:掌握APICloud应用管理相关服务的配置使用和相关API,包括:应用发布、版本管理、云修复、闪屏广告等。理解APICloud APP优化策略和编码规范;了解APICloud多Widget管理机制和SuperWebview的使用

    主要内容: 1. 应用发布 1.1 云编译 1.2 全包加密 网页全包加密:对网页中全包的html,css,javascript代码进行加密,加密后的网友代码都是不可读的,并且不能通过常用的格式化工具 ...

  5. Hive(六)hive执行过程实例分析与hive优化策略

    一.Hive 执行过程实例分析 1.join 对于 join 操作:SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.useri ...

  6. hive作业的优化策略

    Mapreduce自身的特点: 1.IO和网络负载大:优化策略:减少IO和网络负载. 2.内存负载不大.优化策略:增大内存使用率: 3.CPU负载不大.优化策略:增大CPU使用率: (hive的优化应 ...

  7. 详解服务器性能测试的全生命周期?——从测试、结果分析到优化策略(转载)

    服务器性能测试是一项非常重要而且必要的工作,本文是作者Micheal在对服务器进行性能测试的过程中不断摸索出来的一些实用策略,通过定位问题,分析原因以及解决问题,实现对服务器进行更有针对性的优化,提升 ...

  8. Vue项目上线环境部署,项目优化策略,生成打包报告,及上线相关配置

    Node.js简介 Node.js是一个基于Chrome V8引擎的JavaScript运行环境,用来方便快速地搭建易于扩展的网络应用.Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量 ...

  9. 52 条 SQL 语句性能优化策略,建议收藏

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...

随机推荐

  1. rot位移密码详解(rot5、rot13、rot18、rot47)

    最近训练CTF的时候,发现密码学这块的知识不太系统,所以自己接下来会陆陆续续整理出来 rot密码 rot密码其实可以看作是凯撒密码的一种变式 本质都是移位运算 rot密码按种类大致分为以下几类 rot ...

  2. Typora加七牛云实现实时图片自动上传

    Typora加七牛云实现实时图片自动上传 前言: ​ Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别.重点是免费! ​ 其风格简约 ...

  3. Special Forms and Syntax Sugars in Clojure

    (...): function literals, p40, 64; '(...): suppress evaluation, p24; _(...): comments, p18; ".. ...

  4. Java 在PPT中插入OLE对象

    PPT幻灯片中支持将文档作为OLE对象插入到PPT幻灯片指定位置,在幻灯片中可直接点击该对象,打开或编辑等.下面以插入Excel工作簿文档为例,介绍如何来插入到幻灯片.   程序运行环境 编译环境:I ...

  5. DVWA(三):SQL injection 全等级SQL注入

    (本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进 ...

  6. STM32—驱动GY85-IMU模块

    GY85是一个惯性测量模块,内部集成了三轴加速度计.三轴陀螺仪.电子罗盘.气压传感器等芯片,用于测量和报告设备速度.方向.重力,模块可以将加速度计.陀螺仪.电子罗盘等传感器的数据进行综合,在上位机可以 ...

  7. CMD下编译运行Java程序

    准备1:JDK下好了 准备2:环境变量配置好了 准备3:本次测试用的是JDK8,用JDK10的在Eclipse里面好像用不了 满足上面三个条件,那可以继续看下去了 Test_1:带包编译运行 代码: ...

  8. mongoose 更新数据时不验证数据(忽略设定的集合规则)的问题

    问题: mongoose 更新数据时不验证数据(忽略设定的集合规则)的问题 参考: http://www.mongoosejs.net/docs/api.html#updateone_updateOn ...

  9. CLR、CLI、CTS、CLS的关系

    网站:https://blog.csdn.net/dodream/article/details/4719578 ·CLR(公共语言运行库)是一个CLI的实现,包含了.NET运行引擎和符合CLI的类库 ...

  10. c# 执行python方法

    在C#使用Python脚本文件要注意的的是,首先要将IronPython2.7安装路径中的两个dll文件添加到C#引用中一个是IronPython.dll,另一个是Microsoft.Scriptin ...