0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

组合逻辑决策优先级介绍

OpenFPGA 来源:OpenFPGA 2022-12-29 11:07 次阅读

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

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

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

组合逻辑决策优先级

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

69a92308-871e-11ed-bfe3-dac502259ad0.png

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

69d13be0-871e-11ed-bfe3-dac502259ad0.png

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

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

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

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

69da1c06-871e-11ed-bfe3-dac502259ad0.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"//useSystemVerilog-2012keywords
modulecase_with_priority_decode
(inputlogic[2:0]current_state,
outputlogicget_ready,get_set,get_going
);

typedefenumlogic[2:0]{READY=3'b001,
SET=3'b010,
GO=3'b100}states_t;

always_combbegin
{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语句

69f5438c-871e-11ed-bfe3-dac502259ad0.png

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

unique的决策参数

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

示例7-4:具有unique并行编码逻辑的状态解码器

//`begin_keywords"1800-2012"//useSystemVerilog-2012keywords
modulecase_with_unique0_decode
(inputlogic[2:0]current_state,
outputlogicget_ready,get_set,get_going
);

typedefenumlogic[2:0]{READY=3'b001,
SET=3'b010,
GO=3'b100}states_t;

always_combbegin
{get_ready,get_set,get_going}=3'b000;
unique0case(1'b1)
//uniquecase(1'b1)//work-aroundifunique0notsupported
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显示了综合该示例的结果。

6a1e7c34-871e-11ed-bfe3-dac502259ad0.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(

笔记
在写本文的时候,一个商业综合编译器并不认为// 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,因为在编写本文时,大多数综合编译器都不支持它。)






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码器
    +关注

    关注

    41

    文章

    3360

    浏览量

    131537
  • 锁存器
    +关注

    关注

    8

    文章

    744

    浏览量

    41037
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8159
  • 门级电路
    +关注

    关注

    0

    文章

    15

    浏览量

    1932

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

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [转] STN32抢占优先级与副优先级及中断优先级NVIC理解

    首先来说说两个概念,1、NVIC的优先级概念 抢占式优先级 (pre-emption priority): 高占先式优先级的中断事件会打断当前的主程序/中断程序运行— —抢断式优先响应
    发表于 04-15 14:14

    CC1310rtos里面,优先级定义时,是1的优先级高还是2的优先级高?

    CC1310rtos里面,优先级定义时,是1的优先级高还是2的优先级高?
    发表于 06-21 10:12

    如何保证任务优先级的高低?

    往里面加任务 ,加入 我这个任务高优先级 怎么保证不影响 四轴一些比较低优先级但又必须执行任务的执行时间。因为我看视频freertos主要都是单个例子 多个 怎么组合。。有点困惑
    发表于 07-22 04:35

    Bug之逻辑运算符优先级分享!

    发现原来是运算符优先级的问题;看下面的图可以知道,==的优先级高于 & ,再看上面那段代码。。。发现了什么。。。。。。。天呐,,,可把我害苦了。。这也告诉我们,如果对优先级不全熟悉的话,那么尽量加括号来限制
    发表于 10-28 20:31

    任务优先级问题

    优先级的任务可以通过时间片轮转调度来实现任务切换。在不同优先级的任务中,如果高优先级的任务没有延时,没有等待信号量等使用任务调度的内核对象的话,是否高优先级任务就会一直占用CPU而导
    发表于 04-02 04:35

    优先级判断STM32

    一:综述STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因
    发表于 08-13 06:50

    stm32的中断优先级基本原理介绍

    stm32的中断具有不同的优先级,可以使用NVIC(嵌套向量中断控制器,Nested Vectored Interrupt Controller)来控制。 一、基本原理介绍 stm32的中断优先级
    发表于 08-13 08:46

    【STM32】中断和中断优先级理解 精选资料推荐

    详细介绍中断、中断优先级、中断优先级组、抢占优先级和响应优先级概念。
    发表于 08-16 07:50

    NVIC中断优先级管理与中断优先级分组

    NVIC中断优先级管理中断优先级分组:STM32F407系列把中断分为5个组:(0~4)对0-4每个中断设置一个抢占优先级和响应优先级值(值越小优先
    发表于 08-16 08:06

    中断优先级的基本规则

    单片机芯 片: STC12C5A60S2 晶振是11.0592MHZ中断优先级的基本规则1.低优先级中断可被高优先级中断所中断2.任何中断都不被同级中断所中断然而datashhet里
    发表于 11-25 06:32

    什么是先占优先级和从优先级

    什么是先占优先级和从优先级
    发表于 12-13 07:00

    如何正确设置中断优先级

    优先级范围从0x00~0xFF), 是绝大多数微控制器制造商只是使用其中的一部分优先级NXP 1062 使用了其中的高4bits,所以中断优先级在0-15,共16个在Cortex-M内核中,一个中断的
    发表于 12-16 07:08

    cortex M抢占优先级和子优先级有什么用

    Cortex M内核中每个中断都有一个8位的优先级设置寄存器这个8位的寄存器可以分为抢占优先级和子优先级两个部分(通过设置优先级组设置)抢占优先级
    发表于 01-25 06:07

    FreeRTOS中断优先级和任务优先级架构的相关资料推荐

    FreeRTOS中断优先级和任务优先级架构:Cortex-M3版本:FreeRTOS V9.0.0前言:最开始,我并没有搞清楚什么是中断优先级和任务优先级,但看了部分资料后发现这两个并
    发表于 02-08 06:36

    优先级参数配对组合测试集生成策略

    在参数组合测试的实际应用中,时间或预算等原因可能导致无法运行整个测试集,造成重要测试案例的漏执行。该文引用优先级权值的思想为测试案例设置优先级介绍2种生成有序
    发表于 04-18 08:47 10次下载