数字硬件建模SystemVerilog-组合逻辑建模(4)组合逻辑决策优先级

news2024/10/2 12:31:17

8572b84b24c86657ca62e0bb71c969a1.png

数字门级电路可分为两大类:组合逻辑和时序逻辑。锁存器是组合逻辑和时序逻辑的一个交叉点,在后面会作为单独的主题处理。

组合逻辑描述了门级电路,其中逻辑块的输出直接反映到该块的输入值的组合,例如,双输入AND门的输出是两个输入的逻辑与。如果输入值发生变化,输出值将反映这一变化,组合逻辑的RTL模型需要反映这种门级行为,这意味着逻辑块的输出必须始终反映该逻辑块当前输入值的组合。

SystemVerilog有三种在可综合RTL级别表示组合逻辑的方法:连续赋值语句、always程序块和函数。接下来几篇文章将探讨每种编码风格,并推荐最佳实践编码风格。

f78826c7a42cdf575e4f7ff9769554d0.png

组合逻辑决策优先级

SystemVerilog对if-else-if决策序列和case语句的语义是:按顺序计算一系列选择-只执行第一个匹配的分支。这种行为使得表示优先级编码逻辑成为可能,即其中一种选择优先于另一种选择。下面的代码片段演示了一个以if-else-if决策链建模的4-2优先级编码器,其中高阶位优先于低阶位。

56e762e6ffb3daebf38b14867a24aa1b.png

同样的优先级编码器也可以通过使用case语句来建模。(下例使用了一种称为reverse case语句的编码风格)。

933056746d85def7c2a8541ee6050b86.png

if-else-if示例和case语句示例在功能上相同,并将综合为等效的门级电路。

从case语句中删除不必要的优先编码

上面的优先级编码器示例取决于if-else-if决策和case语句的优先级评估流程。然而,大多数决策序列并不依赖于这种仿真语义,即按照决策选项的列出顺序对其进行评估。有限状态机(FSM)的独热码状态解码器说明了这一点,每一个单次值都是唯一的。因此,case选项是相互排斥的——没有两个case选项可以同时为真。对于互斥的case选项, case选项的顺序无关紧要,case语句的优先级性质也无关紧要。

下面的示例显示了一个简单的独热码状态机解码器,独热码编码在枚举类型标签的文本值中。

4feb6008831fa2ac333f39c6faedc9f7.png

综合编译器优化case语句优先级。在将RTL case语句转换为门级实现时,综合编译器将在需要时保留优先级编码的求值,例如前面显示的BCD示例。然而,当case选项相互排斥时,综合编译器将自动删除优先级编码,并创建并行逻辑来评估case选项。与优先级编码电路相比,并行电路速度更快,所需要的门数更少。

unique和unique0的决策修饰符

在一些罕见的情况下,不需要对case语句进行隐式优先级编码,但综合编译器无法静态地确定case选项在所有条件下都是互斥的,当这种情况发生时,综合编译器将在门级实现中保留优先级编码逻辑,以备不时之需。这种情况通常发生在以下情况之一:

  • case选项表达式使用通配符位。 case-inside决策允许使用通配符位,因为这些位可以是任何值,所以case表达式可能匹配多个case项。

  • 如果case选项表达式使用变量,则综合是一个静态编译过程,因此无法确定变量的值是否永远不会重叠。

例7-3是一个reverse case语句,其中case项是具有一个变量的独热码。

示例7-3:具有优先级编码逻辑(部分代码)的状态解码器
//`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
module case_with_priority_decode
(input  logic [2:0] current_state,
 output logic       get_ready, get_set, get_going
);

  typedef enum logic [2:0] {READY= 3'b001,
                            SET  = 3'b010,
                            GO   = 3'b100} states_t;
  
  always_comb begin 
    {get_ready, get_set, get_going} = 3'b000;
    case (1'b1)
      current_state[0]: get_ready = '1;
      current_state[1]: get_set   = '1;
      current_state[2]: get_going = '1;
    endcase 
  end 

endmodule: case_with_priority_decode
//`end_keywords

设计者可能知道current_state使用独热码,因此case项是互斥的。然而,综合编译器不能静态地确定当前状态变量的值在所有情况下都是互斥的。因此,综合器将使用优先级编码逻辑实现这一独热码解码器。case语句不会被自动优化为并行计算。图7-3显示了综合这种reverse case的结果。

图7-3:例7-3的综合结果:具有优先级的case语句 55a908629b6d0e813bb311546453295f.png

因为综合编译器无法识别current_state变量只会有一个单独的值,因此,case项是互斥的。

unique的决策参数。当综合无法自动检测到case项值是互斥的时,设计工程师需要通知综合编译器,case项之间确实是唯一的。这可以通过在case关键字之前添加一个unique的决策修饰符来实现,如下例所示:

示例7-4:具有unique并行编码逻辑的状态解码器
//`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
module case_with_unique0_decode
(input  logic [2:0] current_state,
 output logic       get_ready, get_set, get_going
);

  typedef enum logic [2:0] {READY= 3'b001,
                            SET  = 3'b010,
                            GO   = 3'b100} states_t;
  
  always_comb begin 
    {get_ready, get_set, get_going} = 3'b000;
    unique0 case (1'b1)
 //   unique case (1'b1)                          // work-around if unique0 not supported
      current_state[0]: get_ready = '1;
      current_state[1]: get_set   = '1;
      current_state[2]: get_going = '1;
    endcase 
  end 

endmodule: case_with_unique0_decode
//`end_keywords

图7-4显示了综合该示例的结果。

a2db525f57f2e9bf26bb6c00d480491b.png图7-4:示例7-4的综合结果:使用unique

使用unique会指示综合编译器可以并行计算case项。与图7-3所示的优先级实现相比,这显著减少了该独热码解码器的门数和传播路径的数量。

对于综合,unique修饰符表示每个case项表达式都将具有互斥的“唯一”值,因此门级实现可以并行计算case项,unique修饰符进一步通知综合,在case状态中未使用的任何案例表达式值,可以忽略不计。但在某些设计中,这可能会触发综合优化,从而减少门数和传播路径。

对于仿真,unique支持运行时错误检查。如果出现以下情况,将报告违规信息:

  • 绝不会有多个case 项表达式同时为true

  • 出现的每个case表达式值都有一个分支。

最佳实践指南7-9
只有在确定综合逻辑优化效果是理想的情况下,才能使用unique的决策修饰符。

大多数情况下,不需要也不应该在case语句中使用unique 决策修饰符——unique修饰符可能会导致综合优化,这在许多设计中可能并不可取。

示例7-3和7-4中所示的reverse case语句编码风格是综合编译器需要决策修饰符以实现最佳结果质量(QoR)的少数例外之一。

unique0决策修饰符

SystemVerilog-2009添加了一个unique0决策修饰符。与unique一样,unique0决策修饰符通知综合编译器,每个case项表达式都有一个排斥的、唯一的值,在门级实现之前,可以并行计算case项,但与unique不同,unique0修饰符不会通知综合忽略case语句中未使用的case表达式值。

对于仿真,unique0决策修饰符只支持运行时错误检查,以确保不存在多个case项表达式同时为真。如果对case语句进行了计算,并且没有匹配的case项,则不会出现运行时违规消息。

最佳实践指南7-10
在RTL模型中使用unique的决策修饰符。不要使用unique0决策修饰符。unique0修饰符在 未来可能会被推荐使用,但在本文撰写时,一些仿真器和大多数综合编译器不支持unique0。

过时的parallel_case 综合注释

(pragma就是为了让编译器编译出的程序与机器硬件和操作系统保持完全兼容而定义的宏扩展)

SystemVerilog在最初的Verilog语言中添加了unique和unique0的决策修饰符。在传统的Verilog中,设计工程师告诉综合编译器所有case项都可以被视为互斥的唯一方法是通过parallel_case的synthesis pragma语句。synthesis pragma是以synthesis一词开头的特殊注释。仿真器会忽略注释,但综合编译器会对这些专用的synthesis pragma进行操作。

case(<case expression)//synthesis parallel_case
笔记
在写本文的时候,一个商业综合编译器并不认为// synthesis是综合注释。该编译器要求pragma以// pragma或// synopsys开头。

警告-使用注释向综合编译器提供指令存在危险。Parallel_case之类的注释可以对case语句的门级实现产生重大影响。这些效果在仿真中无法验证!对于仿真器来说,综合注释不过是一种注释。RTL级别的设计验证不是验证与门级实现相同的功能。

unique和unigue0决策修饰符取代了parallel_case综合注释——这些决策修饰符是语言的活跃部分,而不是以注释出现。

  • unique0 case在综合中的效果与parallel_case相同,此外,unique0支持运行时仿真检查,确保每次计算case语句时,case表达式最多只匹配一个case项(如果case表达式不匹配任何case项,则不是错误)。

  • unique case在综合中的效果与两个综合注释相同, parallel_case和full_case。unique修饰符允许运行时仿真检查,即在每次计算case语句时,case表达式正好与一个case项相匹配。

最佳实践指南7-11
不要使用过时的parallel_case综合注释!

综合编译器非常擅长自动检测case语句何时可以作为并行解码器实现,而不影响设计功能,在极少数情况下,需要告知综合编译器使用并行实现时,请使用unique决策修饰符。unique决策修饰符通知综合编译器,case项可以像parallel_case综合注释一样被视为互斥的,但决策修饰符添加了仿真运行时检查,以帮助检测RTL仿真期间case项并行解码的潜在问题。

(unique0 决策修饰符更准确地描述了parallel_case综合注释,但本文不建议使用unique0,因为在编写本文时,大多数综合编译器都不支持它。)

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

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

相关文章

四点流程做好商机管理

企业想做好商机管理&#xff0c;仅凭员工是做不到的&#xff0c;借助CRM销售管理系统是比较明智的选择。接下来小编从客户信息管理、业务进程跟踪、设置提醒、销售漏斗等方面讲讲企业如何做好商机管理。 只有提高商机的转化率&#xff0c;企业的利润才会增长。想做好商机管理&…

MySQL 索引事务 · 讨论适合索引的数据结构 · N叉搜索树 · B+树 · 聚簇索引与非聚簇索引 · 事务的四个核心特性

一、索引1.1 概念1.2 作用1.3 讨论-如何提高查询的速度合适的数据结构&#xff1a;二叉搜索树AVL 树红黑树哈希表以上数据结构的问题&#xff1a;N 叉搜索树B 树B 树1.4 索引的使用场景1.5 索引的使用1.6 聚簇索引与非聚簇索引聚簇索引非聚簇索引1.7 索引 - 小结二、事务2.1 为…

小程序-会议OA项目-首页

目录 一&#xff0c;flex弹性布局 什么是flex布局&#xff1f; flex属性 flex-direction属性 学习地址&#xff1a; OA项目搭建以及flex布局演示 二&#xff0c;轮播图--组件的使用 1.先去官方文档中查看轮播图组件如何使 2.在开发工具中查看演示及修改代码 3. 使用mock…

异步通信技术AJAX | 基于JSON、XML的数据交换

目录 一&#xff1a;快速搞定AJAX&#xff08;第二篇&#xff09; 1、JS中如何创建和访问JSON对象 2、基于JSON的数据交换&#xff08;重点&#xff09; 3、基于XML的数据交换&#xff08;了解&#xff09; 一&#xff1a;快速搞定AJAX&#xff08;第二篇&#xff09; 1、…

-source1.5中不支持diamond运算符解决办法

写了几年代码了&#xff0c; 回到最初了遇到了bug了&#xff0c;没有仔细思考&#xff0c;以为很容易&#xff0c;起始走到了误区&#xff0c;有种打了一辈子鹰&#xff0c;最后被麻雀啄了眼 de 感觉 首先来看一下我们的错误信息&#xff0c;如下&#xff1a; [ERROR] Failed…

相机标定笔记(2) -- 标定实践

标定板 为什么需要标定板? 相机标定的第一篇笔记中提到了相机标定所使用的模型&#xff0c;标定算法中我们需要一些可靠的样本点&#xff0c;这些样本点由世界坐标系中的3D点和其在图像上的2D像点组成。用这些2D和3D点对来求解标定参数。为了构建更高精度的3D和2D点&#xff0…

对于系统架构来说,要么进化,要么死亡

在亚马逊云科技年度re:Invent&#xff0c;亚马逊首席技术官Dr. Werner Vogels的主题演讲历来涵盖大量科学和技术领域&#xff0c;今年的演讲也不例外&#xff0c;座无虚席。现在&#xff0c;亚马逊云科技 2022 re:Invent 中国区 recap 正式也开始了&#xff0c;欢迎大家积极参与…

单例模式之饿汉模式懒汉模式

前言 单例模式能保证某个类在程序中只存在唯一一份实例&#xff0c;而不会创建出多个实例&#xff0c;比如 JDBC 中的 DataSource 实例就只需要一个。单例模式具体的实现方式有"饿汉" 和 "懒汉" 两种。 1.饿汉模式&#xff08;类加载的同时创建实例&…

SOLIDWORKS装配体如何快速导出BOM丨慧德敏学

BOM作为产品数据的组成部分&#xff0c;它的重要性不言而喻。采购需要BOM、成本核算需要BOM、领料加工和装配需要BOM、录入ERP需要BOM……可以说&#xff0c;BOM与图纸同样重要&#xff0c;有些产品&#xff0c;可以没有图纸&#xff0c;但是不能没有BOM。借助SOLIDWORKS BOM插…

带你打开C语言的大门

最近有刚开始学习编程的同学问我&#xff1a;“C语言是什么&#xff1f;C语言是怎么来的&#xff1f;C语言用来干什么&#xff1f;”。对&#xff0c;在学习C语言之前&#xff0c;首先了解C语言的发展例程&#xff0c;这应该是每一个刚刚开始学习C语言的人应该了解的&#xff0…

什么是"文件表项"

从Linux的层次角度来说&#xff0c;在用户空间是存在这样的概念的&#xff0c;这个概念是存在内核空间的&#xff0c;而且是针对打开的文件的&#xff01; 内核用三种数据结构来描述一个打开的文件。 数据结构一: 文件描述符表(descriptor table): 每个进程都有它独立的描述符表…

【代码调试】《FSCE: Few-Shot Object Detection via Contrastive Proposal Encoding》

论文地址&#xff1a;https://arxiv.org/pdf/2103.05950.pdf 代码地址&#xff1a;https://github.com/megvii-research/FSCE 论文阅读&#xff1a;https://blog.csdn.net/qiankendeNMY/article/details/128390284 我的配置&#xff1a; Python &#xff1a;3.8(ubuntu18.04) …

小程序发布体验版流程

一、微信开发者工具操作 1. 点击 工具 -> 上传&#xff08;或 直接点击右上角“上传”按钮&#xff09; 【注意】 如果使用的测试 appid 则【上传】按钮不能点击&#xff0c;必须使用真实 appid 2. 如果之前有发布过体验版&#xff0c;会提示继续操作将会覆盖之前的体验版…

MyBatisPlus ---- 基本CRUD

MyBatisPlus ---- 基本CRUD1. BaseMapper2. 插入3. 删除a>通过id删除记录b>通过id批量删除记录c>通过map条件删除记录4. 修改5. 查询a>根据id查询用户信息b>根据多个id查询多个用户信息c>通过map条件查询用户信息d>查询所有数据6. 通用Servicea>IServi…

RK3588平台开发系列讲解(Display篇)开机视频的设置

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、开机视频功能介绍二、使用方法2.1、开启与关闭2.2、视频放置位置2.3、编译结果2.4、视频素材要求2.5、参数控制说明沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍RK3588平台开机视频的使用方法…

ARM64内存虚拟化分析(7)stage2异常处理

当虚拟机访问内存或虚拟机访问寄存器时&#xff0c;由于并没有分配真实的物理地址&#xff0c;并没有建立stage2映射&#xff0c;因此这两种情况会产生stage2异常处理&#xff0c;其中第一种情况为真实的stage2缺页&#xff0c;第二种情况为MMIO处理。同时如果在stage2产生外部…

零膨胀负二项回归案例分析

零膨胀负二项回归分析 计数研究模型中&#xff0c;常用泊松回归模型&#xff0c;但泊松回归模型理论上是要求平均值与标准差相等&#xff0c;如果不满足&#xff0c;则可使用负二项回归模型&#xff0c;负二项回归放宽了平均值标准差这一理论假定。 在实际研究中&#xff0c;…

网络协议类型

网络协议是一组规则、约定和数据结构&#xff0c;用于规定设备如何跨网络交换数据。换句话说&#xff0c;网络协议可以等同于两个设备必须理解的语言&#xff0c;以实现信息的无缝通信&#xff0c;无论其基础设施和设计差异如何。 OSI 模型&#xff1a;网络协议的工作原理 要…

Oracle数据库安装配置详细教程汇总(含11g、12c、18c、19c、21c)

不论你是数据库小白&#xff0c;还是久经沙场的技术专家&#xff0c;你接触和运维Oracle数据库的第一步可能都是安装配置。并且随着软硬件的升级、替换以及业务场景的变化&#xff0c;数据库安装也将是你常常会进行的操作之一。 这里先为大家附上Oracle各版本支持的生命周期及…

阶段性回顾(2)

1. 移位操作符的对象只能是整数&#xff0c;只能对整数的二进制位进行移动。 2. 二进制是数值的一种表示形式。一个整数占了四个字节&#xff0c;相当于一个整数可以用32位二进制位序列表示&#xff0c;那么这时候该如何判断正负呢?规定&#xff1a;这32位二进制序列的头一位如…