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

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

3天内不再提示

决策语句允许程序块的执行流程

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-10-27 08:57 次阅读

数字硬件建模SystemVerilog-决策语句-case语句

经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式和运算符。

马上HDLBits-SystemVerilog版本也开始准备了,基本这一部分完成后就开始更新~

36d86312-5591-11ed-a3b6-dac502259ad0.png

决策语句(Decision statements)允许程序块的执行流程根据设计中信号的当前值分支到特定语句。SystemVerilog有两个主要的决策语句:if…else语句和case语句,使用关键字case、case…inside,casex和casez。

介绍

case语句提供了一种简洁的方式来表示一系列决策选择。例如:

36f4db8c-5591-11ed-a3b6-dac502259ad0.png

SystemVerilog case语句与C switch语句类似,但有重要区别。SystemVerilog不能使用break语句(C使用break从switch语句的分支退出)。case语句在执行分支后自动退出(使用break退出case语句是非法的。),不能执行break语句。

SystemVerilog有4种不同的case语句,关键字为case、case…inside casex和casez。这些不同case语句的一般语法和用法是相同的。这些区别将在本文后面介绍。

case、casex或casez关键字后面跟一个用括号括起来的case表达式。case表达式可以是网络、变量、用户定义类型、参数常量、文字值或运算结果。case表达式后面跟一个冒号,如果case表达式与case项匹配,后续执行是可以是一条语句或者begin-end包含的系列语句。

默认case项。可以使用default关键字指定可选的默认case项。如果case表达式与任何case项不匹配,将执行默认case项。在上面的例子中,case项覆盖了2位操作码的所有可能的2-state值。但是,如果操作码是4-state类型,则会有额外的X和Z值未被case项覆盖。如果操作码的任何位都是X或Z,则将执行默认case项,在前面的示例中,该分支将把X值传播到结果变量上。默认情况下的case项不需要是最后一个case项。语法上,默认case项可以是第一个case项,或者在case项中的任何地方,代码可读性的最佳实践编码风格是默认case项为最后一个case项。

以逗号分隔的case项列表。case项可以是逗号分隔的列表,如以下代码段所示:

370b0c2c-5591-11ed-a3b6-dac502259ad0.png

如果操作码的值为2’b00或2’b01,则执行case语句的第一个分支,如果值为2’b10或2’b11,则执行第二个分支。

case与case…inside

当只使用case关键字时, case表达式将与case项进行比较,比较的运算符为(===)。(===)运算符将比较表达式的每一位,这将获得4-state值的精确匹配。在下面的代码段中,如果select的值为1’bz,则执行第三个分支,如果select的值为1’bx,则执行第四个分支(此示例不可综合;综合不允许比较X和Z值)

37423d32-5591-11ed-a3b6-dac502259ad0.png

在case…inside语句中,使用(==?)通配符case相等运算符的行为将case表达式与case项进行比较(case使用===运算符)。(==?)运算符允许从比较中屏蔽某一位(即不进行某一位的比较)。case项中的任何位被设置为x或z或?当case表达式与case项进行比较时,该位位置将被忽略。

在以下示例中,如果selector的最高有效位置1,将执行第一个分支,忽略case项的所有剩余位,如果selector的上两位的值为01,将执行第二个分支,并忽略剩余位,依此类推:

376460a6-5591-11ed-a3b6-dac502259ad0.png

过时的casex和casez语句

在SystemVerilog于2005年扩展Verilog语言之前,最初的Verilog语言使用casex和casez关键字来屏蔽比较中的位。SystemVerilog将casex和casez替换为case…inside关键字。casex和casez语句屏蔽了设置为x、z或?的任何位。Casez语句仅屏蔽设置为z或?的位

最佳实践指南6-2
用case…inside在决策语句中忽略case项中的特定位。不要使用过时的casex和casez语句。

SystemVerilog取代casex和casez的原因是,它们在仿真时存在严重缺陷,在综合逻辑门后,其行为与RTL仿真非常不同。简而言之,casex和casez不仅允许在case项中屏蔽位,还允许在case表达式中屏蔽位,这种双重掩蔽可能会导致执行一个非预期的分支,而这可能不是由综合创建的门级电路实现时采用的同一个分支。casex和casez的缺点在本系列文章中没有详细讨论,因为没有必要使用这些过时的语句。

case项优先级和综合优化

case项按其列出的顺序进行评估。因此,第一个case项的优先级高于所有后续case项。在评估case语句时,仿真将始终遵循此优先级。

这种推断出的优先级编码在ASICFPGA实现中通常是不可取的。与并行计算相比,优先级编码逻辑需要更多的逻辑门和更长的传播路径。在将case语句转换为逻辑门之前,综合编译器将分析case项的值。如果两个case项不可能同时为真,则综合编译器将自动优化门级实现,以并行评估case项,而不是作为优先级编码功能。

然而,如果两个或多个case项可能同时为真,那么综合将实现case语句仿真中固有的优先级编码逻辑。通过实施优先级编码,综合时将确保ASIC或FPGA的门级行为与RTL仿真行为匹配。

例6-5显示了一个4选1的多路复用器。在本例中,四个case表达式具有唯一的、不重叠的值。综合器将识别到两个case表达式不可能同时为真,并自动删除case项的优先级编码。图6-5显示了综合器如何实现case语句。

示例6-5:使用case语句对4选1多路复用器建模

//`begin_keywords"1800-2012"//useSystemVerilog-2012keywords
modulemux4to1
#(parameterN=8)
(
inputlogic[N-1:0]a,b,c,d,
inputlogic[1:0]select,
outputlogic[N-1:0]y
);

always_combbegin
case(select)
2'b00:y=a;
2'b01:y=b;
2'b10:y=c;
2'b11:y=d;
endcase
end
endmodule:mux4to1
//`end_keywords
379301b8-5591-11ed-a3b6-dac502259ad0.png 图6-5:示例6-5的综合结果:综合4选1多路复用器的case语句

例6-5中的case项是互斥的,这意味着其中两个case项不可能同时成立。因此,综合编译器删除了case语句的优先级编码行为,并以多路复用器的形式对case项实现了更高效的并行计算,

综合编译器自动删除优先级逻辑,只要综合可以确定所有case项都是互斥的(不会有两个或多个case项同时计算结果为true)。如果综合编译器不能确定case项是互斥的,那么它将保留case项的优先级方式。

示例6-6类似于示例6-3中所示的4选2优先级编码器,但这次使用case…inside,只允许检查4位d_in值中的特定位。由于忽略了其他位,因此可能存在不止一个位case项同时为true,仿真将执行第一个匹配分支,综合编译器将通过“保留case语句固有的优先级编码”来匹配该行为。

示例6-6:使用内部的case项来仿真优先级编码器

//`begin_keywords"1800-2012"//useSystemVerilog-2012keywords
modulepriority_4to2_encoder(
inputlogic[3:0]d_in,
outputlogic[1:0]d_out,
outputlogicerror
);
timeunit1ns;timeprecision1ns;

always_combbegin
error='0;
case(d_in)inside
4'b1???:d_out=2'h3;//bit3isset
4'b01??:d_out=2'h2;//bit2isset
4'b001?:d_out=2'h1;//bit1isset
4'b0001:d_out=2'h0;//bit0isset
4'b0000:begin//nobitsset
d_out=2'b0;
error='1;
end
endcase
end
endmodule:priority_4to2_encoder
//`end_keywords

37c3aea8-5591-11ed-a3b6-dac502259ad0.png 图6-6:示例6-6的综合结果:case…inside作为优先编码器

优先级逻辑的效果可以在一系列门电路中看到,d_in的不同位通过这些门传播。当使用一系列if-else-if语句时,综合编译器综合出来的电路非常相似,如上一章节的例程。

唯一和优先决策修饰符

SystemVerilog为case和if-else决策语句提供三个修饰符:unique、unique0和priority。后面章节将详细讨论RTL模型中使用的修饰符。

简而言之,unique、unigue0和priority修饰符有两个功能:

它们影响综合编译器在门级电路实现case语句的方式。

他们在仿真中将会报告警告消息,帮助验证综合效果是否会按预期工作。

这些决策修饰符的一个示例用法是:

37ef2cf4-5591-11ed-a3b6-dac502259ad0.png

对于综合,本例中的unique修饰符通知综合编译器case语句可以被认为是完整的,即使2位状态变量的四个可能值中只有三个被解码。同时还通知综合编译器,对case项并行评估是可以的。

对于仿真,unique关键字在仿真中启用两个检查例程,如果对case语句进行了评估,并且state的值与任何case项都不匹配,则将生成违规报告。此检查有助于验证将case语句视为完整的综合是否安全。如果state的值同时与多个案例项匹配,则还会生成违规报告。该检查有助于验证对case项并行评估是安全的,而不是按照case项列出的顺序,

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

    关注

    11

    文章

    2922

    浏览量

    64816
  • HDL
    HDL
    +关注

    关注

    8

    文章

    323

    浏览量

    47104
  • 编码
    +关注

    关注

    6

    文章

    835

    浏览量

    54457
  • RTL
    RTL
    +关注

    关注

    1

    文章

    377

    浏览量

    59069

原文标题:SystemVerilog-决策语句-case语句

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

收藏 人收藏

    评论

    相关推荐

    Verilog中的always内的语句执行的速度?

    Verilog中的always内的语句执行的速度是什么样的,如果always是时钟上升沿触发的,会不会
    发表于 10-29 22:30

    begin ...... end 与 fork ...... join 语句的 区别 ------ 转载

    ; end_wave; //语句5,触发事件end_wave join并行执行特点为: 并行语句内各条
    发表于 06-02 21:31

    如何解决if条件判断为真但不执行if语句的问题

    关于if条件判断为真但不执行if语句的问题,我一直也还不是很清楚是什么原因造成的。在网上查看了一些网友的评论但回答也不是非常的准确,或者说每个人遇到的情况都略有不同。我是在调试开发板的时候遇到两类
    发表于 12-15 08:24

    mfc程序执行流程小结,MFC程序执行顺序

     摘要:本文章主要以MFC程序执行流程执行顺序等执行过程的剖析做出的结论,下面一起来看看原文的具体介绍。
    发表于 12-08 15:48 9222次阅读
    mfc<b class='flag-5'>程序</b><b class='flag-5'>执行</b><b class='flag-5'>流程</b>小结,MFC<b class='flag-5'>程序</b>的<b class='flag-5'>执行</b>顺序

    51单片机的程序执行流程是怎么样的

    单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。若不是硬件特性已定的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个
    发表于 08-19 17:31 2次下载
    51单片机的<b class='flag-5'>程序</b><b class='flag-5'>执行</b><b class='flag-5'>流程</b>是怎么样的

    51单片机的程序执行流程详细资料说明

    单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。若不是硬件特性已定的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个
    发表于 06-24 17:43 1次下载
    51单片机的<b class='flag-5'>程序</b><b class='flag-5'>执行</b><b class='flag-5'>流程</b>详细资料说明

    select语句和update语句分别是怎么执行

    最近有粉丝面试互联网公司被问到:你知道select语句和update语句分别是怎么执行的吗?,要我写一篇这两者执行SQL语句的区别,这不就来
    的头像 发表于 11-03 09:41 3228次阅读
    select<b class='flag-5'>语句</b>和update<b class='flag-5'>语句</b>分别是怎么<b class='flag-5'>执行</b>的

    51单片机程序执行流程详细分析

    单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。若不是硬件特性已定的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个
    发表于 11-11 20:21 9次下载
    51单片机<b class='flag-5'>程序</b><b class='flag-5'>执行</b><b class='flag-5'>流程</b>详细分析

    systemverilog的决策语句if…else语句介绍

    决策语句(Decision statements)允许程序块的执行流程根据设计中信号的当前值分支
    的头像 发表于 10-21 08:58 2249次阅读

    RTL表达式和运算符

    决策语句(Decision statements)允许程序块的执行流程根据设计中信号的当前值分支
    的头像 发表于 10-21 09:04 1000次阅读

    SCL用GOTO语句执行程序跳转

    用GOTO语句能够执行程序跳转。此引起立即跳转到指定标号,为此而到同块中不同的语句
    的头像 发表于 02-01 09:22 1957次阅读

    什么是SystemVerilog-决策语句-if-else语句

    决策语句(Decision statements)允许程序块的执行流程根据设计中信号的当前值分支
    的头像 发表于 02-09 14:15 677次阅读
    什么是SystemVerilog-<b class='flag-5'>决策</b><b class='flag-5'>语句</b>-if-else<b class='flag-5'>语句</b>?

    简述SQL更新语句执行流程1

    之前我们讲过了一条SQL查询语句是如何执行的,那么插入(INSERT)、更新(UPDATE)和删除(DELETE)操作的流程又是什么样子呢? 其实对于MySQL而言,只有两种通常意义的操作
    的头像 发表于 02-14 15:40 436次阅读
    简述SQL更新<b class='flag-5'>语句</b>的<b class='flag-5'>执行</b><b class='flag-5'>流程</b>1

    简述SQL更新语句执行流程2

    之前我们讲过了一条SQL查询语句是如何执行的,那么插入(INSERT)、更新(UPDATE)和删除(DELETE)操作的流程又是什么样子呢? 其实对于MySQL而言,只有两种通常意义的操作
    的头像 发表于 02-14 15:40 360次阅读
    简述SQL更新<b class='flag-5'>语句</b>的<b class='flag-5'>执行</b><b class='flag-5'>流程</b>2

    WHILE语句如何执行

    令“FOR”、“WHILE”和“REPEAT-UNTIL”的运行:由于系统不显示这些指令中的变量值,因此可避免对循环时间造成影响。 WHILE允许执行条件控制的循环地执行语句序列。
    的头像 发表于 09-10 09:48 501次阅读
    WHILE<b class='flag-5'>语句</b>如何<b class='flag-5'>执行</b>